Ribbon

返回 Spring Cloud

Netflix Ribbon 是 Spring Cloud 早期的客户端负载均衡实现,现已进入维护模式。Spring Cloud 2021 起默认使用 Spring Cloud LoadBalancer 替代。

新项目请直接使用 Spring Cloud LoadBalancer,本文仅作历史参考。

核心组件

组件默认实现职责
ILoadBalancerZoneAwareLoadBalancer维护实例列表,选择实例
IRuleZoneAvoidanceRule负载均衡策略
IPingNIWSDiscoveryPing检测实例存活
ServerListNacosServerList从注册中心获取实例列表

内置策略

策略类说明
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

相关链接