Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具 ,Ribbon主要 解决集群服务中,多个服务高效率访问的问题。
负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。
目标
- 理解Ribbon的负载均衡应用场景
- 能实现Ribbon的轮询、随机算法配置
- 理解源码对负载均衡的切换
客户端与服务端级别的负载均衡
服务器端负载均衡:例如Nginx:先发送请求给nginx服务器,然后通过负载均衡算法,
在多个业务服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
客户端负载均衡:客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,
然后进行访问,即在客户端就进行负载均衡算法分配。
客户端:服务消费方
服务器端: 服务提供方
Ribbon的使用
1、在服务的消费方导入Ribbon的依赖:
<!--ribbon负载均衡依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
2、在启动类中的RestTemplate 方法上加@LoadBalanced注解,即可开启 Ribbon 负载均衡
@SpringBootApplication @EnableDiscoveryClient public class SpringCloudUserApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudUserApplication.class, args); } // 创建RestTemplate、添加负载均衡的注解 @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
3、application.yml中添加服务提供方的url接口
#master接口的url master: service: master: url: http://springCould-master/master/sayHello/ //服务提供方项目名+窄化请求+接口名
4、在controller中向Http中植入Ribbon
@RestController @RequestMapping(path = "user",produces = "application/json;charset=utf-8") public class helloController { @Autowired private RestTemplate restTemplate; @Value("${server.port}") private int port; //获取配置文件中服务提供方的url @Value("${master.service.master.url}") private String getMasterSayHelloUrl; @GetMapping("hello/{word}") public String sayHello(@PathVariable("word")String word) throws Exception{ //服务消费方与服务提供方的传值 String rs = restTemplate.getForObject(getMasterSayHelloUrl + word, String.class);//返回值url为string类型 return rs; }
在服务提供方中编写controller接口供消费方调用数据
@RestController @RequestMapping(path = "master",produces = "application/json;charset=utf-8") public class helloController { @Value("${server.port}") private int port; @GetMapping("sayHello/{word}") public String sayHello(@PathVariable("word")String word) throws Exception{ System.out.println("master"+port); return "hello:"+word; }
测试是否实现客户端的负载均衡
① 启动注册中心
② 服务提供方需要关闭热部署
启动一个8081端口的服务,不要关闭(修改端口号)再启动一个8082端口的服务
③ 启动服务消费方
④ 执行服务消费方的接口,查看后台打印的端口,发现有时执行的是8081服务器有时执行的是8082
Ribbon的实现原理
指定 Ribbon 的负载均衡策略
Ribbon 自带的负载均衡策略有如下几个:
1.RoundRibbonRule:轮询。人人有份,一个个来! 2.RandomRule:随机。拼人品了! 3.AvailabilityFilteringRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,
以及并发连接数超过阈值的服务,剩下的服务,使用轮询策略。 4.WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应越快的服务权重越高,
越容易被选中。一开始启动时,统计信息不足的情况下,使用轮询。 5.RetryRule:先轮询,如果获取失败则在指定时间内重试,重新轮询可用的服务。 6.BestAvailableRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。 7.ZoneAvoidanceRule:复合判断 server 所在区域的性能和 server 的可用性选择服务器
指定 Ribbon 自带的负载均衡策略,在服务消费方启动配置类中添加配置
//修改ribbon的策略 @Bean public IRule myRule() { // 指定重试策略:随机策略 return new RandomRule(); }