LoadBalance自定义负载均衡策略
LoadBalance已有策略
LoadBalance的源码中已有两种策略,RandomLoadBalancer(随机)、RoundRobinLoadBalancer(轮询,默认的负载均衡策略)。
LoadBalance自定义策略
以下为使用自定义负载均衡策略的样例,根据配置服务提供者的权重,按比例随机访问服务器。仅展示自定义负载均衡策略相关的部分,Eureka等其他相关代码不作展示。提供两个服务提供者,端口分别为11000,11001。
自定义负载均衡策略
public class WeightLoadBalancer implements ReactorServiceInstanceLoadBalancer {final String serviceId;ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public WeightLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map(this::select);}private Response<ServiceInstance> select(List<ServiceInstance> instances) {if (instances.isEmpty()) {return new EmptyResponse();}// 简单模拟权重,仅作演示// 11000:3 11001:1int[] ports = {11000, 11000, 11000, 11001};int port = ports[ThreadLocalRandom.current().nextInt(ports.length)];for (ServiceInstance instance : instances) {if (port == instance.getPort()) {return new DefaultResponse(instance);}}return new DefaultResponse(instances.get(0));}
}
LoadBalance配置类
public class MyLoadBalanceConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);// 随机
// return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);// 轮询
// return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);// 权重,自定义return new WeightLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
启动类设置LoadBalance配置
@SpringBootApplication
@EnableDiscoveryClient
@LoadBalancerClients(@LoadBalancerClient(name = "cloud-payment-service", configuration = MyLoadBalanceConfig.class)
)
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}
调用的Controller
@Controller
@RequestMapping("/order")
public class OrderController {@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/loadBalance")public void loadBalance(){ServiceInstance instance = loadBalancerClient.choose("cloud-payment-service");System.out.println("port:" + instance.getPort());}
}
多次访问的效果如下:
port:11000
port:11000
port:11000
port:11000
port:11000
port:11000
port:11001
port:11000
port:11000
port:11000
port:11001
port:11000
port:11000
port:11001
LoadBalance自定义负载均衡策略相关推荐
- SpringCloud Ribbon(二)之自定义负载均衡策略IRule
一.Ribbon负载均衡策略 一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个 ...
- Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)
文章目录 Pre 需求 工程 Code 继承AbstractLoadBalancerRule实现自定义Rule 随机权重策略 配置 验证 源码 Pre Spring Cloud Alibaba - 0 ...
- Ribbon 自定义负载均衡策略
Ribbon默认的负载均衡策略默认的有下面几种: 我们也可以自定义负载均衡策略: 修改springcloud-consumer-dept-80的主启动类: 下面开始编写自定义配置类MySelfRule ...
- Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)
文章目录 Pre 工程 首先屏蔽细粒度配置 然后通过代码设置一个全局配置 指定 GlobalRibbonConfig GlobalRibbonConfig 设置负载均衡策略 开发自定义策略 (权重访问 ...
- 自定义负载均衡策略:
我们刚刚讲过,只要实现了IRule就可以完成自定义负载均衡,至于具体怎么来,我们先看看他默认的实现 /*** Copyright 2013 Netflix, Inc.** Licensed under ...
- 追踪源码自定义负载均衡策略
我们来了解一下负载均衡的源码,是怎么实现的,它是怎么实现的,开始我们说了第三种方式只是用了一个注解,实质上是和第二种方式是一模一样的,那么为了方便观察呢,这里使用第二种方式,来查看源码ServiceI ...
- spring cloud中通过配置文件自定义Ribbon负载均衡策略
2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...
- SpringCloud Ribbon中的7种负载均衡策略!
作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而 ...
- tedu 四阶段springcloud学习day02学习总结(idea连接数据库/nacos远端调用及负载均衡策略/Feign方式远端调用)
目录 查看接口有哪些实现类 ctrl + h 一.cmd方式启动Nacos的命令 二.在IDEA中打开MySQL数据库 第一步: 打开View中数据库的工具栏 第二步:添加数据库为MySql 第三步: ...
最新文章
- commons-lang StringUtils#split的坑
- agx 安装ros opencv_怎样在ROS下实现基于YOLO的px4无人机目标检测?
- Mac OS使用技巧之十三:Finder中标记的使用
- P4249-[WC2007]剪刀石头布【费用流】
- php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序
- C#开发笔记之01-为什么开源框架会大量的使用protected virtual?
- 荣耀折叠屏手机发布日期曝光?将主打年轻用户
- java拆分list_Java平均拆分list
- springboot项目层次结构_Springboot项目结构Springboot项目结构
- 基于扩展性考虑,不同场景选择的不同方案
- 2021-06-26初识JavaScript
- matlab 7.0安装教程
- 判断是否为回文字符串
- 软件测试的目的、原则及流程
- Mezzanine基于 Django 的CMS系统框架搭建
- 邮箱注册的html怎么写,邮箱格式怎么写 邮箱的正确写法
- SSD硬盘,先不要用在Server上
- 关系数据模型和SQL基础
- 为什么理工类专业成绩好的人,英语总是很差?
- error: cannot connect to daemon解决办法