【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现

Ribbon负载均衡策略定义

IRule其实就只做了一件事情Server choose(Object key),可以看到这个功能是在LB中定义(要求)的,LB把这个功能委托给IRule来实现。不同的IRule可以向LB提供不同的负载均衡算法。

public interface IRule{
public Serverchoose(Object key);
public void setLoadBalancer(ILoadBalancerlb);
public ILoadBalancergetLoadBalancer();
}

com.netflix.loadbalancer包下面的提供了常用的几种策略。有RoundRobinRule、RandomRule这样的不依赖于Server运行状况的策略,也有AvailabilityFilteringRule、WeightedResponseTimeRule等多种基于收集到的Server运行状况决策的策略。判断运行状况时有,判断单个server的,也有判断整个zone的,适用于各种不同场景需求。

实现上有些策略可以继承一个既存的简单策略用于某些启动时候,也可以包含一个简单策略。甚至有ZoneAvoidanceRule这样的可以包含复合谓词的条件判断。TODOTODO IRue hireachy

Ribbon自带负载均衡策略比较

策略名策略声明策略描述实现说明
BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRulepublic class AvailabilityFilteringRule extends PredicateBasedRule过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRulepublic class WeightedResponseTimeRule extends RoundRobinRule根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。
RetryRulepublic class RetryRule extends AbstractLoadBalancerRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRulepublic class RoundRobinRule extends AbstractLoadBalancerRuleroundRobin方式轮询选择server轮询index,选择index对应位置的server
RandomRulepublic class RandomRule extends AbstractLoadBalancerRule随机选择一个server在index上随机,选择index对应位置的server
ZoneAvoidanceRulepublic class ZoneAvoidanceRule extends PredicateBasedRule复合判断server所在区域的性能和server的可用性选择server使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

Ribbon自带负载均衡策略实现解析

1. com.netflix.loadbalancer.BestAvailableRule

功能:选择一个最小的并发请求的server

主要代码:逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server

for (Serverserver: serverList) {
ServerStatsserverStats = loadBalancerStats.getSingleServerStat(server);
if (!serverStats.isCircuitBreakerTripped(currentTime)) {
int concurrentConnections = serverStats.getActiveRequestsCount(currentTime);
if (concurrentConnections < minimalConcurrentConnections) {
minimalConcurrentConnections = concurrentConnections;
chosen = server;
}
}

2 com.netflix.loadbalancer.AvailabilityFilteringRule

功能:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)

主要代码:使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态,过滤掉那些高并发的的后端server(active connections 超过配置的阈值)

boolean com.netflix.loadbalancer.AvailabilityPredicate.shouldSkipServer(ServerStatsstats)
{
if ((CIRCUIT_BREAKER_FILTERING.get() && stats.isCircuitBreakerTripped())
|| stats.getActiveRequestsCount() >= activeConnectionsLimit.get()) {
return true;
}
return false;
}

3 com.netflix.loadbalancer.WeightedResponseTimeRule

功能:根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 ”

主要代码:一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。

class DynamicServerWeightTask extends TimerTask {
public void run() {
ServerWeightserverWeight = new ServerWeight();
serverWeight.maintainWeights();
}
}maintainWeights(){
List<Double> finalWeights = new ArrayList<Double>();
for (Serverserver : nlb.getAllServers()) {
ServerStatsss = stats.getSingleServerStat(server);
double weight = totalResponseTime – ss.getResponseTimeAvg();
weightSoFar += weight;
finalWeights.add(weightSoFar);
}
setWeights(finalWeights);}Serverchoose(ILoadBalancerlb, Object key)
{
double randomWeight = random.nextDouble() * maxTotalWeight;
// pick the server index based on the randomIndex
int n = 0;
for (Double d : currentWeights) {
if (d >= randomWeight) {
serverIndex = n;
break;
} else {
n++;
}
}server = allList.get(serverIndex);}

4 com.netflix.loadbalancer.RetryRule

功能:对选定的负载均衡策略机上重试机制。

主要代码:在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server

answer = subRule.choose(key);
if (((answer == null) || (!answer.isAlive()))
&& (System.currentTimeMillis() < deadline)) {
InterruptTasktask = new InterruptTask(deadline - System.currentTimeMillis());
while (!Thread.interrupted()) {
answer = subRule.choose(key);
if (((answer == null) || (!answer.isAlive()))
&& (System.currentTimeMillis() < deadline)) {
/* pause and retry hoping it’s transient */
Thread.yield();
} else {
break;
}
}
task.cancel();

5 com.netflix.loadbalancer.RoundRobinRule

功能:roundRobin方式轮询选择server

主要代码:轮询index,选择index对应位置的server

List<Server> allServers = lb.getAllServers();
int upCount = reachableServers.size();
int serverCount = allServers.size();
int nextServerIndex = incrementAndGetModulo(serverCount);
server = allServers.get(nextServerIndex);

6 com.netflix.loadbalancer.RandomRule

功能:随机选择一个server

主要代码:在index上随机,选择index对应位置的server

List<Server> upList = lb.getReachableServers();
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
int index = rand.nextInt(serverCount);
server = upList.get(index);

7 com.netflix.loadbalancer.ZoneAvoidanceRule

功能:复合判断server所在区域的性能和server的可用性选择server

主要代码:使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个,以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的server。判断出最差的区域,排除掉最差区域。在剩下的区域中,将按照服务器实例数的概率抽样法选择,从而判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

public com.netflix.loadbalancer.PredicateBasedRule.Serverchoose(Object key) {
ILoadBalancerlb = getLoadBalancer();
Optional<Server> server = getPredicate().chooseRoundRobinAfterFiltering(lb.getAllServers(), key);
if (server.isPresent()) {
return server.get();
}
}

参照现有的若干中rule的实现风格,根据我们自己需要也可以开发出自定义的负载均衡策略。完。

 

 

参考资料:

http://www.tuicool.com/articles/7zIbIb3

 

转载于:https://www.cnblogs.com/junneyang/p/6379486.html

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

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

相关文章

mysql load data infile 重写_mysql load data infile 命令的数据导入

文章介绍了mysql load data infile 命令的数据导入&#xff0c;该方式比直接的insert的效率要高&#xff0c;按照官方的说法是要比insert语句快上20倍,有需要的朋友可参考。使用方式如下&#xff1a;代码如下复制代码mysql>load data local infile "D:/ab.txt" in…

DARPA发布战略框架文件旨在 为美国国家安全创建突破性新技术能力

来源&#xff1a;ARPA网站/图片来自互联网12月4日&#xff0c;DARPA公开了于今年8月份完成的2019年度战略框架文件《面向国家安全创建技术突破和新能力》&#xff0c;阐述了该机构面临的威胁环境&#xff0c;并提出了未来几年的发展计划。1应关注的重点该框架文件指出&#xff…

python数学公式pdf文件的转换_python转换文件 多种文件转换为pdf

1.office文件这里用的是win32com, 需要注意已经安装的python版本是32位还是64位。安装后导入from win32com.client import Dispatch, constants, gencache, DispatchEx(1) word转PDFgencache.EnsureModule({00020905-0000-0000-C000-000000000046}, 0, 8, 4)w DispatchEx(&quo…

rust矿洞绳子怎么爬下_rust矿洞绳子怎么爬下_打工小伙爬冰救人,每动一下都能听到冰面碎裂声...

近日&#xff0c;在辽宁沈阳鲁迅公园&#xff0c;一男子掉进湖中冰窟窿&#xff0c;露出脑袋不停地呼救。生死时刻&#xff0c;一位正在附近找零活的小伙&#xff0c;不顾冰面碎裂发出的咔咔声&#xff0c;一步步爬冰救人&#xff0c;最终在岸上众人帮助下&#xff0c;成功救出…

Python爬虫入门四之Urllib库的高级用法

1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问&#xff0c;如果识别有问题&#xff0c;那么站点根本不会响应&#xff0c;所以为了完全模拟浏览器的工作&#xff0c;我们需要设置一些Headers 的属性。 首先&#xff0c;打开我们的浏览器&#xff0c;调试浏览器F…

Magic Leap 价值 20 多亿美元的 AR 幻梦,现在醒了

来源&#xff1a;传感器技术那个用特效来吹出 AR 神话的 Magic Leap&#xff0c;终于有了新动静。 当地时间 12 月 10 日&#xff0c;增强现实&#xff08;AR&#xff09;领域的“知名”公司 Magic Leap 宣布&#xff0c;将 Magic Leap One Creator Edition 改名为 Magic Leap …

mysql约束_不是吧,阿Sir,MySQL约束你竟然还不懂!

以前写的太乱了&#xff0c;翻出来重新整理下系列目录&#xff1a;MySQL入门&#xff0c;问题不大【增删改查极速上手】(一) 引入约束(1) 约束出现在哪里&#xff1f; 想要讲解约束&#xff0c;就要知道约束用在哪里&#xff0c;用来干嘛&#xff1f;SQL 语言通过定义一个关系所…

dc持久内存与mysql_Calypso Systems推出测试软件和服务器测试傲腾数据中心级持久内存...

Calypso Systems测试Optane DCPMM(DC Persistent Memory Module 数据中心级持久性内存模块)的性能&#xff0c;带宽超过36500MB/s(顺序读写速度128000MB/s)&#xff0c;每秒读写速度为3240万IOPS(顺序读取速度5000)&#xff0c;平均响应时间达到0.11微秒。Calypso PM(持久性内存…

计算机行业研究及2020年策略:聚焦主赛道,投资真成长(84页)

来源&#xff1a;国元证券1、行业涨幅位居前列&#xff0c;个股表现精彩纷呈……2、IT 产业大变革&#xff0c;新机遇不断涌现近年来&#xff0c;以 5G、物联网、云计算、大数据、人工智能、区块链等技术为代表的信息 科技行业快速发展&#xff0c;新兴技术不断涌现&#xff0c…

最长回文串_第78天——第78题(最长回文串 )

今天又是阴天&#xff0c;不过阴天凉快&#xff0c;我喜欢。第78天——第78题&#xff08;最长回文串&#xff09;看题目&#xff01;给定一个包含大写字母和小写字母的字符串&#xff0c;找到通过这些字母构造成的最长的回文串。在构造过程中&#xff0c;请注意区分大小写。比…

python是后端语言还是前端语言_从前端到后台-语言选择

截止至2019年10月&#xff0c;TIOBE编程语言排行如图所示这里重点考虑前三种语言和JS。C作为底层语言直接忽略&#xff0c;主要对JAVA&#xff0c;Python和JS进行对比。JAVA: 强类型静态语言&#xff0c;入门较Python难度更大&#xff0c;常用于企业级应用。如金融&#xff0c;…

二进制权值计算 lsb_2020年二级计算机基础知识备考(第二章)

点击蓝字关注我们哟~2020年9月全国计算机等级考试倒计时29天&#xff0c;还没有好好备考的小伙伴们抓紧时间备考了~今天&#xff0c;跟着考无忧继续备考一下二级计算机基础知识的《第二章 信息的表示和储存》。2.1数据与信息1.数据&#xff1a;客观事物的符号表示&#xff0c;如…

机器人产业这些领域大有可为

来源&#xff1a;中国机器人网前言&#xff1a;机器人产业面临哪些挑战&#xff0c;未来有哪些趋势&#xff1f;当前&#xff0c;世界正迎来新一轮科技革命。传统制造业转型升级释放出巨大的市场潜力&#xff0c;催生高科技机器人的新需求&#xff0c;成为加速产业发展的新动力…

mysql数据库安全机制研究意义_MySQL数据库的安全机制

收稿日期:2001 - 12 - 30   作者简介:李书振(1965 - ) ,男 ,河南人 ,工程师 ,主要研究方向:数据库原理及应用、管理信息系统. 文章编号 :1001 - 9081(2002)06 - 0051 - 03 MySQL 数据库的安全机制 李书振 (武汉大学 信息管理学院 ,湖北 武汉 430072) 摘  要 :MySQL 是一个多…

国产AI全面崛起!盘点11款2019年热门国产AI芯片

来源&#xff1a;芯师爷人工智能的崛起主要得益于算法、数据和计算能力三方面的突破&#xff0c;这三方面的能力展现离不开AI芯片。由此&#xff0c;AI芯片的研发制造成了人工智能技术发展过程中的关键环节。不同于其它传统芯片&#xff0c;AI芯片是近年新兴产品&#xff0c;拥…

python中set函数作用如何自己用代码实现_Python进阶开发之元类编程

Photo byJoyous From Lofter本文目录类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战&#xff1a;ORM.1. 类是如何产生的类是如何产生&#xff1f;这个问题肯定很傻。实则不然&#xff0c;很多人只知道使用继承的表面形式来创建一个类&#xff0c;却不知…

《构建之法》 读书笔记(4)

敏捷流程 敏捷开发原则.尽早并持续地交付有价值的软件以满足顾客需求。敏捷流程欢迎需求的变化&#xff0c;并利用这种变化来提高用户的竞争优势。.经常发布可用的软件&#xff0c;发布间隔可以从几周到几个月&#xff0c;能短则短。.业务人员和开发人员在项目开发过程中应该每…

【周末阅读】10年内,19个关键技术将改变世界

来源&#xff1a;人民网 中国AI协会【导读】根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其临界点。该理事会调查走访了超过800名来自技术行业的企业高管和专家&#xff0c;并分享了他们关于这些黑…

linux mysql安装_LINUX 安装 MYSQL

安装成功的样子&#xff1a;[[email protected] mysql]# mysql -u root -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 18130Server version: 8.0.19 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle…

上传文件实时显示网速怎么实现_担心PC程序吃内存占网速?有了它终于放心了...

自乔帮主发布iPhone至今&#xff0c;智能手机已经走过了13个年头&#xff0c;其系统、UI、操作逻辑都已经逐步完善且相当傻瓜化。所以总有许多人切换到PC上时&#xff0c;总感觉缺了那么点东西&#xff0c;Windows系统的生产力自然是毋庸置疑&#xff0c;但其繁琐、复杂且不直观…