基于本文回答
0
评论

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)

  • 原理:它会先过滤掉两类服务器:
    1. 一直连接失败,导致被标记为短路(Circuit Tripped)的服务器。
    2. 并发连接数超过设定阈值的服务器。
      过滤掉这些“不健康”的服务器后,对剩下的服务器使用轮询策略进行选择。
  • 特点:比 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 作为替代方案,但其核心的负载均衡思想(如轮询、随机)是一致的。)

右滑查看面试常问