介绍一下Spring Cloud LoadBalancer

文章目录

      • 一、核心定位与设计目标
      • [二、与 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 生态组件,较重

三、核心功能与特性

  1. 客户端负载均衡

    从服务注册中心获取目标服务的实例列表,基于预设策略(如轮询、随机)选择一个实例发起请求,避免请求集中在单一实例。

  2. 服务实例动态感知

    与 Spring Cloud 服务发现组件(如 Nacos、Eureka)集成,实时获取服务实例的上下线、健康状态等信息,确保负载均衡基于最新的实例列表。

  3. 多编程模型支持

    • 命令式:支持与 RestTemplate 结合,适用于 Spring MVC 项目;
    • 反应式:支持与 WebClient(Spring WebFlux 组件)结合,适用于高并发、非阻塞场景。
  4. 内置负载均衡策略

    提供两种默认策略,可通过配置或自定义扩展:

    • RoundRobinLoadBalancer(轮询):默认策略,依次循环选择实例;
    • RandomLoadBalancer(随机):随机选择一个实例。
  5. 健康实例过滤

    自动过滤状态为"不健康"的实例(依赖服务注册中心的健康检查机制,如 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),并通过 RestTemplateWebClient 发起实际请求。

五、使用方式(集成示例)

SCLB 的使用需结合服务注册中心(如 Nacos)和 HTTP 客户端(RestTemplateWebClient),以下是具体步骤:

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 项目中实现客户端负载均衡的首选方案。

相关推荐
老司机张师傅8 小时前
【微服务实战之Docker容器】第十章-compose容器编排
docker·微服务·架构
ghie90908 小时前
利用 Docker 和 Kubernetes 实现微服务部署
docker·微服务·kubernetes
@大迁世界8 小时前
我用 Rust 重写了一个 Java 微服务,然后丢了工作
java·开发语言·后端·微服务·rust
青鱼入云8 小时前
介绍一下Ribbon
后端·spring cloud·ribbon
lang201509289 小时前
Spring事务回滚规则深度解析
java·后端·spring
JMzz10 小时前
Rust 中的内存对齐与缓存友好设计:性能优化的隐秘战场 ⚡
java·后端·spring·缓存·性能优化·rust
没有bug.的程序员10 小时前
Spring Boot 整合第三方组件:Redis、MyBatis、Kafka 实战
java·spring boot·redis·后端·spring·bean·mybatis
裸奔在上海13 小时前
使用Java做URL短连接还原长链接获取参数
java·开发语言·程序人生·spring
洛克大航海13 小时前
9-SpringCloud-服务网关 Gateway-高级特性之 Filter-1
spring·spring cloud·gateway·filter