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. ICEM-带孔小板

    原版视频下载地址:https://pan.baidu.com/s/1jHMvXHG 密码: p93q

  2. GPU性能越来越强大,为何直到现在还是不能取代CPU?

      从思路上说,GPU相当于火车,一个车头带几十节车厢,一下子把成千上万吨货全给你拉目的地:CPU相当于汽车,拉货旅游样样能干.因此,如果单纯比运力,一列火车比得过成百上千辆汽车:但如果几百人有几百个 ...

  3. 【Nginx】Nginx服务器配置调优

    1.Nginx服务器配置调优 .设置nginx全局参数 vi /usr/local/nginx/conf/nginx.conf #编辑 worker_processes ; # 工作进程数,为CPU的 ...

  4. mysql中的递归

    别人问的一个需求:   数据库里面保存的是父子关系结构: 展示出来的需要根据子类一直查到顶类后将名称全部放一个字段里面,如下:  比如输入的code是1099,名称要显示 配料/花椒/ces     ...

  5. postgresql - relation 权限相关问题

    GRANT ALL PRIVILEGES ON DATABASE 数据库.[schema] TO [用户名]; GRANT ALL ON schema [schema] TO [用户名]; GRANT ...

  6. python2.7报错Non-ASCII character '\xe5' in file的解决方法

    在文件首行加#coding=utf-8,一定要在最顶行添加

  7. matlab学习笔记8 基本绘图命令-三维绘图

    一起来学matlab-matlab学习笔记8 基本绘图命令_6 三维绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...

  8. accept 和 content-Type区别

    accept表示 客服端(浏览器)支持的类型,也是希望服务器响应发送回来的的数据类型. 例如:Accept:text/xml; ,也就是希望服务器响应发送回来的是xml文本格式的内容 区别: 1.Ac ...

  9. Python - Django - 使用 Bootstrap 样式修改注册页

    reg2 函数: from django.shortcuts import render, HttpResponse from app01 import models def reg2(request ...

  10. node端代理浏览器路由 解决浏览器跨域问题

    var _ = require('lodash'); var request = require("request"); /* @LM 2017-02-16 node端代理浏览器路 ...