当前位置: 首页 > news >正文

介绍一下Spring Cloud LoadBalancer

文章目录

      • 一、核心定位与设计目标
      • 二、与 Ribbon 的核心差异
      • 三、核心功能与特性
      • 四、工作原理
        • 1. 服务实例获取
        • 2. 健康实例过滤
        • 3. 负载均衡策略选择
        • 4. 请求执行
      • 五、使用方式(集成示例)
        • 1. 引入依赖(Maven)
        • 2. 与 RestTemplate 集成(命令式)
        • 3. 与 WebClient 集成(反应式)
        • 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 LoadBalancerRibbon(已停止维护)
维护状态活跃维护(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 为例):

<!-- 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 负载均衡能力:

// 1. 配置 RestTemplate,添加 @LoadBalanced 注解
@Configuration
public class RestTemplateConfig {@Bean@LoadBalanced // 关键:启用 SCLB 负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}// 2. 业务中使用 RestTemplate 调用服务(URL 使用服务名)
@Service
public class OrderService {@Autowiredprivate 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 项目:

// 1. 配置 WebClient,添加 @LoadBalanced 注解
@Configuration
public class WebClientConfig {@Bean@LoadBalanced // 关键:启用 SCLB 负载均衡public WebClient.Builder webClientBuilder() {return WebClient.builder();}
}// 2. 业务中使用 WebClient 调用服务(反应式)
@Service
public class OrderService {@Autowiredprivate 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. 自定义负载均衡策略

若默认策略(轮询、随机)不满足需求,可自定义策略:

// 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;}@Overridepublic 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 {@Beanpublic 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. 配置文件指定服务使用自定义策略

spring:cloud:loadbalancer:configurations: custom-config # 关联自定义配置类名

六、适用场景

  • 微服务内部调用:替代 Ribbon,实现服务间请求的负载均衡,尤其适合 Spring Cloud 新生态项目;
  • 反应式架构:与 Spring WebFlux 配合,在高并发、非阻塞场景中提供高效的负载均衡支持;
  • 需要灵活扩展:自定义负载策略(如基于权重、响应时间的策略)时,SCLB 的扩展机制更简单。

总结

Spring Cloud LoadBalancer 是 Spring Cloud 官方推出的新一代客户端负载均衡器,通过简化的设计、对反应式编程的支持和灵活的扩展机制,解决了 Ribbon 停止维护的问题。它与 Spring 生态深度集成,能无缝对接服务注册中心和 HTTP 客户端,是现代 Spring Cloud 项目中实现客户端负载均衡的首选方案。

http://www.dtcms.com/a/536620.html

相关文章:

  • 写作网站排名南京专业网站优化公司
  • 今日印度股市最新行情与实时走势分析(截至2025年10月27日)
  • KingbaseES数据库操作指南(2):SQL语法从入门到精通
  • 介绍一个不错的新闻源汇总开源Github项目 BestBlogs
  • 第3章 运行时数据区概述及线程
  • 深入理解C语言函数栈帧:程序运行的底层密码
  • 谷歌网站怎么做外链站长工具端口查询
  • FPGA DDR3实战(十):基于DDR3的高速故障录播系统(二)—— 数据流转换与时钟域设计
  • 运维蓝图 用多工具组合把 iOS 混淆变成可复用的工程能力(iOS 混淆 IPA 加固 )
  • Caddyfile:用最简单的方式配置最现代的 Web 服务器
  • 昆明森贤网站建设国外h5网站模板下载
  • 机器人信息|基于Springboot的机器人门户展示系统设计与实现(源码+数据库+文档)
  • 上海网站空间租用自己做网站自己做推广教程视频教程
  • 《Cesium进阶教程:Shader与三维GIS可视化实战》
  • 从零开始打造Android桌面Launcher应用:原理剖析与完整实现
  • asp.net企业网站源码网站jquery上传源代码
  • 广州企业网站模板建站龙岩天宫山住宿
  • 单例模式:设计模式中的“独一无二“之道
  • CV论文速递:覆盖3D视觉与场景重建、视觉-语言模型(VLM)与多模态生成等方向!(10.20-10.24)
  • BERT 原理解析:从 Transformer 到双向语义理解
  • 土地流转网站建设项目网站制作步骤是什么
  • 网站开发 教学大纲wordpress一键仿站
  • 网站打开乱码app如何做
  • 【LabelImg】
  • ios26创建Widget不支持灵动岛UI
  • day07 spark sql
  • 如何做网站维护做个什么样的网站比较好
  • 借用与引用实战
  • 涉密资质 网站建设整站seo策略实施
  • 【数据结构】链表补充——静态链表、循环链表、双向链表与双向循环链表