负载均衡---ribbon

Posted dalaoyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了负载均衡---ribbon相关的知识,希望对你有一定的参考价值。

Ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。

上一篇简单讲解了eureka的使用,这一篇文章基于上一篇的基础上,讲一下springcloud的另一个重要的组件ribbon。

这篇文章需要新建三个工程,service(8762),service(8763),service-ribbon(8764),三个服务分别向eureka-server注册中心注册,本文的服务使用的注册中心都是本人创建的测试eureka--http://eureka.dalaoyang.cn。

首先新建一个service(8762),括号内的8762是项目的端口号,加入eureka依赖,pom文件如下:

 
   
   
 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4.    <modelVersion>4.0.0</modelVersion>

  5.    <groupId>com.dalaoyang</groupId>

  6.    <artifactId>springcloud_service</artifactId>

  7.    <version>0.0.1-SNAPSHOT</version>

  8.    <packaging>jar</packaging>

  9.    <name>springcloud_service</name>

  10.    <description>springcloud_service</description>

  11.    <parent>

  12.        <groupId>org.springframework.boot</groupId>

  13.        <artifactId>spring-boot-starter-parent</artifactId>

  14.        <version>1.5.9.RELEASE</version>

  15.        <relativePath/> <!-- lookup parent from repository -->

  16.    </parent>

  17.    <properties>

  18.        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  19.        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  20.        <java.version>1.8</java.version>

  21.        <spring-cloud.version>Edgware.SR1</spring-cloud.version>

  22.    </properties>

  23.    <dependencies>

  24.        <dependency>

  25.            <groupId>org.springframework.cloud</groupId>

  26.            <artifactId>spring-cloud-starter-eureka</artifactId>

  27.        </dependency>

  28.        <dependency>

  29.            <groupId>org.springframework.boot</groupId>

  30.            <artifactId>spring-boot-starter-test</artifactId>

  31.            <scope>test</scope>

  32.        </dependency>

  33.    </dependencies>

  34.    <dependencyManagement>

  35.        <dependencies>

  36.            <dependency>

  37.                <groupId>org.springframework.cloud</groupId>

  38.                <artifactId>spring-cloud-dependencies</artifactId>

  39.                <version>${spring-cloud.version}</version>

  40.                <type>pom</type>

  41.                <scope>import</scope>

  42.            </dependency>

  43.        </dependencies>

  44.    </dependencyManagement>

  45.    <build>

  46.        <plugins>

  47.            <plugin>

  48.                <groupId>org.springframework.boot</groupId>

  49.                <artifactId>spring-boot-maven-plugin</artifactId>

  50.            </plugin>

  51.        </plugins>

  52.    </build>

  53. </project>

配置文件

 
   
   
 
  1. ##端口号

  2. server.port=8762

  3. ##服务名称

  4. spring.application.name=service

  5. eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/

启动类使用注解@EnableEurekaClient向注册中心注册,代码如下:

 
   
   
 
  1. package com.dalaoyang;

  2. import org.springframework.beans.factory.annotation.Value;

  3. import org.springframework.boot.SpringApplication;

  4. import org.springframework.boot.autoconfigure.SpringBootApplication;

  5. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

  6. import org.springframework.web.bind.annotation.GetMapping;

  7. import org.springframework.web.bind.annotation.RestController;

  8. @SpringBootApplication

  9. @RestController

  10. @EnableEurekaClient

  11. public class SpringcloudServiceApplication {

  12.    public static void main(String[] args) {

  13.        SpringApplication.run(SpringcloudServiceApplication.class, args);

  14.    }

  15.    @Value("${server.port}")

  16.    String port;

  17.    @Value("${spring.application.name}")

  18.    String serviceName;

  19.    @GetMapping("/")

  20.    public String index(){

  21.        return "serviceName=" + serviceName + "-------port=" + port;

  22.    }

  23. }

到这里service(8762)创建完成,然后复制一个项目,端口号改为8763作为service(8763)。

然后新建项目service-ribbon(8764),pom文件加入ribbon依赖,pom完整代码如下:

 
   
   
 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4.    <modelVersion>4.0.0</modelVersion>

  5.    <groupId>com.dalaoyang</groupId>

  6.    <artifactId>springcloud_ribbon</artifactId>

  7.    <version>0.0.1-SNAPSHOT</version>

  8.    <packaging>jar</packaging>

  9.    <name>springcloud_ribbon</name>

  10.    <description>springcloud_ribbon</description>

  11.    <parent>

  12.        <groupId>org.springframework.boot</groupId>

  13.        <artifactId>spring-boot-starter-parent</artifactId>

  14.        <version>1.5.9.RELEASE</version>

  15.        <relativePath/> <!-- lookup parent from repository -->

  16.    </parent>

  17.    <properties>

  18.        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  19.        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  20.        <java.version>1.8</java.version>

  21.        <spring-cloud.version>Edgware.SR1</spring-cloud.version>

  22.    </properties>

  23.    <dependencies>

  24.        <dependency>

  25.            <groupId>org.springframework.cloud</groupId>

  26.            <artifactId>spring-cloud-starter-eureka</artifactId>

  27.        </dependency>

  28.        <dependency>

  29.            <groupId>org.springframework.boot</groupId>

  30.            <artifactId>spring-boot-starter-test</artifactId>

  31.            <scope>test</scope>

  32.        </dependency>

  33.        <dependency>

  34.            <groupId>org.springframework.boot</groupId>

  35.            <artifactId>spring-boot-starter-web</artifactId>

  36.        </dependency>

  37.        <dependency>

  38.            <groupId>org.springframework.cloud</groupId>

  39.            <artifactId>spring-cloud-starter-ribbon</artifactId>

  40.        </dependency>

  41.    </dependencies>

  42.    <dependencyManagement>

  43.        <dependencies>

  44.            <dependency>

  45.                <groupId>org.springframework.cloud</groupId>

  46.                <artifactId>spring-cloud-dependencies</artifactId>

  47.                <version>${spring-cloud.version}</version>

  48.                <type>pom</type>

  49.                <scope>import</scope>

  50.            </dependency>

  51.        </dependencies>

  52.    </dependencyManagement>

  53.    <build>

  54.        <plugins>

  55.            <plugin>

  56.                <groupId>org.springframework.boot</groupId>

  57.                <artifactId>spring-boot-maven-plugin</artifactId>

  58.            </plugin>

  59.        </plugins>

  60.    </build>

  61. </project>

配置文件如下:

 
   
   
 
  1. ##端口号

  2. server.port=8764

  3. ##服务名称

  4. spring.application.name=service_ribbon

  5. eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/

由于只是一个简单demo,所有我将java代码都写在了启动类里面,解释一下,@LoadBalanced放在RestTemplate上面,表明RestTemplate开启负载均衡。代码如下:

 
   
   
 
  1. package com.dalaoyang;

  2. import org.springframework.beans.factory.annotation.Value;

  3. import org.springframework.boot.SpringApplication;

  4. import org.springframework.boot.autoconfigure.SpringBootApplication;

  5. import org.springframework.cloud.client.loadbalancer.LoadBalanced;

  6. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

  7. import org.springframework.context.annotation.Bean;

  8. import org.springframework.web.bind.annotation.GetMapping;

  9. import org.springframework.web.bind.annotation.RestController;

  10. import org.springframework.web.client.RestTemplate;

  11. @SpringBootApplication

  12. @EnableEurekaClient

  13. @RestController

  14. public class SpringcloudRibbonApplication {

  15.    public static void main(String[] args) {

  16.        SpringApplication.run(SpringcloudRibbonApplication.class, args);

  17.    }

  18.    @Bean

  19.    @LoadBalanced

  20.    RestTemplate restTemplate() {

  21.        return new RestTemplate();

  22.    }

  23.    @Value("${server.port}")

  24.    String port;

  25.    @Value("${spring.application.name}")

  26.    String serviceName;

  27.    @GetMapping("/")

  28.    public String index(){

  29.        return restTemplate().getForObject("http://service/",String.class);

  30.    }

  31. }

分别启动service(8762),service(8763),service-ribbon(8764)三个工程。 先查看http://eureka.dalaoyang.cn/,可以看到三个实例注册成功。如下图:

多次访问http://localhost:8764/,可以看到页面交替显示

负载均衡---ribbon

可以看到负载均衡已经做到了。

完整项目流程如下图:

源码下载 :大老杨码云

个人网站:https://dalaoyang.cn


以上是关于负载均衡---ribbon的主要内容,如果未能解决你的问题,请参考以下文章

nacos 负载均衡-Ribbon

05.负载均衡之Ribbon

SpringCloud -- Ribbon负载均衡(负载均衡流程负载均衡原理(探究原码)负载均衡策略懒加载(饥饿加载))

ribbon负载均衡详解

使用 负载均衡器 Ribbon 实现负载均衡

Ribbon-负载均衡策略