title: SpringCloud学习笔记二:Ribbon
date: 2020-04-30 16:13:51
tags:

  • SpringCloud
  • Ribbon
    categories: SpringCloud
    toc_number: true

Load balancing(LB),主要用于分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
现实生活中最常见的例子就是多条队伍排队,后来的人会比较一下各条队伍,选择达到目的地相对较快的队伍。(消费者负载均衡
可以使用硬件(F5)、软件(HAProxy)等实现,本文使用能够无缝整合Eureka的Ribbon
首先描述一下项目的基础:
我们需要有一个Eureka Server用以服务注册;至少三个Eureka Client注册到同一个Eureka Server,其中一个消费者,两个生产者。

生产者配置

两个生产者应保证项目内容一致(instance-id及端口号等配置不同)

  1. server:
  2. port: 8001
  3. spring:
  4. application:
  5. name: micro-client
  6. eureka:
  7. client:
  8. fetch-registry: true # 是否去注册中心获取其他注册模块信息
  9. service-url:
  10. defaultZone: http://eurekaserver01.com:7001/eureka,http://eurekaserver02.com:7002/eureka,http://eurekaserver03.com:7003/eureka # 注册中心地址
  11. instance:
  12. instance-id: micro-client:8001 # 本服务实例信息
  13. prefer-ip-address: true # 将服务IP注册到注册中心

暴露接口:

  1. @RestController
  2. @RequestMapping(value = "/api/index")
  3. public class IndexController {
  4. @Value("${eureka.instance.instance-id}")
  5. private String ipAdress;
  6. @Value("${server.port}")
  7. private String port;
  8. @GetMapping(value = "/getMsg")
  9. public String getMsg() {
  10. return "Hello," + ipAdress + ":" + port;
  11. }
  12. }

消费者配置

添加Ribbon依赖

  1. <!-- Ribbon -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  5. </dependency>

Eureka中已内置了Ribbon依赖,因此,可省略。

添加代码配置

  1. @EnableEurekaClient
  2. @SpringBootApplication
  3. public class EurekaClientApplication {
  4. @LoadBalanced // 负载均衡
  5. @Bean(value = "restTemplate")
  6. public RestTemplate restTemplate() {
  7. return new RestTemplate();
  8. }
  9. public static void main(String[] args) {
  10. SpringApplication.run(EurekaClientApplication.class, args);
  11. }
  12. }

远程调用

  1. @RestController
  2. @RequestMapping(value = "/api/consumer")
  3. public class IndexController {
  4. @Autowired
  5. private RestTemplate restTemplate;
  6. public String getMsg() {
  7. return restTemplate.getForObject("http://MICRO-CLIENT/api/index/getMsg", String.class);
  8. }
  9. }

远程调用中使用了生产者的application name(MICRO-CLIENT),不断刷新消费者的接口访问即可查看远程轮询调用

Ribbon原理:

  1. Ribbon根据所在的注册中心选择一个负载较少的Eureka服务器
  2. 定期从Eureka服务器更新,过滤服务实例列表
  3. 根据指定的负载均衡策略(默认轮询),从可用服务实例中选择一个较优的
  4. 使用Rest客户端进行服务调用

源码访问