负载均衡是微服务架构中的智能流量中枢,其核心功能见上篇文章负载均衡---Ribbon-优快云博客
本文主要对Spring Cloud LoadBalancer进行阐述,它是Spring Cloud提供的客户端负载均衡工具,替代了早期的Netflix Ribbon。
一、Spring Cloud LoadBalancer详解
Spring Cloud LoadBalancer 是Spring Cloud官方推荐的新一代客户端负载均衡器。它不仅继承了客户端负载均衡高性能、去中心化的核心优势,更通过其响应式架构、主动健康检查、声明式配置和强大的可扩展性,为Spring Cloud微服务提供了面向未来的、生产就绪的负载均衡能力;取代了Netflix Ribbon。
1. 核心功能
①服务实例选择
通过与服务发现组件(如 Nacos、Eureka)集成,动态获取并订阅目标服务的可用实例列表。基于预设策略(如轮询、随机)为每次请求智能选择一个最佳实例,透明地完成服务名到具体地址的解析。
②主动健康检查
支持配置主动探测机制,定期检查实例健康状态(如调用 /actuator/health 端点)。自动屏蔽不健康或超时的实例,确保流量仅被路由至可用节点,是保障服务高可用的基础。
③ 弹性重试机制
在调用失败时(如网络抖动、瞬时故障)可自动触发重试。支持灵活配置:可在同一实例重试或切换至下一实例,并可设定重试次数、条件与退避策略,有效提升请求成功率。
④可插拔的负载均衡策略
提供清晰的可扩展接口。除内置轮询、随机策略外,开发者可轻松自定义路由算法(如实现 ReactiveLoadBalancer 接口),以支持响应时间加权、一致性哈希等复杂场景,满足灰度发布等高级需求。
⑤响应式与非阻塞集成
其架构原生基于 Project Reactor,提供完全非阻塞的响应式 API。可与 WebClient 无缝集成,充分发挥 Spring WebFlux 响应式栈的高并发、低延迟优势。
⑥细粒度服务级配置
支持通过 spring.cloud.loadbalancer 配置域进行精细化管理。可为不同的后端服务独立配置负载均衡规则、健康检查参数及重试策略,实现差异化的服务治理。
2. 核心组件
①核心必备
- LoadBalancerClient / BlockingLoadBalancerClient (负载均衡客户端):面向开发者的高层API门面与调用入口。它封装了底层复杂的响应式负载均衡逻辑,为使用
RestTemplate等阻塞式编程模型的传统应用提供简洁、同步的调用方法
②框架自动装配
- ReactiveLoadBalancer (负载均衡器):负载均衡流程的总控制器与协调中心。这是一个响应式接口,其核心方法
Mono<Response<ServiceInstance>> choose(Request request)负责接收请求,并协调底层各组件完成“实例选择”的全流程决策。 - ServiceInstanceListSupplier (服务实例列表提供者):负载均衡的基础数据源。它负责从服务注册中心(如Nacos、Eureka)或静态配置中,实时获取并动态更新目标服务的所有实例列表。
③按需启用/定制
- 自定义 LoadBalancerAlgorithm 策略 (负载均衡算法):定义 “如何从多个健康实例中做出最终选择” 的具体规则逻辑,是负载均衡器的 “决策大脑”。

二、实践示例
1.使用步骤
①引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
②使用 @LoadBalanced 集成 RestTemplate 或 WebClient.Builder
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
③负载均衡配置
- 基础配置
spring:
cloud:
loadbalancer:
enabled: true
# 全局配置
health-check:
enabled: true
interval: 30s
# 特定服务配置
clients:
user-service:
configurations: weighted
health-check-path: /actuator/health
-
代码配置
@Configuration
@LoadBalancerClient(
name = "user-service",
configuration = UserServiceLoadBalancerConfig.class)
public class UserServiceLoadBalancerConfig {
@Bean
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(
Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new WeightedLoadBalancer(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),
name,
new UserServiceWeightFunction() // 自定义权重函数
);
}
// 自定义权重函数
static class UserServiceWeightFunction implements WeightFunction {
@Override
public int apply(ServiceInstance instance) {
// 根据实例元数据计算权重
String weight = instance.getMetadata().get("weight");
return weight != null ? Integer.parseInt(weight) : 1;
}
}
}
④服务名调用(如 http://user-service/api)
2.自定义负载均衡策略
Spring Cloud LoadBalancer默认提供轮询(RoundRobin)和随机(Random)策略。可通过配置自定义策略:实现ReactorServiceInstanceLoadBalancer接口
public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer {
// 实现逻辑
}
注册自定义负载均衡器
@Bean
public ServiceInstanceListSupplier serviceInstanceListSupplier() {
return new DiscoveryClientServiceInstanceListSupplier(discoveryClient);
}
3. 配置文件优化(application.yml)
①连接超时配置
httpclient:
connection-timeout: 2000ms
read-timeout: 5000ms
response-timeout: 10000ms
②重试配置
retry:
enabled: true
max-attempts: 2
retryable-status-codes: 502,503,504
③缓存配置
cache:
enabled: true
ttl: 15s
4. 与OpenFeign集成
LoadBalancer与OpenFeign天然集成,只需添加Feign依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在接口上使用@FeignClient注解:
@FeignClient(name = "service-provider")
public interface ServiceClient {
@GetMapping("/endpoint")
String getData();
}
三、与Ribbon对比
| 原理维度 | Spring Cloud LoadBalancer | Netflix Ribbon |
|---|---|---|
| 编程模型 | 响应式 (Reactive),非阻塞,高并发资源利用率高。 | 阻塞式 (Blocking),基于线程池,线程消耗随并发线性增长。 |
| 配置方式 | 现代化、统一的配置属性 (spring.cloud.loadbalancer.*),与Spring Boot生态完全一致。 | 混合式(部分属性配置,部分靠@RibbonClient代码配置),风格较老。 |
| 健康检查 | 明确、可配置的主动检查,作为可选的装饰器,设计清晰。 | 机制混杂,依赖Eureka心跳或内置的IPing接口,不易理解和管理。 |
| 扩展性 | 基于标准的Spring Bean和函数式装饰器,扩展自然,符合Spring习惯。 | 基于自定义接口和配置类,扩展需深入其API设计。 |
| 维护状态 | 主动维护,Spring Cloud官方默认组件,持续发展。 | 维护模式,不再增加新功能。 |
1899

被折叠的 条评论
为什么被折叠?



