Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具。主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。现在项目处于维护状态中,但依旧还在大范围使用
如果项目中使用了eureka client、zookeeper、consul、nacos则已经自动依赖了Ribbon, 然后结合RestTemplate使用即可【@LoadBalanced】
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
算法 | 解释 |
---|---|
RoundRobinRule | 轮询,默认算法 |
RandomRule | 随机 |
RetryRule | 先按照RoudRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务 |
WeightedResponseTimeRule | 对RoudRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择 |
BestAvailableRule | 会优过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 |
AvailabilityFilteringRule | 先过滤掉故障实例,再选择并发较小的实例 |
ZoneAvoidanceRule | 复合判断server所在区域的性能和server的可用性选择服务器 |
主启动类加入注解@RibbonClients
@RibbonClients(
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = RandomRule.class)
)
自定义某服务的规则不能被spring boot扫描到,否则定义的配置类就会被所有的Ribbon客户端使用【全局使用】,起不到特殊化定制的效果。
自定义类实现AbstractLoadBalancerRule
或者IRue
即可
public class MyRule extends AbstractLoadBalancerRule {
public Server choose(ILoadBalancer lb, Object key) {
//...自定义规则...
}
protected int chooseRandomInt(int serverCount) {
return ThreadLocalRandom.current().nextInt(serverCount);
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}
主启动类加入注解@RibbonClients
@RibbonClients(
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MyRule.class)
)