Dubbo中的一个关键接口LoadBalance,dubbo是按照其中的规则来调用多台provider的服务的。

  先看一下接口的实现类图:

  

  从上图中我们可以看到dubbo提供了四种算法来实现负载均衡。

  1.RandomLoadBalance:随机,按权重设置随机概率。

  从字面意思也很好理解,根据每个invoker提前设置好的权重随机分配,看一下源码的实现:    

  可以看出其实现逻辑是如果所有的invoker的权重都一样,则随机给出一个invoker,

  否则按照权重进行分配,按照权重进行分配相信大家都有接触过,但是dubbo的这种实现方式还是很优雅,很值得学习和借鉴的,就是我上图中标记出的部分,

  可以看到dubbo是将所有的invoker的权重都加起来,在这个总权重范围内随机生成一个数字,用这个数字依次减去没个invoker的权重,当值变为<时,即是这个invoker来执行。

  例如,有四个invoker,权重分别是:1,2,3,4,总权重为10,随机生成数字为5,则5-1=4,4-2=2,2-3=-1<0,即可判定是权重为3的invoker来执行,

  按照这个逻辑:

  权重为1的会执行的随机数:0.

  权重为2的会执行的随机数:1~2.

  权重为3的会执行的随机数:3,4,5.

  权重为4的会执行的随机数:6,7,8,9.

  2.ConsistentHashLoadBalance:一致性哈希算法

  相同参数的请求总是发到同一提供者。

  

  但是缺省只对第一个参数进行hash,请注意这些默认参数:

  

  3.LeastActiveLoadBalance:最小活跃数负载均衡

  最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

  使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

  这里牵扯到一个问题,如何统计活跃数呢?我们来看源码实现:

  

  每次调用该invoker时会将数字+1,调用完成后-1,这样执行慢的invoker在同一时间节点上的活跃数字就会比较大,快的就会比较小

  当只有一个最小活跃数的invoker时直接返回该invoker

  当多个invoker活跃数一致但权重不一致时就根据上文的随机权重算法进选择

  当多个invoker活跃数一致权重也一致时,就从中随机进行返回。

  4.RoundRobinLoadBalance:根据权重进轮训,轮训的缺点就是无法顾及invoker的执行效率,有可能将请求积压在某一处理较慢的provider上。

  参考大神文章:https://www.jianshu.com/p/53feb7f5f5d9

  

Dubbo -- 四种loadBalance负载均衡算法的更多相关文章

  1. IPVS和Nginx两种WRR负载均衡算法详解

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  2. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  3. Dubbo的负载均衡算法源码分析

    Dubbo提供了四种负载均衡:RandomLoadBalance,RoundRobinLoadBalance,LeastActiveLoadBalance,ConsistentHashLoadBala ...

  4. 几种简单的负载均衡算法及其Java代码实现

    什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技 ...

  5. Nginx几种负载均衡算法及配置实例

    本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...

  6. Ribbon提供的负载均衡算法IRule(四)

    一.Ribbon算法的介绍 Ribbon的源码地址:https://github.com/Netflix/ribbon IRule:根据特定算法中从服务器列表中选取一个要访问的服务,Ribbon默认的 ...

  7. 负载均衡算法(四)IP Hash负载均衡算法

    /// <summary> /// IP Hash负载均衡算法 /// </summary> public static class IpHash { static Dicti ...

  8. Dubbo加权轮询负载均衡的源码和Bug,了解一下?

    本文是对于Dubbo负载均衡策略之一的加权随机算法的详细分析.从2.6.4版本聊起,该版本在某些情况下存在着比较严重的性能问题.由问题入手,层层深入,了解该算法在Dubbo中的演变过程,读懂它的前世今 ...

  9. Dubbo一致性哈希负载均衡的源码和Bug,了解一下?

    本文是对于Dubbo负载均衡策略之一的一致性哈希负载均衡的详细分析.对源码逐行解读.根据实际运行结果,配以丰富的图片,可能是东半球讲一致性哈希算法在Dubbo中的实现最详细的文章了. 文中所示源码,没 ...

随机推荐

  1. 关于js中onload事件的部分报错。

    当使用onload获取元素时,建议在onload事件之前定义需要获取的元素名称,在onload里面只执行获取操作,这样获取到的元素在后面才能顺利使用. <!DOCTYPE html> &l ...

  2. MySQL 自动插入、更新时间戳

    在 MySql 中,要做到自动出入当前时间戳,只要在定义表格时将字段的默认值设置为 CURRENT_TIMESTAMP 即可. 如: create table if not exists my_tab ...

  3. CTF SSRF(服务器端伪造请求)

    目录 CTF SSRF(服务器端伪造请求) 一.概念 二.危害 三.漏洞挖掘与判断 四.相关函数 五.IP绕过 六.Gopher协议 1.使用限制 2.构造payload CTF SSRF(服务器端伪 ...

  4. Java 动态调试技术原理及实践 【基本功】Java动态追踪技术探究

    https://mp.weixin.qq.com/s/ZlNcvwJ_swspifWTLHA92Q https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA

  5. [转]详解Linux(centos7)下安装OpenSSL安装图文方法

    OpenSSL是一个开源的ssl技术,由于我需要使用php相关功能,需要获取https的文件所以必须安装这个东西了,下面我整理了两种关于OpenSSL安装配置方法. 安装环境:  操作系统:CentO ...

  6. FFMPEG Tips 如何提取码流的基本信息

    原文连接: https://zhuanlan.zhihu.com/p/23448271 1. 码流中的哪些信息值得关注 ? [ ] 是否包含:音频.视频 [ ] 码流的封装格式 [ ] 视频的编码格式 ...

  7. matlab中可用于进行轮廓提取的函数

    本文主要总结一下在matlab中可用于进行轮廓提取的函数. 1 bwperim 根据参考资料[2]的提示,可以使用bwperim()函数进行轮廓提取,具体代码如下: %读取原图im = imread( ...

  8. tensorflow2.0手写数字识别

    import tensorflow as tf import matplotlib.pyplot as plt import numpy as np datapath = r'D:\data\ml\m ...

  9. c#通过socket判断服务器连接是否正常

    判断Socket是否连接上,需要通过发包来确认. 之前确认都是调用调用socket的connected属性,然而该属性是上次的连接是否成功的结果,不及时. // 检查一个Socket是否可连接 pri ...

  10. 【Python开发】C和Python之间的接口实现

    作者:Jerry Jho 链接:https://www.zhihu.com/question/23003213/answer/56121859 ## 更新:关于ctypes,见拙作 聊聊Python ...