本文目录导读:

Ribbon 是一个客户端负载均衡器,它通常与 Spring Cloud 配合使用,它的核心工作流程是:在发送请求之前,从注册中心(如 Eureka)或配置文件中获取服务提供者的地址列表,然后根据预定义的规则选择一个实例来发起请求。
下面从工作流程、核心组件和常见配置三个方面来详细说明 Ribbon 的负载均衡机制。
核心工作流程
Ribbon 的负载均衡主要发生在客户端(消费端),其核心流程如下:
-
获取服务列表:
- Ribbon 会从服务注册中心(如 Eureka)或通过配置文件静态获取某个服务名(如
user-service)对应的所有可用实例列表(IP:Port)。
- Ribbon 会从服务注册中心(如 Eureka)或通过配置文件静态获取某个服务名(如
-
负载均衡规则选择:
- 默认情况下,Ribbon 会使用
RoundRobinRule(轮询规则)。 - 你可以通过配置或代码替换为其他规则,如随机、权重、最少并发等。
- 默认情况下,Ribbon 会使用
-
筛选可用实例:
- 在应用规则之前,Ribbon 会调用
IPing机制来检查实例是否存活,默认是每 10 秒检查一次,过滤掉不可用的实例。
- 在应用规则之前,Ribbon 会调用
-
返回目标地址:
- 根据规则选出一个最合适的实例,然后将 HTTP 请求的 URL 从
http://user-service/api/data替换为实际的http://192.168.1.10:8080/api/data,并发起调用。
- 根据规则选出一个最合适的实例,然后将 HTTP 请求的 URL 从
核心组件与负载均衡规则
Ribbon 的负载均衡能力由以下几个核心接口实现:
| 组件 | 作用 | 说明 |
|---|---|---|
IRule |
负载均衡规则 | 决定选择哪个实例。 |
IPing |
服务存活检查 | 定时检测实例是否可达。 |
ServerList |
服务列表获取 | 从注册中心或配置文件获取实例列表。 |
ServerListFilter |
服务列表过滤 | 对获取到的列表进行二次过滤(如只取同机房实例)。 |
常见的负载均衡规则(IRule 的实现类):
-
RoundRobinRule(默认)- 策略:轮询,按顺序依次选择服务列表中的实例。
- 场景:适用于所有服务实例性能相近的情况。
-
RandomRule- 策略:随机,从列表中随机选择一个。
- 场景:对服务器压力分散要求不严格,可以随机调用。
-
WeightedResponseTimeRule- 策略:根据响应时间分配权重,响应时间越短,权重越大,被选中的概率越高。
- 场景:在服务性能差异较大的环境中,该规则能有效避免将请求发送到响应慢的服务器,防止雪崩。
-
RetryRule- 策略:重试,先按照轮询获取服务,如果请求失败,会在设定的时间内重试其他可用的服务。
- 场景:对服务间调用的稳定性要求较高时使用。
-
BestAvailableRule- 策略:选择并发数最小的实例,它会忽略那些处于熔断/跳闸状态的服务器。
- 场景:适用于对系统并发控制有较高要求的环境。
-
ZoneAvoidanceRule- 策略:根据机房/区域性能(Zone)和服务器的可用性来选择,优先选择同一区域且性能好的实例。
- 场景:多机房部署,实现就近访问或区域故障隔离。
配置示例
由于 Ribbon 已进入维护模式,Spring Cloud 官方推荐使用 Spring Cloud LoadBalancer 作为替代,但在旧项目维护或特定场景下,配置方式如下:
全局配置(对所有服务生效)
在 application.yml 中配置:
# 全局配置 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 设置为随机 ConnectTimeout: 5000 ReadTimeout: 5000
针对特定服务的细粒度配置
如果你希望对 userservice 这个服务单独配置负载均衡规则:
userservice: # 服务提供者的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
ConnectTimeout: 3000
ReadTimeout: 5000
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
关键参数说明:
MaxAutoRetries:同一台服务器上的最大重试次数。MaxAutoRetriesNextServer:切换新服务器的最大重试次数。ConnectTimeout/ReadTimeout:连接和读取的超时时间。
Ribbon 负载均衡的特点
- 客户端负载均衡:区别于 Nginx 的中心化负载均衡,Ribbon 的规则运行在调用方,每个服务调用者都有自己的本地负载均衡器,没有单点瓶颈。
- 与 Eureka 天然集成:Ribbon 可以从 Eureka Server 动态获取服务列表,并自动处理服务上下线。
- 规则可插拔:你可以自定义
IRule实现自己的负载均衡策略。 - 进入维护模式:需要注意的是,Netflix 已经宣布 Ribbon 进入维护模式,如果你在新建 Spring Cloud 项目,建议使用 Spring Cloud LoadBalancer(已集成 RoundRobin 和 Random 规则),它更轻量且与 Spring 生态更一致,如果你是在维护旧项目,Ribbon 依然能稳定工作。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播