Spring 源码硬核解析系列专题(三十二):Spring Cloud LoadBalancer 的负载均衡源码解析

在前几期中,我们从 Spring 核心到 Spring Boot 的多个模块,再到 Spring Cloud Alibaba,逐步揭示了 Spring 生态在微服务领域的广泛应用。Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡组件,替代 Ribbon,支持服务发现和负载均衡策略。本篇将深入 Spring Cloud LoadBalancer 的源码,剖析其核心机制与实现原理,并补充图示。

1. Spring Cloud LoadBalancer 的核心概念

Spring Cloud LoadBalancer 是一个轻量级负载均衡框架,核心概念包括:

  • ServiceInstance:服务实例(包含地址、端口等)。
  • LoadBalancerClient:执行负载均衡的核心接口。
  • LoadBalancer:负载均衡策略(如轮询、随机)。
  • ServiceInstanceListSupplier:提供服务实例列表。
  • Reactor:基于响应式编程的实现。

Spring Cloud LoadBalancer 集成 Spring Cloud Commons 和 Reactor,提供非阻塞的负载均衡。

2. Spring Cloud LoadBalancer 的基本配置

一个典型的 Spring Boot 配置:

@SpringBootApplication
public class MyApplication {
   
    
    
    public static void main(String[] args) {
   
    
    
        SpringApplication.run(MyApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
   
    
    
        return new RestTemplate();
    }
}

@Service
public class UserService {
   
    
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;

    public String getUser(String userId) {
   
    
    
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        String url = String.format("http://%s:%s/user/%s", instance.getHost(), instance.getPort(), userId);
        return restTemplate.getForObject(url, String.class);
    }
}

application.yml:
```yaml
spring:
  cloud:
    loadbalancer:
      retry:
        enabled: false
  • @LoadBalanced:启用负载均衡。
  • LoadBalancerClient:选择服务实例。

3. LoadBalancer 的自动装配

Spring Boot 通过 spring-cloud-starter-loadbalancer 自动装配:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration

LoadBalancerAutoConfiguration

@Configuration
@ConditionalOnClass(LoadBalancerClient.class)
public class LoadBalancerAutoConfiguration {
   
    
    
    @Bean
    public LoadBalancerClient loadBalancerClient(ServiceInstanceListSupplier supplier) {
   
    
    
        return new ReactorLoadBalancerClient(supplier);
    }

    @Bean
    public ServiceInstanceListSupplier serviceInstanceListSupplier(DiscoveryClient discoveryClient) {
   
    
    
        return new DiscoveryClientServiceInstanceListSupplier(discoveryClient);
    }
}
  • LoadBalancerClient:负载均衡客户端。
  • ServiceInstanceListSupplier:从服务发现获取实例。

4. ReactorLoadBalancerClient 的核心逻辑

Rea