spring cloud ribbon 客户端负载均衡策略

负载均衡策略

AbstractLoadBalancerRule

负载均衡策略的抽象类,在该类中定义了负载均衡器ILoadBalancer对象,该对象能够在具体实现选择服务策略时,获取到

一些负载均衡中维护的信息来作为分配依据,并以此设计一些算法来实现针对特定场景的高效策略

RandomRule

随机选择一个服务实例

RoundRobinRule

线性轮询的方式

RetryRule

实现了一个具备重试机制的实例选择功能

WeightedResponseTimeRule

该策略是对RoundRobinRule的扩展,增加了根据实例的运行情况来计算权重,并根据权重来挑选实例,以达到更优的分配效果

   定时任务

serverWeightTimer.schedule(new DynamicServerWeightTask(), 0, serverWeightTaskTimerInterval);启动一个定时任务,

用来为每个服务实例计算权重

该方法的实现主要分为两个步骤:

  根据LoadBalancerStats中记录的每个实例的统计信息,累加所有实例的平均响应时间,得到平均响应时间总和

totalResponseTime,该值会用于后续的计算。

       为负载均衡器中维护的实例清单逐个计算权重(从第一个开始),计算规则为weightSoFar+totalResponseTime

- 实例的平均响应时间,其中weightSoFar初始为零,并且每计算好一个权重需要累加到weightSoFar上供下一次计算使用

   实例选择

   WeightedResponseTimeRule选择实例的实现与之前介绍的算法类似,下面是它主体的算法

主要分两步:

  生成一个[0, 最大权重值]区间内的随机数。

       遍历权重列表,比较权重值与随机数的大小,如果权重值大于等于随机数,就拿当前权重列表的索引值

去服务实例列表中获取具体的实例。而权重区间边界的开闭原则根据算法,正常每个区间为(x, y]的形式,

但是第一个实例和最后一个实例为什么不同,由于随机数的最小取值可以为0,所以第一个实例的下限是

闭合区,同时随机数的最大值取不到最大权重值,所以最后一个实例的上限是开区间

      若继续以上面的数据为例进行服务实例的选择,则该方法会从[0, 690)区间中选出一个随机数,比如选出的

随机数为230,由于位于第二个区间,所以此时就会选择实例B来进行请求


  ClientConfigEnableRoundRobinRule

  该策略较为特殊,一般不直接使用它,因为本身没有特殊的处理逻辑,内部定义了一个RoundRobinRule,

choose()方法默认使用RoundRobinRule的线性轮循机制,

 通过继承该策略,在子类中做一些高级策略时通常有可能会存在一些无法实施的情况,那么就可以用父类的实现

作为备选。

  BestAvailableRule

    ClientConfigEnableRoundRobinRule的子类,主要是找出并发请求数最小的一个

  PredicateBasedRule

      这是一个抽象策略,它也继承了ClientConfigEnabledRoundRobinRule,从其命名中可以看出这是一个

基于Predicate实现的策略,Predicate是Google Guava Collection工具对集合进行过滤的条件接口

  如下所示,它定义了一个抽象方法getPredicate()来获取AbstractServerPredicate对象的实现,而在choose()

方法中,通过AbstractServerPredicate的chooseRoundRobinAfterFiltering()方法来选出具体的服务实例

在 AbstractServerPredicate中

先通过内部定义的getEligibleServers()方法来获取备选的实例清单(过滤),如果为空,用Optional.abstent()表示

不存在,否则线性轮循

如下 是getEligibleServers()方法

使用this.apply()方法来判断是否需要保留,在子类中查apply()方法的实现

  AvailabilityFilteringRule

  该策略继承上面的抽象策略PredicateBaseRule,所以它也继承了“先过滤,再轮循”的基本逻辑,

其中过滤条件使用类AvailabilityPredicate

  AvailabilityFilterRule的choose()方法也不同

  可以看到,它并没有像父类那样,先遍历所有的节点进行过滤,然后在过滤后的集合中选择实例。而是

先以线性的方式选择一个实例,接着用过滤条件来判断该实例是否满足要求,不满足再选择下一个实例,

优化类父类每次都要遍历所有实例的开销


  ZoneAvoidanceRule

  它使用了CompositePredicate来进行服务实例清单的过滤。这是一个组合过滤条件,构造方法中,以

ZoneAvoidancePredicate为主过滤条件,AvailabilityPredicate为次过滤条件

ZoneAvoidanceRule并没有重写choose()方法,所以遵循父类“先过滤,在轮循”,

过滤条件是CompositePredicate,源码如下

可以看到定义了一个主过滤条件AbstractServerPredicate delegate以及一组次过滤条件列表List fallbacks,

所以它的次过滤列表是可以多个的,

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容