Ribbon 提供了哪些常用的负载均衡策略(算法)?
Spring Cloud Netflix Ribbon 作为一个客户端负载均衡器,内置了多种常用的负载均衡策略。这些策略都实现了 com.netflix.loadbalancer.IRule 接口。
以下是 Ribbon 提供的 7 种常用负载均衡策略(算法):
1. 轮询策略 (RoundRobinRule)
- 原理:按照线性轮询的方式,依次从服务提供者列表中选择一个服务器。当选到最后一个后,再从第一个重新开始。
- 特点:最基础、最简单的策略,假设所有服务器的处理能力相同。
- 适用场景:集群中各个服务器硬件配置和网络环境大致相同的场景。
2. 随机策略 (RandomRule)
- 原理:利用随机数生成算法,从服务列表中随机挑选一个服务器。
- 特点:随着调用量的增大,其实际效果会越来越接近于轮询策略。
- 适用场景:服务器处理能力相近,且没有特殊路由要求的场景。
3. 重试策略 (RetryRule)
- 原理:它本身是对其他策略(默认是轮询
RoundRobinRule)的一种封装。首先按照底层的策略获取服务,如果获取失败(比如服务器不可用),则会在指定的时间内不断重试,直到获取到可用的服务器或超时。 - 特点:增加了容错机制。
- 适用场景:网络环境不稳定或服务偶尔会出现短暂波动的场景。
4. 权重响应时间策略 (WeightedResponseTimeRule)
- 原理:这是
RoundRobinRule的一个子类。它会开启一个后台线程,定时计算各个服务器的平均响应时间,并根据响应时间计算权重。响应时间越长,权重越小,被选中的概率就越低。 - 特点:刚启动时,因为没有足够的统计信息,它会默认使用轮询策略;等统计信息建立后,会切换到基于权重的选择。
- 适用场景:集群中服务器硬件配置有差异,或者网络延迟不一致的场景。能有效避免慢节点拖垮整体性能。
5. 最低并发策略 (BestAvailableRule)
- 原理:遍历服务列表,先过滤掉那些因为多次访问故障而被处于“断路器打开”状态的服务器,然后选择一个当前并发连接数最小的服务器。
- 特点:动态感知服务器的压力情况,把请求分配给最闲的服务器。
- 适用场景:请求处理时间长短不一,导致各个服务器并发压力不均衡的场景。
6. 可用性过滤策略 (AvailabilityFilteringRule)
- 原理:它会先过滤掉两类服务器:
- 一直连接失败,导致被标记为短路(Circuit Tripped)的服务器。
- 并发连接数超过设定阈值的服务器。
过滤掉这些“不健康”的服务器后,对剩下的服务器使用轮询策略进行选择。
- 特点:比
BestAvailableRule多了一层对高并发服务器的熔断保护。
7. 区域规避策略 (ZoneAvoidanceRule)
- 原理:它是一个复合判断策略,综合判断 Server 所在区域(Zone)的性能和 Server 的可用性。它会先过滤掉故障率较高或负载较高的 Zone,然后再在健康的 Zone 中使用轮询策略选择服务器。
- 特点:这是 Spring Cloud 体系中 Ribbon 的默认策略(如果没有特殊配置的话)。
- 适用场景:多机房、多可用区(AZ)部署的跨地域分布式架构。
💡 补充说明
1. 默认策略是什么?
- 如果是原生 Ribbon,默认策略是
RoundRobinRule(轮询)。 - 如果是结合 Spring Cloud 使用,Spring Cloud Netflix 默认注入的策略是
ZoneAvoidanceRule(区域规避)。
2. 如何切换或自定义策略?
可以通过 Java 配置类或配置文件(YAML/Properties)来更改:
方式一:配置文件(推荐,针对特定微服务)
yaml
# 目标微服务的名称
user-service:
ribbon:
# 指定策略类的全限定名
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
方式二:Java 配置类
java
@Configuration
public class RibbonConfig {
@Bean
public IRule ribbonRule() {
return new RandomRule(); // 返回你想要的策略
}
}
(注意:Spring Cloud 2020 版本之后,Netflix Ribbon 已被弃用,官方推荐使用 Spring Cloud LoadBalancer 作为替代方案,但其核心的负载均衡思想(如轮询、随机)是一致的。)
右滑查看面试常问