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

Spring Cloud初探之自定义负载均衡策略(五)

背景

这是Spring Cloud Alibaba组件初探的第五篇文章,前面四篇描述了Nacos如何适配Postgresql数据库,微服务注册,客户端负载均衡的使用,通过定时器更新服务实例的元数据和权重值。这篇描述如何自定义服务均衡策略。

Spring Cloud的load balance支持轮询、随机负载策略,阿里也提供了NacosLoadBalancer均衡器(支持集群+权重)。框架默认采用的是轮询的方式。

有时候,项目可能有一些订制化的需求,需要根据采集的其它指标做负载均衡。例如:通过服务的CPU利用率,内存占用率,磁盘空间等指标做个性化的负载均衡调度。当然,这些指标可以折算成权重,再根据权重调度。但将指标折算成权重后,就丢失了原始信息了,特别是多个指标加权,折算结果也不一定合理,反而可能增加调度算法的实现难度。

在指标加权折成算权重比较困难的情况下,可以考虑将指标的原始信息存储在服务实例的元数据里面,让负载均衡器从元数据中拿到原始数据做处理。

定义自己的负载均衡器

定义MyLoadBalancer类,实现ReactorServiceInstanceLoadBalancer提供的接口。可以参考RoundRobinLoadBalancer和RandomLoadBalancer的实现。choose()和processInstanceResponse()这两个方法代码可以直接拿过来用,真正需要调整的是getInstanceResponse()中的服务实例选择逻辑。

下面是RandomLoadBalancer中的getInstanceResponse()实现:

    private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}return new EmptyResponse();} else {int index = ThreadLocalRandom.current().nextInt(instances.size());ServiceInstance instance = (ServiceInstance)instances.get(index);return new DefaultResponse(instance);}}

可以看到,样例代码通过一个随机函数生成下标索引,再根据索引从实例列表中取服务实例。

如果想要基于CPU利用率来做负载均衡:每次选择CPU利用率最低的服务来使用。参考RandomLoadBalancer的实现,在MyLoadBalancer类中实现如下getInstanceResponse()方法:

    private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {LOGGER.error("No servers available for service:{} ", serviceId);return new EmptyResponse();}/*** 选择一个CPU利用率最低的服务实例返回.*/List<CPUUsageCompare> compareModelList = CPUUsageCompare.valueOf(instances);Optional<CPUUsageCompare> minUsageInstance = compareModelList.stream().min((o1, o2) -> {if (o1.getCpuUsage() > o2.getCpuUsage()) {return 1;} else if (o1.getCpuUsage() < o2.getCpuUsage()) {return -1;} else {return 0;}});if (minUsageInstance.isPresent()) {return new DefaultResponse(minUsageInstance.get().getServiceInstance());} else {return new EmptyResponse();}}

CPUUsageCompare是把服务实例和从元数据中提取出的CPU利用率数据做了一下封装,方便做大小比较。完整代码参看文末的github仓库地址。

注入自定义的负载均衡器

/*** 加载自定义的均衡算法配置** @author neo* @since 2025/4/24* @version 1.0*/
@LoadBalancerClient(name = "cloud-server-one", configuration = MyLoadBalanceConfig.class)
public class MyLoadBalanceConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new MyLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

配置调用cloud-server-one服务的接口时使用自定义的负载均衡器。

github仓库地址:https://github.com/ylforever/neo-spring-cloud-server

http://www.xdnf.cn/news/190801.html

相关文章:

  • 让数据优雅落地:用 serde::Deserialize 玩转结构体实体
  • CasaOS上部署1Panel开源运维面板远程在线访问配置实操指南
  • K8s新手系列之K8s中的资源
  • 【杂谈】-人工智能驱动的网络安全威胁:新一代网络钓鱼
  • Azure 数字孪生是什么?
  • ​​HTTP vs HTTPS:传输协议的安全演进与核心差异​
  • 8.Android(通过Manifest配置文件传递数据(meta-data))
  • 近地卫星网络 (Low Earth Orbit Satellite Networks)入门学习笔记
  • Transformer数学推导——Q26 推导多语言Transformer中语言间注意力共享的参数效率公式
  • C语言----操作符详解(万字详解)
  • python 线程池顺序执行
  • 二叉树的所有路径(回溯算法基础)
  • 深度学习---Pytorch概览
  • 3D模型文件格式之《DAE格式介绍》
  • [LeetCode 438/567] 找到字符串中所有字母异位词/字符串的排列(滑动窗口)
  • tsconfig.json的配置项介绍
  • 云原生周刊:Kubernetes v1.33 正式发布
  • 用JavaScript构建3D程序
  • 2025系统架构师---论微服务架构及其应用
  • Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
  • 老电脑优化全知道(包括软件和硬件优化)
  • 【爬虫】一文掌握 adb 的各种指令(adb备忘清单)
  • 【Mybatis】Mybatis基础
  • 集合框架篇-java集合家族汇总
  • 【3D基础】深入解析OBJ与MTL文件格式:Blender导出模型示例及3D开发应用
  • 【KWDB 创作者计划】_企业数据管理的利刃:技术剖析与应用实践
  • CMake:设置编译C++的版本
  • 【北京】昌平区某附小v3700存储双控故障维修案例
  • 分布式链路追踪理论
  • 【Axure视频教程】手电筒效果