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及端口号等配置不同)
server:port: 8001spring:application:name: micro-clienteureka:client:fetch-registry: true # 是否去注册中心获取其他注册模块信息service-url:defaultZone: http://eurekaserver01.com:7001/eureka,http://eurekaserver02.com:7002/eureka,http://eurekaserver03.com:7003/eureka # 注册中心地址instance:instance-id: micro-client:8001 # 本服务实例信息prefer-ip-address: true # 将服务IP注册到注册中心
暴露接口:
@RestController@RequestMapping(value = "/api/index")public class IndexController {@Value("${eureka.instance.instance-id}")private String ipAdress;@Value("${server.port}")private String port;@GetMapping(value = "/getMsg")public String getMsg() {return "Hello," + ipAdress + ":" + port;}}
消费者配置
添加Ribbon依赖
<!-- Ribbon --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency>
Eureka中已内置了Ribbon依赖,因此,可省略。
添加代码配置
@EnableEurekaClient@SpringBootApplicationpublic class EurekaClientApplication {@LoadBalanced // 负载均衡@Bean(value = "restTemplate")public RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(EurekaClientApplication.class, args);}}
远程调用
@RestController@RequestMapping(value = "/api/consumer")public class IndexController {@Autowiredprivate RestTemplate restTemplate;public String getMsg() {return restTemplate.getForObject("http://MICRO-CLIENT/api/index/getMsg", String.class);}}
远程调用中使用了生产者的application name(MICRO-CLIENT),不断刷新消费者的接口访问即可查看远程轮询调用
Ribbon原理:
- Ribbon根据所在的注册中心选择一个负载较少的Eureka服务器
- 定期从Eureka服务器更新,过滤服务实例列表
- 根据指定的负载均衡策略(默认轮询),从可用服务实例中选择一个较优的
- 使用Rest客户端进行服务调用
