SpringCloud:LoadBalancer
2025/10/10大约 4 分钟
一、核心定位与项目状态
1. Spring Cloud LoadBalancer
- 是 Spring Cloud 官方自研的客户端负载均衡组件,专门用于替代 Ribbon,从 Spring Cloud Hoxton 版本开始成为默认负载均衡器,集成在
Spring Cloud Commons核心依赖中。 - 关键状态:活跃开发与维护,深度兼容 Spring 生态,是现代 Spring Cloud 项目的首选负载均衡方案。
- 核心作用:与 Ribbon 一致(客户端负载均衡),但在功能扩展性、编程模型支持上更优。
2. Ribbon
- 是 Netflix 开源的客户端负载均衡组件,是 Spring Cloud 早期版本(Greenwich 及之前)的默认客户端负载均衡器,隶属于 Spring Cloud Netflix 生态。
- 关键状态:已停止积极开发(EOL,生命周期终止),仅提供基础bug修复维护,无任何新功能迭代,这是它被替代的核心原因。
- 核心作用:在客户端(微服务消费者)侧维护服务提供者列表,通过负载均衡策略(轮询、随机等)选择目标服务实例进行调用,避免单点故障,提升服务可用性。
二、核心差异对比
| 对比维度 | Spring Cloud LoadBalancer | Spring Cloud Ribbon |
|---|---|---|
| 开发者 | Spring Cloud 官方 | Netflix(第三方) |
| 项目状态 | 活跃开发与迭代 | 停更维护(EOL) |
| 默认集成版本 | Spring Cloud Hoxton 及以后 | Spring Cloud Greenwich 及之前 |
| 编程模型支持 | 支持同步编程(WebMvc)+ 反应式编程(WebFlux) | 仅支持同步编程(WebMvc) |
| 依赖引入方式 | 随服务发现依赖(Nacos/Eureka/Consul)自动引入,无需单独配置 | 需单独引入 spring-cloud-starter-netflix-ribbon |
| 扩展灵活性 | 原生兼容 Spring 生态,扩展简单灵活 | 扩展繁琐,需兼容 Netflix 生态 |
| 核心负载均衡策略 | 默认提供轮询(RoundRobinLoadBalancer)、随机(RandomLoadBalancer),支持自定义 | 轮询、随机、权重、重试、可用性过滤等 |
三、基础使用示例
两者在 RestTemplate 的使用上高度兼容(均基于 @LoadBalanced 注解),这是 Spring Cloud 为降低迁移成本做的优化。
1. Spring Cloud LoadBalancer 使用
步骤1:引入依赖(自动集成 LoadBalancer)
无需单独引入 LoadBalancer 依赖,只需引入服务发现依赖(以 Nacos 为例),会自动关联 LoadBalancer:
<!-- Spring Cloud Hoxton 及以后版本 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>步骤2:配置 @LoadBalanced 注解的 RestTemplate(与 Ribbon 完全一致)
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class LoadBalancerConfig {
// 使用 @LoadBalanced 注解,开启 LoadBalancer 负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}步骤3:服务调用(与 Ribbon 完全一致,迁移无感知)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
// 同样使用服务名调用,LoadBalancer 自动负载均衡
private static final String SERVICE_URL = "http://USER-SERVICE/user/";
@GetMapping("/consumer/user/{id}")
public String getUser(@PathVariable Integer id) {
return restTemplate.getForObject(SERVICE_URL + id, String.class);
}
}步骤4:自定义负载均衡策略(示例:指定随机策略)
LoadBalancer 扩展更灵活,支持自定义策略,以下是配置随机负载均衡的示例:
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
// 为指定服务(USER-SERVICE)配置自定义负载均衡策略
@Configuration
@LoadBalancerClient(name = "USER-SERVICE", configuration = CustomLoadBalancerConfig.class)
public class LoadBalancerConfig {
}
// 自定义负载均衡配置类
class CustomLoadBalancerConfig {
// 配置随机负载均衡策略(替代默认轮询)
@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
// 获取服务名称
String serviceName = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
// 返回随机负载均衡器
return new RandomLoadBalancer(
loadBalancerClientFactory.getLazyProvider(serviceName, ServiceInstanceListSupplier.class),
serviceName
);
}
}2. Spring Cloud Ribbon 使用
步骤1:引入依赖
<!-- 仅 Spring Cloud Greenwich 及之前版本支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!-- 需配合服务发现(如 Eureka) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>步骤2:配置 @LoadBalanced 注解的 RestTemplate
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RibbonConfig {
// 加上 @LoadBalanced 注解,开启 Ribbon 负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}步骤3:服务调用(使用服务名替代 IP:端口)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
// 服务名:USER-SERVICE(无需写 IP:端口)
private static final String SERVICE_URL = "http://USER-SERVICE/user/";
@GetMapping("/consumer/user/{id}")
public String getUser(@PathVariable Integer id) {
// Ribbon 自动负载均衡选择服务实例
return restTemplate.getForObject(SERVICE_URL + id, String.class);
}
}四、核心总结
- 替代关系:Spring Cloud LoadBalancer 是 Ribbon 的官方替代方案,解决了 Ribbon 停更、不支持反应式编程的痛点。
- 兼容易用:两者在
RestTemplate的使用上完全兼容(均依赖@LoadBalanced注解),旧项目从 Ribbon 迁移到 LoadBalancer 几乎无代码改动。 - 生态适配:LoadBalancer 深度适配 Spring 生态,支持 WebFlux 反应式编程,扩展灵活性远超 Ribbon,是现代 Spring Cloud 项目的必选。
- 使用场景:Ribbon 仅用于维护老旧 Spring Cloud 项目(Greenwich 及之前),新项目优先使用 Spring Cloud LoadBalancer。