Ribbon的常用负载均衡策略详细分析技术干货

教育行业A股IPO第一股(股票代码003032)

全国咨询/投诉热线:400-618-4000

因为微服务是目前互联网公司比较流行的架构,所以spring就提供了一个顶级框架-springcloud,来解决我们在开发微服务架构中遇到的各种各样的问题,今天的主角是springcloud框架中集成的组件Ribbon,那么Ribbon能解决什么问题呢,我们来思考下面的问题。

微服务架构中的每个服务为了高可用,很大程度上都会进行集群,我们假设现在集群了3个user服务,同时能提供相同的服务,问题来了,我们如何决定调用这3个user服务中的哪一个呢?

根据不同分析角度,会有不同的答案,也可以理解为根据不同的情况,我们可以写不同的算法,来决定到底此时此刻,调用这3个user服务的哪一个,那么,Ribbon就给我们提供了不同的算法,我们可以根据业务场景,调整配置文件,决定到底使用哪个算法,这样,算法中就会计算出调用哪个user服务了。

1)我们准备一个eureka注册中心

2)再准备一个order服务

3)再准备3个相同代码的user服务,这样,order服务通过eureka注册中心,就可以发现user的3个服务

Ribbon是通过IRule的这个接口来选择3个user服务中的哪个的,但是实际执行的代码肯定是继承了这个接口的实现类,所以选择不同的实现类,就会选择不同负载均衡策略

publicinterfaceIRule{Serverchoose(Objectvar1);voidsetLoadBalancer(ILoadBalancervar1);ILoadBalancergetLoadBalancer();}3.1.RoundRobinRule轮询策略此策略是Ribbon的默认策略,是按照顺序,依次对所有的user服务进行访问。

通过重写IRule的choose方法,来选择并返回决定调用的user服务,在下面的源码中,ListallServers=lb.getAllServers();获得了所有的3个user服务实例,intnextServerIndex=this.incrementAndGetModulo(serverCount);保存了当前调用的user实例的序号,然后就可以按照顺序调用下一个user服务了

publicServerchoose(ILoadBalancerlb,Objectkey){if(lb==null){log.warn("noloadbalancer");returnnull;}else{Serverserver=null;intcount=0;while(true){if(server==null&&count++<10){ListreachableServers=lb.getReachableServers();ListallServers=lb.getAllServers();intupCount=reachableServers.size();//总服务实例数量intserverCount=allServers.size();if(upCount!=0&&serverCount!=0){intnextServerIndex=this.incrementAndGetModulo(serverCount);server=(Server)allServers.get(nextServerIndex);if(server==null){Thread.yield();}else{if(server.isAlive()&&server.isReadyToServe()){returnserver;}server=null;}continue;}log.warn("Noupserversavailablefromloadbalancer:"+lb);returnnull;}if(count>=10){log.warn("Noavailablealiveserversafter10triesfromloadbalancer:"+lb);}returnserver;}}}debug的图例:

第一次访问:访问的是第一个实例

第二次访问:访问的是第二个实例

就和这个策略的名字一样,是对user的3个服务的随机调用,所以不存在规律,如下源码中intindex=this.chooseRandomInt(serverCount);通过随机数来选择下标,所以对user服务的调用是随机的

publicServerchoose(ILoadBalancerlb,Objectkey){if(lb==null){returnnull;}else{Serverserver=null;while(server==null){if(Thread.interrupted()){returnnull;}ListupList=lb.getReachableServers();ListallList=lb.getAllServers();intserverCount=allList.size();if(serverCount==0){returnnull;}intindex=this.chooseRandomInt(serverCount);server=(Server)upList.get(index);if(server==null){Thread.yield();}else{if(server.isAlive()){returnserver;}server=null;Thread.yield();}}returnserver;}}debug的图例:

第二次访问:访问的还是第一个实例

第三次访问:访问的是第三个实例

extendsRoundRobinRulepublicServerchoose(ILoadBalancerlb,Objectkey){if(lb==null){returnnull;}else{Serverserver=null;while(server==null){ListcurrentWeights=this.accumulatedWeights;if(Thread.interrupted()){returnnull;}ListallList=lb.getAllServers();intserverCount=allList.size();if(serverCount==0){returnnull;}intserverIndex=0;doublemaxTotalWeight=currentWeights.size()==00.0D:(Double)currentWeights.get(currentWeights.size()-1);//在30秒之内,maxTotalWeight变量会一直是0.0if(maxTotalWeight>=0.001D&&serverCount==currentWeights.size()){doublerandomWeight=this.random.nextDouble()*maxTotalWeight;intn=0;for(Iteratorvar13=currentWeights.iterator();var13.hasNext();++n){Doubled=(Double)var13.next();if(d>=randomWeight){serverIndex=n;break;}}server=(Server)allList.get(serverIndex);}else{server=super.choose(this.getLoadBalancer(),key);if(server==null){returnserver;}}if(server==null){Thread.yield();}else{if(server.isAlive()){returnserver;}server=null;}}returnserver;}}debug的图例:

前几次访问:maxTotalWeight都是0.0,使用轮询策略,但是开始缓存权重数据

30秒之后:开始根据权重数据来分配权重,选择实例

如下图:8081端口的权重显然没有8082的权重大,所以8082端口的user服务实例被访问的次数多

重试策略是指通过轮询策略选出一个实例,然后去访问,如果此实例为null或者已经失效,那么会重试其他的实例,answer=this.subRule.choose(key);会根据轮询策略选择一个实例,然后if((answer==null||!answer.isAlive())&&System.currentTimeMillis()

publicServerchoose(ILoadBalancerlb,Objectkey){longrequestTime=System.currentTimeMillis();longdeadline=requestTime+this.maxRetryMillis;Serveranswer=null;answer=this.subRule.choose(key);if((answer==null||!answer.isAlive())&&System.currentTimeMillis()=deadline){break;}Thread.yield();}task.cancel();}returnanswer!=null&&answer.isAlive()answer:null;}

会根据每个服务实例的并发数量来决定,访问并发数最少的那个服务,intconcurrentConnections=serverStats.getActiveRequestsCount(currentTime);会获得当前遍历的实例的并发数,然后和其他的实例的并发数进行判断,最终访问并发量最少的那个实例

publicServerchoose(Objectkey){if(this.loadBalancerStats==null){returnsuper.choose(key);}else{ListserverList=this.getLoadBalancer().getAllServers();intminimalConcurrentConnections=2147483647;longcurrentTime=System.currentTimeMillis();Serverchosen=null;Iteratorvar7=serverList.iterator();while(var7.hasNext()){//遍历所有的实例Serverserver=(Server)var7.next();ServerStatsserverStats=this.loadBalancerStats.getSingleServerStat(server);if(!serverStats.isCircuitBreakerTripped(currentTime)){intconcurrentConnections=serverStats.getActiveRequestsCount(currentTime);//判断并发数,并和已经判断出的最少的并发数比较if(concurrentConnections

publicServerchoose(Objectkey){intcount=0;for(Serverserver=this.roundRobinRule.choose(key);count++<=10;server=this.roundRobinRule.choose(key)){//通过predicate来过滤if(this.predicate.apply(newPredicateKey(server))){returnserver;}}//过滤掉一些服务之后,会采用轮询的方式调用剩下的服务returnsuper.choose(key);}3.7.ClientConfigEnabledRoundRobinRule自定义策略此策略本身并没有实现什么特殊的处理逻辑,但是可以通过重置LoadBalancer来达到自定义一些高级策略的目的,可以重写initWithNiwsConfig和setLoadBalancer

THE END
1.一篇文章认识性能测试响应时间通过在被测系统上不断增加压力,直到性能指标,例如“响应时间”超过预定指标或者某种资源使用已经达到饱和状态。 特点: (1) 主要目的是找到系统处理能力的极限。 (2) 需要在给定的测试环境下进行,通常也需要考虑被测系统的业务压力量和典型场景,使得测试结果具有业务上的意义。 https://blog.csdn.net/yjt2045263063/article/details/138579861
2.响应时间是什么意思响应时间的意思1、响应时间是一个计算机,显示器成像等多个领域的概念,在网络上,指从空载到负载发生一个步进值的变化时,传感器的响应时间。2、通常定义为测试量变化一个步进值后,传感器达到最终数值90%所需要的时间。网络对整体响应时间的影响是通过不同机制完成的。 3、在图像领域的液晶显示器响应时间,是液晶显示器各像素点对输https://edu.iask.sina.com.cn/jy/2Ei2vJSWZK3.html
3.关注某个业务的响应时间,可以将该业务定义为亲亲,您好很高兴为您服务。关注某个业务的响应时间,可以将该业务为系统响应时间业务 https://wen.baidu.com/question/434468830653899012.html
4.HTTP(RESTful)API响应时间分析及SLA定义HTTP (RESTful) API 响应时间分析及SLA定义 查看原文 性能测试指标笔记 1、前端性能测试:指web客户端对服务器返回的数据进行解析并界面展示的时间性能,通常与浏览器有关。在Firefox浏览器中,可以使用Firebug的网络菜单页面,查看每个请求从发出请求到响应的处理服务端响应时间指应用系统从请求发出到客户端接收到数据https://www.pianshen.com/article/85671562620/
5.福建工程学院旗山校区10kv高压电房设备元件采购项目附件※根据上述资格要求,供应商响应文件中应提交的“资格证明文件”相关规定和资料要求,详见竞争性谈判须知前附表和谈判文件第五章。 7.供应商报名期限:详见谈判公告或更正公告(若有),若不一致,以更正公告(若有)为准。 7.1如果采购过程中有发出更正公告,采购人将根据实际情况确定是否延长报名期限,则报名截止时间以更正公https://zfcg.czt.fujian.gov.cn/upload/document/20221220/663c7a2960f54205a8c652527b008bd8.html
6.性能分析之可悲的响应时间腾讯云开发者社区不止一次并且在不同的场合都被问到了响应时间该如何分析和定义的问题。问题大概是两种: 我们的系统性能差,应该如何分析响应时间呢? 响应时间的长短如何定义呢?258原则是否适用? 最大值多长算是不可接受呢? 不同的系统怎么定最大值呢? 我们这个系统是做电商的,应该怎么定最大响应时间、最优响应时间呢? https://cloud.tencent.com/developer/article/1465672
7.响应时间和输入延迟怎么区分94CTO搜一搜响应时间和输入延迟是两个不同的概念,它们在定义、影响和应用场景等方面有所不同。具体分析如下: 1. 定义 - 响应时间:指的是从接收到指令到屏幕显示图像所需的时间。这是液晶拼接屏中一个关键的性能参数,直接影响画面的切换和运动效果。较短的响应时间可以带来更流畅的视觉体验。 https://www.94cto.com/search/content/id/154322
8.GB5135.12003:3术语定义符号和单位注册消防工程师是喷头动作灵敏度的度量,表示为RTI=τu0.5,τ为热敏感元件的时间常数,单位为s;u为气体流速,单位为m/s。响应时间系数的符号为RTI,单位为(m·s)0.5。 3.4标准方位 standard deviation 当热敏感元件对称时,标准方位为使气流方向既垂直于喷头水流的轴线又垂直于其轭臂所在平面的方位。当热敏感元件为非对称时,标准https://www.educity.cn/xfgcs/1953987.html
9.电竞显示器响应时间为什么有低中高级别?在飞碟图中表现为蓝色的诡异的影子,所以叫做“鬼影”;而拖影则来自响应时间(响应时间越长拖影越多)https://www.zhihu.com/question/526789183
10.湿度测量的响应时间及其对测量性能产生的影响定义响应时间: 通常使用两个不同指标来定义响应时间:T63和T90。当被测参数量值有瞬时变化时,测量值需要多长时间达到醉终值的63%或90%。以下是为什么选择63%来定义响应时间的原因:T63在一阶线性时域不变系统中等于时间常数,该常数通常用希腊字母τ(tau)来表示。这个一阶线性时域不变系统的数学模型描述了某一物理https://www.chem17.com/tech_news/detail/2926262.html
11.java自定义响应超时java接口响应时间优化java 自定义响应超时 java接口响应时间优化 本节的目标是做一些优化以满足对应用对延迟的需求。这次需要几个步骤,包括完善Java堆大小的配置,评估垃圾回收占用的时间和频率,也许还要尝试切换到不同的垃圾回收器,以及由于使用了不同的垃圾回收器,需要重新优化Java堆空间大小。https://blog.51cto.com/u_14587/6779200
12.并发用户RPSTPS的解读性能测试(PTS)针对服务器端的性能,以TPS为主来衡量系统的性能,并发用户数为辅来衡量系统的性能,如果必须要用并发用户数来衡量的话,需要一个前提,那就是交易在多长时间内完成,因为在系统负载不高的情况下,将思考时间(思考时间的值等于交易响应时间)加到串联链路中,并发用户数基本可以增加一倍,因此用并发用户数来衡量系统的性能没https://help.aliyun.com/zh/pts/interpretation-of-concurrent-users-and-rps-and-tps