SpringCloudLoadBalancer
Spring Cloud LoadBalancer 是 Spring Cloud 官方的客户端负载均衡器,2020.0 起替代已停止维护的 Ribbon。职责与 Ribbon 相同:消费者从注册中心拿到服务实例列表后,按策略选一个实例发起调用——解决"服务名如何变成具体 IP:端口"。它是 OpenFeign、RestTemplate 负载均衡的底层实现。
为什么替代 Ribbon
| 维度 | Ribbon | Spring Cloud LoadBalancer |
|---|---|---|
| 维护状态 | Netflix 已停止维护(2020 起不再随版本更新) | Spring 官方活跃维护 |
| 与 Spring Cloud 集成 | 2020.0 起默认不再自动装配 | 默认装配,开箱即用 |
| 自定义策略 | 实现 IRule | 实现 ReactorLoadBalancer / 配置类 |
| 底层 | 同步阻塞 | WebFlux 响应式(Reactor) |
迁移成本低:OpenFeign/RestTemplate 代码基本不变,只需移除 Ribbon 依赖、加 spring-cloud-starter-loadbalancer。OpenFeign 的集成关系变化见 feign。
快速开始
<!-- 引入后自动生效:RestTemplate/OpenFeign 的 @LoadBalanced 走 LoadBalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 服务名调用:LoadBalancer 自动选实例
restTemplate.getForObject("http://user-service/api/users", List.class);负载均衡策略
| 策略 | 说明 | 适用 |
|---|---|---|
| RoundRobin(默认) | 轮询,按实例列表循环 | 通用 |
| Random | 随机选择 | 无状态服务 |
| 自定义 | 实现 ServiceInstanceListSupplier | 按权重/地域/最小连接 |
// 自定义策略:按权重选择(示例:根据实例元数据权重)
@Configuration
public class LoadBalancerConfig {
@Bean
public ReactorLoadBalancer<ServiceInstance> loadBalancer(
ObjectProvider<ServiceInstanceListSupplier> supplierProvider, Environment env) {
return new RoundRobinLoadBalancer(
supplierProvider.getIfAvailable(ServiceInstanceListSupplier::builder),
env.getProperty("loadbalancer.client.name"));
}
}与 Ribbon 策略对照
Ribbon 的轮询/随机/加权响应时间对应 LoadBalancer 的 RoundRobin/Random/自定义 supplier;Ribbon 的 zone 感知对应 LoadBalancer 的 ServiceInstanceListSupplier 组合(如 zone-preference)。
与 OpenFeign/RestTemplate 的配合
@LoadBalanced 是开关:标记的 RestTemplate 与 OpenFeign 的 @FeignClient 都会注入 LoadBalancer 拦截器,把 URL 中的服务名解析为实例地址:
@FeignClient(name = "user-service") // name 即服务名,自动负载均衡
public interface UserClient {
@GetMapping("/api/users/{id}")
User getUser(@PathVariable("id") Long id);
}| 组件 | 负载均衡入口 |
|---|---|
| RestTemplate + @LoadBalanced | 拦截器解析服务名 |
| OpenFeign | FeignBlockingLoadBalancerClient |
| WebClient | 需 spring-cloud-starter-loadbalancer + 响应式支持 |
负载均衡策略与 Ribbon(已停维的旧方案)、OpenFeign(声明式调用)、服务治理 的注册发现体系(Nacos/Eureka 提供实例列表)相互关联。