Ribbon
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的客户端负载均衡(在调用方本地决定请求发往哪个服务实例)和服务调用工具。
适用场景:微服务架构的服务调用、需要在多个服务实例间分配请求的场景。
提示
Spring Cloud Ribbon客户端负载均衡工具,支持多种负载均衡策略
负载均衡类型
服务端负载均衡
在客户端和服务端之间建立独立的负载均衡服务器(如 F5、Nginx),维护可用服务端清单,通过心跳机制(定期发送请求证明服务存活)维护。
特点:
- 需要建立独立的负载均衡服务器
- 客户端不知道具体哪个服务端处理
- 可用清单存储在负载均衡服务器
客户端负载均衡
将负载均衡逻辑封装到客户端,客户端从服务注册中心获取可用服务端清单,通过负载均衡算法(如轮询、随机)选择服务端。
特点:
- 不需要单独建立负载均衡服务器
- 客户端清楚知道是哪个服务端提供的服务
- 维护一份从注册中心获取的服务清单
负载均衡策略
| 策略 | 说明 |
|---|---|
| RoundRobinRule | 线性轮询,按顺序依次选取 |
| RandomRule | 随机选取 |
| RetryRule | 轮询+重试,超过时间返回 null |
| WeightedResponseTimeRule | 根据响应时间计算权重,响应越快选中概率越高 |
| BestAvailableRule | 过滤故障实例后选择并发量最小的 |
| AvailabilityFilteringRule | 过滤故障或失效实例后选择并发量较小的 |
| ZoneAvoidanceRule | 默认策略,综合判断 zone 性能和服务可用性 |
⚠️ 注意:当 Ribbon 和 Eureka 一起使用时,Ribbon 从 Eureka Server 获取服务端列表,通过负载均衡策略将请求分摊给多个服务提供者。
快速开始
引入依赖
Eureka 已包含 Ribbon,无需单独引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>使用
在 RestTemplate 上添加 @LoadBalanced 注解:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}调用服务
restTemplate.getForObject("http://SERVICE-GOODS/test", Result.class);自定义负载均衡策略
方式一:全局配置
@Bean
public IRule myRule() {
return new RandomRule(); // 随机策略
}方式二:自定义规则类
继承 AbstractLoadBalancerRule 实现自定义逻辑:
public class MyRule extends AbstractLoadBalancerRule {
private int total = 0;
private int currentIndex = 0;
public Server choose(Object key) {
// 自定义选择逻辑
}
}常见问题处理
负载均衡不生效
- 检查
@LoadBalanced注解是否添加 - 确认服务名是否正确(大小写敏感)
- 检查服务是否注册到注册中心
超时问题
- 调整 Ribbon 超时配置:
ribbon.ReadTimeout - 检查目标服务响应时间
- 确认网络连通性