Ribbon
Netflix Ribbon 是 Spring Cloud 早期的客户端负载均衡实现,现已进入维护模式。Spring Cloud 2021 起默认使用 Spring Cloud LoadBalancer 替代。
新项目请直接使用 Spring Cloud LoadBalancer,本文仅作历史参考。
核心组件
| 组件 | 默认实现 | 职责 |
|---|---|---|
| ILoadBalancer | ZoneAwareLoadBalancer | 维护实例列表,选择实例 |
| IRule | ZoneAvoidanceRule | 负载均衡策略 |
| IPing | NIWSDiscoveryPing | 检测实例存活 |
| ServerList | NacosServerList 等 | 从注册中心获取实例列表 |
内置策略
| 策略类 | 说明 |
|---|---|
RoundRobinRule | 轮询(基础默认) |
RandomRule | 随机 |
WeightedResponseTimeRule | 按响应时间加权,响应越快权重越高 |
BestAvailableRule | 选并发量最少的实例 |
AvailabilityFilteringRule | 过滤熔断打开 / 高并发的实例 |
ZoneAvoidanceRule | 综合区域 + 可用性过滤(推荐默认) |
RetryRule | 失败重试 |
配置(遗留写法,仅参考)
# 针对特定服务配置 Ribbon
order-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ConnectTimeout: 1000
ReadTimeout: 3000
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
OkToRetryOnAllOperations: false// 代码配置(不推荐用于新项目)
@Configuration
public class RibbonConfig {
@Bean
public IRule ribbonRule() {
return new WeightedResponseTimeRule();
}
}
@RibbonClient(name = "order-service", configuration = RibbonConfig.class)
public class RibbonClientConfig {}@LoadBalanced(Ribbon 时代写法)
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 使用服务名调用,Ribbon 自动替换为真实地址
restTemplate.getForObject("http://order-service/orders/1", Order.class);迁移到 Spring Cloud LoadBalancer
<!-- 排除 Ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入新版 LoadBalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>spring:
cloud:
loadbalancer:
ribbon:
enabled: false