文章目录
- 
- 
- 一、核心定位与设计目标
- [二、与 Ribbon 的核心差异](#二、与 Ribbon 的核心差异)
- 三、核心功能与特性
- 四、工作原理
- 
- [1. 服务实例获取](#1. 服务实例获取)
- [2. 健康实例过滤](#2. 健康实例过滤)
- [3. 负载均衡策略选择](#3. 负载均衡策略选择)
- [4. 请求执行](#4. 请求执行)
 
- 五、使用方式(集成示例)
- 
- [1. 引入依赖(Maven)](#1. 引入依赖(Maven))
- [2. 与 RestTemplate 集成(命令式)](#2. 与 RestTemplate 集成(命令式))
- [3. 与 WebClient 集成(反应式)](#3. 与 WebClient 集成(反应式))
- [4. 自定义负载均衡策略](#4. 自定义负载均衡策略)
 
- 六、适用场景
- 总结
 
 
- 
Spring Cloud LoadBalancer(简称 SCLB )是 Spring Cloud 官方推出的 客户端负载均衡器 ,旨在替代已停止维护的 Netflix Ribbon。它基于 Spring 生态设计,原生支持 Spring Cloud 服务发现(如 Eureka、Nacos、Consul 等),并提供了更灵活的负载均衡策略、反应式编程支持和简化的扩展机制,是当前 Spring Cloud 生态中客户端负载均衡的推荐方案。
一、核心定位与设计目标
SCLB 的核心作用是在客户端(服务调用方)实现请求的负载均衡,即将请求合理分发到目标服务的多个实例,避免单实例过载,提升系统可用性。其设计目标包括:
- 替代 Ribbon,解决其停止维护的问题;
- 支持反应式编程(适配 Spring WebFlux),满足高并发场景需求;
- 简化与 Spring Cloud 服务发现组件的集成;
- 提供灵活的负载均衡策略和扩展机制。
二、与 Ribbon 的核心差异
| 特性 | Spring Cloud LoadBalancer | Ribbon(已停止维护) | 
|---|---|---|
| 维护状态 | 活跃维护(Spring Cloud 官方组件) | 2019 年后停止更新 | 
| 编程模型支持 | 同时支持命令式 (Spring MVC)和反应式(Spring WebFlux) | 仅支持命令式 | 
| 服务发现集成 | 原生适配 Spring Cloud 服务发现(如 DiscoveryClient) | 需通过适配器对接,集成较复杂 | 
| 负载策略扩展 | 基于接口 ReactorLoadBalancer,扩展简单 | 基于 IRule接口,扩展相对繁琐 | 
| 依赖精简 | 轻量,无冗余依赖 | 依赖 Netflix 生态组件,较重 | 
三、核心功能与特性
- 
客户端负载均衡 从服务注册中心获取目标服务的实例列表,基于预设策略(如轮询、随机)选择一个实例发起请求,避免请求集中在单一实例。 
- 
服务实例动态感知 与 Spring Cloud 服务发现组件(如 Nacos、Eureka)集成,实时获取服务实例的上下线、健康状态等信息,确保负载均衡基于最新的实例列表。 
- 
多编程模型支持 - 命令式:支持与 RestTemplate结合,适用于 Spring MVC 项目;
- 反应式:支持与 WebClient(Spring WebFlux 组件)结合,适用于高并发、非阻塞场景。
 
- 命令式:支持与 
- 
内置负载均衡策略 提供两种默认策略,可通过配置或自定义扩展: - RoundRobinLoadBalancer(轮询):默认策略,依次循环选择实例;
- RandomLoadBalancer(随机):随机选择一个实例。
 
- 
健康实例过滤 自动过滤状态为"不健康"的实例(依赖服务注册中心的健康检查机制,如 Nacos 的心跳检测),仅向健康实例发送请求。 
四、工作原理
SCLB 的工作流程可概括为"获取实例 → 过滤实例 → 选择实例 → 执行请求"四步,核心逻辑由负载均衡器和服务发现组件协同完成:
1. 服务实例获取
客户端启动时,SCLB 通过 Spring Cloud 的 DiscoveryClient(服务发现客户端)从注册中心(如 Nacos)拉取目标服务(如 user-service)的所有实例列表(包含 IP、端口、健康状态等信息),并定期更新(默认通过注册中心的事件通知机制实时同步)。
2. 健康实例过滤
SCLB 会对原始实例列表进行过滤,剔除"不健康"的实例(如注册中心标记为 DOWN 的实例),仅保留状态为 UP 的实例,形成"可用实例列表"。
3. 负载均衡策略选择
从"可用实例列表"中,SCLB 基于配置的负载策略(如轮询)选择一个实例作为请求目标。
- 轮询策略(RoundRobinLoadBalancer):通过计数器记录当前选择的索引,每次请求后索引自增(超过列表长度则重置为 0),实现依次选择;
- 随机策略(RandomLoadBalancer):通过随机数生成器从可用实例列表中随机选择一个。
4. 请求执行
选择实例后,SCLB 将请求的服务名(如 http://user-service/users/1)替换为具体实例的 IP:端口(如 http://192.168.1.100:8080/users/1),并通过 RestTemplate 或 WebClient 发起实际请求。
五、使用方式(集成示例)
SCLB 的使用需结合服务注册中心(如 Nacos)和 HTTP 客户端(RestTemplate 或 WebClient),以下是具体步骤:
1. 引入依赖(Maven)
需引入 SCLB 核心依赖和服务注册中心依赖(以 Nacos 为例):
            
            
              xml
              
              
            
          
          <!-- Spring Cloud LoadBalancer 核心依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- Nacos 服务发现(提供服务实例列表) -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 可选:若使用 RestTemplate(命令式) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 可选:若使用 WebClient(反应式) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>2. 与 RestTemplate 集成(命令式)
通过 @LoadBalanced 注解为 RestTemplate 开启 SCLB 负载均衡能力:
            
            
              java
              
              
            
          
          // 1. 配置 RestTemplate,添加 @LoadBalanced 注解
@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced // 关键:启用 SCLB 负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
// 2. 业务中使用 RestTemplate 调用服务(URL 使用服务名)
@Service
public class OrderService {
    @Autowired
    private RestTemplate restTemplate;
    public UserDTO getUser(Long id) {
        // "user-service" 是目标服务在注册中心的名称,SCLB 会自动替换为具体实例的 IP:端口
        String url = "http://user-service/users/" + id;
        return restTemplate.getForObject(url, UserDTO.class);
    }
}3. 与 WebClient 集成(反应式)
通过 @LoadBalanced 注解为 WebClient.Builder 开启负载均衡,适用于 Spring WebFlux 项目:
            
            
              java
              
              
            
          
          // 1. 配置 WebClient,添加 @LoadBalanced 注解
@Configuration
public class WebClientConfig {
    @Bean
    @LoadBalanced // 关键:启用 SCLB 负载均衡
    public WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }
}
// 2. 业务中使用 WebClient 调用服务(反应式)
@Service
public class OrderService {
    @Autowired
    private WebClient.Builder webClientBuilder;
    public Mono<UserDTO> getUser(Long id) {
        // 服务名 "user-service" 会被 SCLB 替换为具体实例
        return webClientBuilder.build()
                .get()
                .uri("http://user-service/users/" + id)
                .retrieve()
                .bodyToMono(UserDTO.class);
    }
}4. 自定义负载均衡策略
若默认策略(轮询、随机)不满足需求,可自定义策略:
            
            
              java
              
              
            
          
          // 1. 实现 ReactorLoadBalancer 接口(反应式策略)
public class CustomLoadBalancer implements ReactorLoadBalancer<ServiceInstance> {
    private final ServiceInstanceListSupplier supplier; // 用于获取实例列表
    private final String serviceId; // 目标服务名
    public CustomLoadBalancer(ServiceInstanceListSupplier supplier, String serviceId) {
        this.supplier = supplier;
        this.serviceId = serviceId;
    }
    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        // 从 supplier 获取可用实例列表
        return supplier.get().next().map(instances -> {
            if (instances.isEmpty()) {
                return Response.empty();
            }
            // 自定义策略:选择第一个实例(示例)
            ServiceInstance instance = instances.get(0);
            return Response.success(instance);
        });
    }
}
// 2. 配置自定义策略生效
@Configuration
public class LoadBalancerConfig {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> customLoadBalancer(
            Environment environment,
            LoadBalancerClientFactory loadBalancerClientFactory) {
        String serviceId = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        // 为指定服务(如 user-service)配置自定义策略
        return new CustomLoadBalancer(
                loadBalancerClientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class),
                serviceId);
    }
}// 3. 配置文件指定服务使用自定义策略
            
            
              yaml
              
              
            
          
          spring:
  cloud:
    loadbalancer:
      configurations: custom-config # 关联自定义配置类名六、适用场景
- 微服务内部调用:替代 Ribbon,实现服务间请求的负载均衡,尤其适合 Spring Cloud 新生态项目;
- 反应式架构:与 Spring WebFlux 配合,在高并发、非阻塞场景中提供高效的负载均衡支持;
- 需要灵活扩展:自定义负载策略(如基于权重、响应时间的策略)时,SCLB 的扩展机制更简单。
总结
Spring Cloud LoadBalancer 是 Spring Cloud 官方推出的新一代客户端负载均衡器,通过简化的设计、对反应式编程的支持和灵活的扩展机制,解决了 Ribbon 停止维护的问题。它与 Spring 生态深度集成,能无缝对接服务注册中心和 HTTP 客户端,是现代 Spring Cloud 项目中实现客户端负载均衡的首选方案。