一.简介
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动帮助你基于某种规则去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon在工作时分成两步:第一步选择EurekaServer,他优先选择在同一个区域内负载较少的server。第二步再根据用户指定的策略,再从server取到的服务注册列表中选择一个地址。
二.Ribbon基本使用
依赖
在新版eureka-client依赖中,已经默认导入了Ribbon的相关依赖了。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
我们如果想要使用Ribbon,只需要在RestTemplate的配置类中加上@LoadBalanced注解即可。(默认使用的是轮询算法)然后进行服务调用,Ribbon就开始工作了。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
三.Ribbon的负载规则
Ribbon默认自带一下负载规则:
- RoundRobinRule:轮询
- RandomRule:随机
- RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则会在指定时间进行重试,获取可用的服务。
- WeightedResponseTimeRule:对RoundRobinRule的扩展,相应速度越快的实列选择权重越大,越容易被选择。
- BestAvailableRule:会优先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。
- AvailablityFilterRule:会过滤掉故障实例,再选择并发较小的实例。
- ZoneAvoidanceRule:默认规则,符合判断server所在区域的性能和server的可用性选择服务器。
四.替换Ribbon的负载规则
Spring Cloud Eureka官方文档:
翻译过来就是:CustomConfiguration类必须是@Configuration类,但是要注意它不在主应用程序上下文的@ComponentScan中。否则,它将被所有的@RibbonClients共享。如果使用@ComponentScan(或@SpringBootApplication),则需要采取步骤避免包含它(例如,可以将其放在一个单独的、不重叠的包中,或者在@ComponentScan中指定要显式扫描的包)。
定义一个配置类:
@Configuration
public class MyRuleConfig {
@Bean
public IRule iRule(){
return new RandomRule();//随机规则
}
}
包结构如下:
然后在主启动类上标明注解@RibbonClient:
把刚才定义的规则扫描进去,这样Ribbon默认规则就被替换为随机规则了。
五.Ribbon负载轮询算法原理
rest接口第几次请求数 % 服务集群总量 = 实际调用服务器位置下标,每次服务重启后rest接口计数从1开始。