SpringCloud之LoadBalancer自定义负载均衡算法,基于nacos权重

LoadBalancer基于Nacos权重自定义负载算法

ReactorLoadBalancer接口,实现自定义负载算法需要实现该接口,并实现choose逻辑,选取对应的节点

public interface ReactorLoadBalancer<T> extends ReactiveLoadBalancer<T> {Mono<Response<T>> choose(Request request);default Mono<Response<T>> choose() {return this.choose(REQUEST);}
}

RoundRobin算法核心源码

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 {//通过cas的position变量自增,循环 % 实例数。int pos = Math.abs(this.position.incrementAndGet());ServiceInstance instance = (ServiceInstance)instances.get(pos % instances.size());return new DefaultResponse(instance);}}

nacos权重

nacos可以配置不同实例的权重信息,可以在

  1. yaml中配置spirng.cloud.nacos.discovery.weight 数值范围从1-100 ,默认为1
  2. 可以在nacos面板找到该实例信息,并实时配置实例的权重

在这里插入图片描述

在这里插入图片描述

基于nacos权重实现自定义负载

权重:数值越高,代表被选取的概率越大.

根据RoundRobin源码,自定义NacosWeightLoadBalancer

package cn.axj.loadbalancer;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.DefaultResponse;
import org.springframework.cloud.client.loadbalancer.EmptyResponse;
import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.Response;
import org.springframework.cloud.loadbalancer.core.*;
import reactor.core.publisher.Mono;import java.util.*;
import java.util.concurrent.ThreadLocalRandom;/*** 基于nacos权重的负载均衡
*/
public class NacosWeightLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(NacosWeightLoadBalancer.class);private final String serviceId;private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;//nacos权重获取名称,在nacos元数据中private static final String NACOS_WEIGHT_NAME = "nacos.weight";public NacosWeightLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map((serviceInstances) -> {return this.processInstanceResponse(supplier, serviceInstances);});}private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(serviceInstances);if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {((SelectedInstanceCallback)supplier).selectedServiceInstance(serviceInstanceResponse.getServer());}return serviceInstanceResponse;}private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}} else {//根据权重选择实例,权重高的被选中的概率大//nacos.weight的值越大,被选中的概率越大Double totalWeight = 0D;for (ServiceInstance instance : instances) {String s = instance.getMetadata().get(NACOS_WEIGHT_NAME);double weight = Double.parseDouble(s);totalWeight = totalWeight + weight;//放置当前实例的权重区间instance.getMetadata().put("weight",String.valueOf(totalWeight));}//随机获取一个区间类的数值,nacos权重越大,区间越大,则随机数值落到相应的区间的概率是由区间的大小来决定的。double index = ThreadLocalRandom.current().nextDouble(totalWeight);//根据权重区间选择实例for (ServiceInstance instance : instances) {double weight = Double.parseDouble(instance.getMetadata().get("weight"));if (index <= weight) {return new DefaultResponse(instance);}}}return new EmptyResponse();}
}

配置使用

增加WeightLoadBalanceConfiguration

public class WeightLoadBalanceConfiguration {@Beanpublic ReactorLoadBalancer<ServiceInstance> weightLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new NacosWeightLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

修改主类配置

@LoadBalancerClients({@LoadBalancerClient(name = "loadbalance-provider-service", configuration = WeightLoadBalanceConfiguration.class)
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/620659.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果 一、简单介绍 二、简单给视频添加水印图片效果实现…

跨境业务为什么要做Yandex推广?

随着全球化进程的不断加速&#xff0c;越来越多的企业开始寻求跨境发展机遇&#xff0c;尤其是在极具潜力的海外市场中寻找新的增长点。其中&#xff0c;俄罗斯及其周边地区因其庞大的市场规模和消费需求&#xff0c;成为众多企业瞄准的焦点。要在这一区域成功展开业务并触及目…

2024年Facebook广告新手教学与投放技巧大全

截止2024年1月&#xff0c;Facebook的每月活跃用户就超过了30亿&#xff0c;逐渐成为全球最受欢迎的社交媒体平台。许多广告主也纷纷用Facebook投放广告并获得了不错的效果&#xff0c;本篇文章将为广告新手提供全面的Facebook广告投放教程&#xff0c;从基础概念到Facebook广告…

prometheus metrics 添加元数据

1. 背景 当使用 Prometheus 监控多个 Kubernetes 集群时,如果没有合适的标签管理,alertmanager 在接收到警告时可能无法识别是哪个集群产生的警告。这可能会带来一些挑战: 警告上下文缺失: 当 alertmanager 接收到警告时,如果没有集群标识信息,很难确定警告来自哪个集群。这会…

文献速递:深度学习肝脏肿瘤诊断---基于深度学习的肝细胞结节性病变在整片组织病理图像上的分类

Title 题目 Deep Learning-Based Classification of Hepatocellular Nodular Lesions on Whole-Slide Histopathologic Images 基于深度学习的肝细胞结节性病变在整片组织病理图像上的分类 Background 背景 Hepatocellular nodular lesions (HNLs) constitute a heterogen…

Unity | Shader基础知识(第十二集:颜色混合)

目录 前言 一、日常生活中的常见现象 二、unity自带的一个结构体&#xff08;表面着色器SurfaceOutputStandard&#xff09; 三、自己写一个颜色混合的Shader 1.只加基础颜色Albedo 2.加入法线 3.加入光滑度 4.加入金属度 5.加入自发光 四、作者的话 前言 shader里每一…

Git-常规用法-含解决分支版本冲突解决方法

目录 前置条件 已经创建了Gitee账号 创建一个远程仓库 Git的优点 版本控制 Git 下载 Git的使用 检查Git的是否安装成功 git的常用命令 常用流程 Git 分支 分支流程 Git 远程仓库 远程仓库流程 特殊 可能遇到的问题 前置条件 已经创建了Gitee账号 创建一个远程仓…

Macs Fan Control Pro for Mac:全面优化Mac散热的得力助手

Macs Fan Control Pro for Mac是一款专为苹果电脑用户设计的风扇控制软件&#xff0c;旨在通过精确的风扇速度调节&#xff0c;全面优化Mac的散热性能&#xff0c;确保系统始终运行在最佳状态。 Macs Fan Control Pro for Mac v1.5.17中文版下载 该软件具备实时监控功能&#x…

中仕公考:教师招聘和事业单位联考的区别

教师招聘考试与事业单位联考作为两种不同的职业资格考试&#xff0c;其在报考条件和考试内容上存在明显的差异&#xff0c;具体内容为大家简要介绍一下&#xff1a; 一、报考条件 1. 教师招聘考试&#xff1a;此类考试的报名通常要求申请者持有相关教师资格证明。对于非师范生…

Maven配置的修改

在集团做java实习生的第一天&#xff0c;我的leader给了我项目的代码&#xff0c;并且还有一个settings.xml文件&#xff0c;当时很懵&#xff0c;不知道这个文件是干啥的&#xff0c;当然有的小伙伴可能一眼就认出来了&#xff0c;这个配置文件是做什么&#xff0c;是做maven配…

三个截然不同的爆仓案例,值得每个交易者反思

用铜做镜子&#xff0c;能端正衣冠&#xff1b;以史为镜可知兴&#xff1b;以人为镜能明得与失得。”做买卖&#xff0c;需要以他人的得失为鉴&#xff0c;这样才会不断地反思持续地提高持续地进步。在这篇文章中&#xff0c;我们会分享3个完全不同的爆仓案例给交易者一个“与明…

Maven超详细使用

定义 是一款用于管理和构建java项目的工具 作用 1. 依赖管理 2. 统一项目结构 3. 项目构建 项目目录结构 POM 项目对象模型 (Project Object Model) POM (Project Object Model) &#xff1a;指的是项目对象模型&#xff0c;用来描述当前的maven项目。 仓库 本地仓库&#…