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自带负载均衡策略比较

策略名 策略声明 策略描述 实现说明
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的权重。当刚开始运行,没有形成statas时,使用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。

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

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

  1. Doris源码解析[一、负载均衡]

    # Doris 副本修复和均衡策略 # 名词解释 Tablet:Doris 表的逻辑分片,一个表有多个分片 Replica:分片的副本,默认一个分片有3个副本 Healthy Replica:健康副本 ...

  2. 【云原生微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)

    文章目录 一.前言 二.WeightedResponseTimeRule 1.计算权重? 1)如何更新权重? 2)如何计算权重? 3)例证权重的计算 2.权重的使用 1)权重区间问题? 一.前言 前置 ...

  3. Ribbon负载均衡策略

    目录 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, 2. @LoadBalanced 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, ...

  4. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...

  5. Ribbon负载均衡策略-3

    Ribbon负载均衡策略-3 常用策略 1.RoundRobinRule 轮转调度策略 2.RetryRule重试规律策略 3.RandomRule随机策略 Ribbon的负载均衡策略是由IRule接 ...

  6. 企业级java springcloud b2bc商城系统开源源码二次开发-负载均衡策略...

    简单轮询负载均衡 以轮询的方式依次将请求调度不同的服务器,即每次调度执行i=(i+1) mod n 文章来源 JAVA ssm b2b2c多用户商城系统源码 随机负载均衡 随机选择状态为UP的serv ...

  7. SpringCloud组件:Ribbon负载均衡策略及执行原理!

    大家好,我是磊哥. 今天我们来看下微服务中非常重要的一个组件:Ribbon.它作为负载均衡器在分布式网络中扮演着非常重要的角色. 本篇主要内容如下: 在介绍 Ribbon 之前,不得不说下负载均衡这个 ...

  8. Ribbon负载均衡策略初步解读

    1.接口实现结构图 此图参考(https://blog.csdn.net/qq_31489805/article/details/80341200) 2.ribbon的几种负载均衡原则 RandomR ...

  9. ribbon负载均衡策略详解

    一,IRule接口 IRule接口定义了选择负载均衡策略的基本操作.通过调用choose()方法,就可以选择具体的负载均衡策略. // 选择目标服务节点 Server choose(Object va ...

最新文章

  1. hibernate annotation多对多中间表添加其他字段的第三种方法
  2. python十六进制看图片
  3. 快速上手用Python搭建自己的第一个pyecharts图表
  4. WinCE中的RAM-Based Registry与HIVE-Based Registry
  5. jsp,div 限制字数,超出部分用省略号代替
  6. 从零开始学Pytorch(十五)之数据增强
  7. Netty工作笔记0075---handler链调用机制实例1
  8. leetcode-141. 环形链表:判断链表是否成环
  9. 【小白视角】大数据基础实践(二)Hadoop环境搭建与测试
  10. C#文件和文件文件夹排序
  11. Tsinsen D486 蓝雨
  12. (装机)关于WINRE/ESP/LRS_ESP/MSR/PBR这些分区
  13. Leetcode 1921. 消灭怪物的最大数量-排序+贪心
  14. 2021-02-14
  15. HashMap的底层实现
  16. 云原生爱好者周刊:美国国家安全局发布网络安全指南
  17. 对学生公寓部建议和意见_部门管理建议和意见 宿舍管理意见和建议
  18. python求阶乘怎么做_python如何求阶乘
  19. 航空业走向发展黄金期,P2P线下金融实现线上大迁徙
  20. 小米6 twrp_小米MIX 2S玩机上手指南:真的超简单

热门文章

  1. 【Pytorch神经网络基础理论篇】 07 线性回归 + 基础优化算法
  2. 智慧交通day02-车流量检测实现08:目标跟踪中的数据关联(将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配)
  3. LeetCode 2135. 统计追加字母可以获得的单词数(位运算+哈希)
  4. LeetCode 1156. 单字符重复子串的最大长度
  5. LeetCode MySQL 1270. 向公司CEO汇报工作的所有人
  6. LeetCode MySQL 1445. 苹果和桔子
  7. 程序员面试金典 - 面试题 01.06. 字符串压缩(字符串)
  8. LeetCode 1190. 反转每对括号间的子串(栈)
  9. 怎么画韦布尔分布_手机按键寿命测试的样本数量怎么定?一文看懂 简述威布尔分布及其应用...
  10. python将元祖设为整形_python基础(5)---整型、字符串、列表、元组、字典内置方法和文件操作介绍...