目录
  1. 1. Ribbon介绍
  2. 2. 实践
SpringCloud架构--服务调用及客户端负载均衡器Ribbon(第二篇)

Ribbon介绍

Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。Ribbon提供基于规则的负载平衡,它支持循环,响应时间加权和开箱即用的随机负载平衡机制,并可以通过插入不同的规则进一步扩展。其中ribbon-eureka中提供了与基于Eureka的服务发现的集成。

实践

  1. 创建多实例服务提供者
    在第一篇的基础上,再创建一个客户端eurekaClient,端口号改为8763,注册到注册中心。
    启动服务后的结果如下,一个应用2个实例,端口不一样:

  2. 创建一个服务消费者
    新建springboot项目,serviceribbon,端口为8764,并注册到注册中心上,yml配置文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    eureka:
    client:
    serviceUrl:
    defaultZone: http://localhost:8761/eureka/
    server:
    port: 8764
    spring:
    application:
    name: service-ribbon

    导入相关依赖,pom文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>serviceribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>serviceribbon</name>
    <description>Demo project for Spring Boot</description>

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>
    </project>

    在启动类内创建RestTemplate,注入Bean 和LoadBalance :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ServiceribbonApplication {

    public static void main(String[] args) {
    SpringApplication.run(ServiceribbonApplication.class, args);
    }
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
    return new RestTemplate();
    }
    }

    新建service,调用服务提供者提供的服务:

    1
    2
    3
    4
    5
    6
    7
    8
    @Service
    public class HiService {
    @Autowired
    RestTemplate restTemplate;
    public String hiService(String name){
    return restTemplate.getForObject("http://DemoApp/sayHi?name="+name,String.class);
    }
    }

    其中DemoApp是服务提供者注册在eureka中的服务名称。
    新建controller测试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @RestController
    public class HiController {
    @Autowired
    HiService hiService;
    @RequestMapping("/sayHi")
    public String sayHi(@RequestParam String name){
    return hiService.hiService(name);
    }
    }

    访问http://localhost:8764/sayHi?name=张三

    结果为:

    再次刷新,结果为:

    多次刷新,发现,端口号在8762和8763之间不断交替变化,说明ribbon负载均衡器发挥了负载的作用。

文章作者: 李浩
文章链接: https://leehoward.cn/2019/10/18/SpringCloud架构--服务调用及客户端负载均衡器Ribbon(第二篇)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 leehoward
打赏
  • 微信
  • 支付宝

评论