当前位置:网站首页>Ribbon自定义修改负载均衡
Ribbon自定义修改负载均衡
2022-07-29 15:12:00 【great-sun】
Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。
如果使用的RestTemplate进行服务调用,那么创建RestTemplate的方法上面加@LoadBalanced注解就会开启Ribbon的负载均衡,Ribbon负载均衡有以下7中规则,默认轮询
修改负载均衡规则为随机
1.建立自定义配置类,自定义配置类不能放在@ComponentScan当前包和和子包下,否则会被所有Ribbon客户端所共享
@Configuration
public class MyRuleConfig {
@Bean
public IRule rule(){
return new RandomRule();
}
}
2.启动类上根据自己需求添加全局注解或者局部注解RibbonClients
//针对全局修改
@RibbonClients(defaultConfiguration = MyRuleConfig.class)
//针对某个服务修改
@RibbonClient(name = "cloud-payment-service",configuration = MyRuleConfig.class)
3.结合OpenFeign写一个自定义的负载均衡规则
1.实现一个OpenFeign跨进程调用服务的例子(https://blog.csdn.net/weixin_44728473/article/details/126043232?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22126043232%22%2C%22source%22%3A%22weixin_44728473%22%7D&ctrtid=pfPyf)
2.自定义一个类继承AbstractLoadBalancerRule 接口 模拟的业务逻辑,对i取模,为零的返回权重小的服务 的ip地址和端口号,不为零返回权重大的服务
public class MyRule extends AbstractLoadBalancerRule {
//Nacos自带的自定义配置
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
//AtomicInteger线程安全
public static AtomicInteger count = new AtomicInteger(0);
Server server = null;
@SneakyThrows
@Override
public Server choose(Object key) {
//BaseLoadBalancer为bstractLoadBalancerRule 基类
BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
//获取到服务名
String name = loadBalancer.getName();
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
List<Instance> instances = namingService.selectInstances(name, true);
/* * 模拟的业务逻辑 * 对i取模,为零的返回权重小的服务 的ip地址和端口号 * 不为零返回权重大的服务 * */
/*获取服务最大权重*/
Instance instanceMax = instances.stream().max(Comparator.comparing(Instance::getWeight)).get();
/*获取服务最小权重*/
Instance instanceMin = instances.stream().min(Comparator.comparing(Instance::getWeight)).get();
/*相当于i++*/
int i = count.getAndAdd(1);
int mod = i % 5;
if (mod == 0) {
server = new Server(instanceMin.getIp(), instanceMin.getPort());
} else {
server = new Server(instanceMax.getIp(), instanceMax.getPort());
}
return server;
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}
2.自定义配置类(RibbonClient可以加在任何地方)
@Configuration
//针对全局修改
//@RibbonClients(defaultConfiguration = MyRuleConfig.class)
//针对某个服务修改
@RibbonClient(name = "nacos-app-a", configuration = MyRuleConfig.class)
public class MyRuleConfig {
@Bean
public IRule rule() {
//返回上面自定义的规则类
return new MyRule();
}
}
边栏推荐
- Qt combat | how to access the USB device information?
- LeetCode·每日一题·593.有效的正方形·数学
- 驱动领域DDD的微服务设计和开发实战
- 数据分析的重要性
- 药品研发--质理研究人员绩效办法
- Micro combat | centralized configuration service center Config asymmetric encryption and security management
- 3C数码行业供应商管理方案——与供应商结为“成长共同体”
- cmake(14):利用set_property命令设置全局属性
- 3分钟带你了解微信小程序开发
- UFLO:5、启动任务并自动完成第一个人工任务
猜你喜欢
随机推荐
cmake(14):利用set_property命令设置全局属性
进入中国27年,又一美妆巨头要离场
QT连接Mysql数据库(详细成功版)
BGP federation experiment
LeetCode·621.任务调度器·构造法
药物研发---信息部门考核办法
企业级存储详解与存储资源盘活
边缘计算如何与小程序结合?智能家居如何借势发展?
【 LeetCode 】 1. The sum of two Numbers
小学生学程序---百变服装
论人生自动化
【Go语言刷题篇】Go完结篇函数、结构体、接口、错误入门学习
NDK 系列(5):JNI 从入门到实践,爆肝万字详解!
Instant Messaging - New Software that Changes Social and Work Status
RestTemplate下载文件的另一种方式
观光公交题解
错误# 6633:实际的类型参数不同于空变量的类型。
【GoLang】Sync lock
双非渣渣的上岸之路!备战 60 天,三战滴滴侥幸收获 Offer
泰芯TXW8301打造新一代8路无线监控NVR套装解决方案