SpringCloud的Ribbon自定义负载均衡算法
1.Ribbon默认使用RoundRobinRule策略轮询选择server
| 策略名 | 策略声明 | 策略描述 | 实现说明 |
| BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule |
选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
| AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
| WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。 |
| RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 对选定的负载均衡策略机上重试机制 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
| RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | roundRobin方式轮询选择server | 轮询index,选择index对应位置的server |
| RandomRule | public class RandomRule extends AbstractLoadBalancerRule |
随机选择一个server |
在index上随机,选择index对应位置的server |
ZoneAvoidanceRule |
public class ZoneAvoidanceRule extends PredicateBasedRule |
复合判断server所在区域的性能和server的可用性选择server |
使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 |
切换策略
- @Configuration
- public class ConfigBean {
- // @Bean
- // public RestTemplate getRestTemplate() {
- // return new RestTemplate();
- // }
- @Bean
- @LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
- public RestTemplate getRestTemplate() {
- return new RestTemplate();
- }
- @Bean
- public IRule myRule()
- {
- //return new RoundRobinRule();
- // return new RandomRule();//达到的目的,用我们重新选择的随机算法替代默认的轮询。
- return new RetryRule();
- }
- }
自定义算法:
配置类(必须不能在启动类和启动类下所包含的子包下面)
- public class RandomRule_ZY extends AbstractLoadBalancerRule
- {
- // total = 0 // 当total==5以后,我们指针才能往下走,
- // index = 0 // 当前对外提供服务的服务器地址,
- // total需要重新置为零,但是已经达到过一个5次,我们的index = 1
- // 分析:我们5次,但是微服务只有8001 8002 8003 三台,OK?
- //
- private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
- private int currentIndex = 0; // 当前提供服务的机器号
- public Server choose(ILoadBalancer lb, Object key)
- {
- if (lb == null) {
- return null;
- }
- Server server = null;
- while (server == null) {
- if (Thread.interrupted()) {
- return null;
- }
- List<Server> upList = lb.getReachableServers();
- List<Server> allList = lb.getAllServers();
- int serverCount = allList.size();
- if (serverCount == 0) {
- /*
- * No servers. End regardless of pass, because subsequent passes only get more
- * restrictive.
- */
- return null;
- }
- // int index = rand.nextInt(serverCount);// java.util.Random().nextInt(3);
- // server = upList.get(index);
- // private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
- // private int currentIndex = 0; // 当前提供服务的机器号
- if(total < 5)
- {
- server = upList.get(currentIndex);
- total++;
- }else {
- total = 0;
- currentIndex++;
- if(currentIndex >= upList.size())
- {
- currentIndex = 0;
- }
- }
- if (server == null) {
- /*
- * The only time this should happen is if the server list were somehow trimmed.
- * This is a transient condition. Retry after yielding.
- */
- Thread.yield();
- continue;
- }
- if (server.isAlive()) {
- return (server);
- }
- // Shouldn't actually happen.. but must be transient or a bug.
- server = null;
- Thread.yield();
- }
- return server;
- }
- @Override
- public Server choose(Object key)
- {
- return choose(getLoadBalancer(), key);
- }
- @Override
- public void initWithNiwsConfig(IClientConfig clientConfig)
- {
- // TODO Auto-generated method stub
- }
- }
- @Configuration
- public class MySelfRule {
- @Bean
- public IRule myRule() {
- // return new RandomRule();// Ribbon默认是轮询,我自定义为随机
- return new RandomRule_ZY();// 我自定义为每台机器5次
- }
- }
另一配置类(在启动类包里面)
- @Configuration
- public class ConfigBean {
- // @Bean
- // public RestTemplate getRestTemplate() {
- // return new RestTemplate();
- // }
- @Bean
- @LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
- public RestTemplate getRestTemplate() {
- return new RestTemplate();
- }
- // @Bean
- // public IRule myRule()
- // {
- // //return new RoundRobinRule();
- // return new RandomRule();//达到的目的,用我们重新选择的随机算法替代默认的轮询。
- // return new RetryRule();
- // }
- }
启动类
- @SpringBootApplication
- @EnableEurekaClient
- //在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效
- //@RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
- @RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
- public class DeptConsumer80_App {
- public static void main(String[] args) {
- SpringApplication.run(DeptConsumer80_App.class, args);
- }
- }
测试效果为每个server执行5次再轮询
转自:https://blog.csdn.net/flynn_chen/article/details/80631717
SpringCloud的Ribbon自定义负载均衡算法的更多相关文章
- SpringCloud全家桶学习之客户端负载均衡及自定义负载均衡算法----Ribbon(三)
一.Ribbon是什么? Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具(这里区别于nginx的负载均衡).简单来说,Ribbon是Netf ...
- Ribbon源码分析(一)-- RestTemplate 以及自定义负载均衡算法
如果只是想看ribbon的自定义负载均衡配置,请查看: https://www.cnblogs.com/yangxiaohui227/p/13186004.html 注意: 1.RestTemplat ...
- SpringCloud Netflix Ribbon(负载均衡)
⒈Ribbon是什么? Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负 ...
- java框架之SpringCloud(4)-Ribbon&Feign负载均衡
在上一章节已经学习了 Eureka 的使用,SpringCloud 也提供了基于 Eureka 负载均衡的两种方案:Ribbon 和 Feign. Ribbon负载均衡 介绍 SpringCloud ...
- springcloud 之Ribbon客户端负载均衡配置使用
pom.xml添加配置说明:这里服务注册与发现用的是Eureka,所以消费者端需要引入eureka,使用EurekaClient来调用服务 <dependency> <groupId ...
- SpringCloud实战-Ribbon客户端负载均衡
前面我们已经完成了注册中心和服务提供者两个基础组件.接着介绍使用Spring Cloud Ribbon在客户端负载均衡的调用服务. ribbon 是一个客户端负载均衡器,可以简单的理解成类似于 ngi ...
- SpringCloud之Ribbon:负载均衡
Spring Cloud集成了Ribbon,结合Eureka,可实现客户端的负载均衡. 下面实现一个例子,结构下图所示. 一.服务器端 1.创建项目 开发工具:IntelliJ IDEA 2019.2 ...
- Ribbon自定义负载均衡策略,在网关实现类似Ip_hash的负载均衡,ribbon给单个服务配置属性
背景: 我需要在网关实现一种功能,某个用户的请求永远打在后台指定的服务,也就是根据ip地址进行负载均衡 原理: 在ribbon的配置类下: 那我们自己创建一个IRule的实现类,模仿ZoneAvoid ...
- Spring Cloud Gateway Ribbon 自定义负载均衡
在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...
随机推荐
- 思考一个问题STM32的
如果一个定时中断刚刚进入中断服务函数 但是服务函数执行时间太长 又一次触发了中断 会怎样
- C语言的指针数组与指针数组
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
- linux免密传输文件 nc
nc命令很强大,用来在内网传输小文件也不错,最主要的是仅一次传输的情况下不需要用户和密码即可直接接受与发送文件 不管是linux2linux 还是 linux2windows皆可 先决条件: 1.使用 ...
- Django(38)mac安装redis
安装redis 1.使用Homebrew安装Redis brew install redis 执行上述命令后出现以下内容,则成功安装 Download failed: https://mirrors. ...
- [leetcode] 68. 文本左右对齐(国区第240位AC的~)
68. 文本左右对齐 国区第240位AC的~我还以为坑很多呢,一次过,嘿嘿,开心 其实很简单,注意题意:使用"贪心算法"来放置给定的单词:也就是说,尽可能多地往每行中放置单词. 也 ...
- Nginx_学习笔记
Nginx_学习笔记 01-Nginx 课程介绍 02-Nginx 的简介 1. 什么是 Nginx ? 03-Nginx 相关概念(正向和反向代理) 1. 什么是反向代理?能否简要画出其示意图 2. ...
- 08.ElementUI 2.X 源码学习:源码剖析之工程化(三)
0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...
- halcon——缺陷检测常用方法总结(频域空间域结合)
摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...
- 1-3. SpringBoot基础,Java配置(全注解配置)取代xml配置
最近突发奇想,整合一下以前一些学习笔记,分享自己这几年爬过的坑,逐步更新文章,谢谢大家的关注和支持. 这节讲一下SpringBoot的学习必须的一些基础,Java配置.其实在Spring2.0时代就已 ...
- ES5中的类
之前小编对于类和类的基本特征(所谓的封装.继承.多态)理解一直不是很到位,同时在实际项目应用中也用的比较少,今天小编就结合ES5中的基本用法和大家聊聊,希望小伙伴会在这篇文章有属于自己的收获,并能够在 ...