尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

自定义Spring Cloud LoadBalancer实践

自定义Spring Cloud LoadBalancer实践
📅 发布时间:2026/6/19 15:39:57

Spring Cloud负载均衡概述

在不同的Spring Cloud版本中,采用了不同的负载均衡组件。
具体来说,在Spring Cloud 2020.0版本之前,默认负载均衡器为Netflix推出的Ribbon,自Spring Cloud 2020.0版本起,Ribbon已经被标记为过时,官方推荐使用Spring Cloud LoadBalancer。

在本文中阐述的是如何自定义Spring Cloud LoadBalancer默认实现,对应的框架版本信息如下:

  • Spring Cloud版本:2021.0.5
  • Spring Cloud Aliaba版本:2021.0.5.0
  • Spring Boot版本:2.6.13

自定义Spring Cloud LoadBalancer默认实现

在Spring Cloud LoadBalancer组件中,默认的负载均衡器配置是通过org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientConfiguration.reactorServiceInstanceLoadBalancer()方法实现的。

@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
public class LoadBalancerClientConfiguration {@Bean@ConditionalOnMissingBeanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);// 在Spring Cloud LoadBalancer组件中,默认的负载均衡器是RoundRobinLoadBalancerreturn new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

从源码来看,Spring Cloud LoadBalancer组件的默认负载均衡器为org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer,它通过轮训方式为服务消费者路由服务提供者。

值得注意的是,org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientConfiguration.reactorServiceInstanceLoadBalancer()方法只会在首次调用RPC服务提供者时才会被调用,不同的RPC服务提供者首次访问都会调用,可以根据该机制为不通的服务提供者定制不同的负载均衡策略。

如果需要自定义配置负载均衡器,需要通过注解@LoadBalancerClients的defaultConfiguration属性指定才会生效。

自定义负载均衡路由器:

/*** 基于XXL-JOB定时任务执行器的分片信息进行下游服务的路由*/
public class ShardBasedLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Logger logger = LoggerFactory.getLogger(ShardBasedLoadBalancer.class);private final String serviceId;private final ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplier;private final Random random = new Random();/*** 构造函数* @param serviceInstanceListSupplier 实例列表供应商* @param serviceId 目标服务名*/public ShardBasedLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplier, String serviceId) {this.serviceInstanceListSupplier = serviceInstanceListSupplier;this.serviceId = serviceId;}/*** 重写选择服务提供者方法* @param request 请求对象* @return {@link Response}*/@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = serviceInstanceListSupplier.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get().next().map(instances -> {if (instances.isEmpty()) {if (logger.isWarnEnabled()) {logger.warn("No servers available for service:{}", serviceId);}return new EmptyResponse();}// 根据定时任务的路由策略选择下游服务提供者int shardTotal = 0;int shardIndex = 0;ServiceInstance targetInstance;if ((shardIndex == 0 && shardTotal == 0) || (shardTotal > instances.size())) {// 不是分片广播策略,或者在分片广播策略时执行器数量大于下游服务提供者数量targetInstance = instances.get(random.nextInt(instances.size()));} else {targetInstance = instances.get(shardIndex);}return new DefaultResponse(targetInstance);});}
}

在配置类中加载自定义负载均衡器(注意:不要在在配置类上使用@Configuration注解):

public class LoadBalancerConfig {@Bean@ConditionalOnMissingBeanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {// 获取要调用的目标服务名String serviceName = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new ShardBasedLoadBalancer(loadBalancerClientFactory.getLazyProvider(serviceName, ServiceInstanceListSupplier.class), serviceName);}
}

通过@LoadBalancerClients注解指定负载均衡配置类:

@EnableDiscoveryClient   // 启用服务注册与发现
@EnableFeignClients // 启用Feign
@SpringBootApplication
@LoadBalancerClients(defaultConfiguration = LoadBalancerConfig.class) // 指定负载均衡配置类
public class SampleAppApplication {public static void main(String[] args) {SpringApplication.run(SampleAppApplication.class, args);}
}

【参考】
Spring Cloud Alibaba全家桶(三)——微服务负载均衡器Ribbon与LoadBalancer
LoadBalancer和Ribbon的区别是什么?
Spring Cloud:负载均衡 - Spring Cloud Loadbalancer原理


作者:编程随笔
出处:http://www.cnblogs.com/nuccch/
声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。

相关新闻

  • SAP折旧模拟超过1000条资产dump问题及解决
  • Matplotlib常见画图工具
  • ABP - 当前用户 [ICurrentUser、CurrentUser]

最新新闻

  • 修复kkFileView XSS漏洞与POI文件预览兼容性问题实战
  • 弱监督学习与概率提示技术在3D目标检测中的应用
  • Hoppscotch自托管部署与API自动化测试实战指南
  • Qwen3.6-A3B:面向本地Agent的MoE实时推理引擎解析
  • 微信防撤回失效?RevokeMsgPatcher 2.0 技术原理与实战指南
  • 普宁连锁眼镜店哪家靠谱|自营和加盟的本质区别是什么 - 品牌观察

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号