文档介绍:膅负载均衡算法袄在集群负载均衡时,Dubbo提供了4种均衡策略,如:RandomLoadBalance(随机均衡算法)、;RoundRobinLoadBalance(权重轮循均衡算法)、LeastActionLoadBalance(最少活跃调用数均衡算法)、ConsistentHashLoadBalance(一致性Hash均衡算法)。缺省时为Random随机调用。这四种算法的原理简要介绍如下:衿1、RoundRobinLoadBalance艿Round-Robin既是轮询算法,是按照公约后的权重设置轮询比率,即权重轮询算法(WeightedRound-Robin),它是基于轮询算法改进而来的。这里之所以写RoundRobin是为了跟Dubbo中的内容保持一致。羄轮询调度算法的原理是:每一次把来自用户的请求轮流分配给内部中的服务器。如:从1开始,一直到N(其中,N是内部服务器的总个数),然后重新开始循环。羄该算法的优点:芀其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。螆该算法的缺点:羆轮询调度算法假设所有服务器的处理性能都相同,不关心每台服务器的当前连接数和响应速度。当请求服务间隔时间变化比较大时,轮询调度算法容易导致服务器间的负载不平衡。肄所以此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。但是,在实际情况中,可能并不是这种情况。由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。蚀权重轮询调度算法流程蒈假设有一组服务器S={S0,S1,…,Sn-1},W(Si)表示服务器Si的权值,一个指示变量i表示上一次选择的服务器,指示变量cw表示当前调度的权值,max(S)表示集合S中所有服务器的最大权值,gcd(S)表示集合S中所有服务器权值的最大公约数。变量i初始化为-1,cw初始化为零。其算法如下:螅while(true){膄  i=(i+1)modn;肁  if(i==0){羆     cw=cw-gcd(S);蒄     if(cw<=0){芄       cw=max(S);芈       if(cw==0)蚈         returnNULL;芃     }莃  }虿  if(W(Si)>=cw)肆    returnSi;莆}蒃这种算法的逻辑实现如图2所示,图中我们假定四台服务器的处理能力为3:1:1:1。肀螈                                     图1权重轮询调度实现逻辑图示肅由于权重轮询调度算法考虑到了不同服务器的处理能力,所以这种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。所以,在实际应用中比较常见。蒃2、ConsistentHashLoadBalance蒁一致性Hash,相同参数的请求总是发到同一个提供者。一:一致性Hash算法可以解决服务提供者的增加、移除及挂掉时的情况,能尽可能小的改变已存在key映射关系,尽可能的满足单调性的要求。二:一致性Hash通过构建虚拟节点,能尽可能避免分配失衡,具有很好的平衡性。芆一致性Hash下面就来按照5个步骤简单讲讲consistenthash算法的基本原理。因为以下资料来自于互联网,现说明几点:一、下面例子中的对象就相当于Client发的请求,cache相当于服务提供者。袄环形hash空间薃考虑通常的hash算法都是将value映射到一个32为的key值,也即是0~2^32-1次方的数值空间;我们可以将这个空间想象成一个首(0)尾(2^32-1)相接的圆环,如下面图2所示的那样。袂羇图2环形hash空间袇把对象映射到hash空间蚃接下来考虑4个对象object1~object4,通过hash函数计算出的hash值key在环上的分布如图3所示。罿hash(object1)=key1;虿……蚅hash(object4)=key4;螃荿图34个对象的key值分布膇把cache映射到hash空间蒄Consistenthashing的基本思想就是将对象和cache都映射到同一个hash数值空间中,并且使用相同的hash算法。袃假设当前有A,B和C共3台cache,那么其映射结果将如图4所示,他们在hash空间中,以对应的hash值排列。螀hash(cacheA)=keyA;衿……膃hash(cacheC)=keyC;羃膁图4cache和对象的key值分布莇说到这里,顺便提一下cache的hash计算,一般的方法可以使用cache机器的IP地址或者机器名作为hash输入。芆把对象映射到cache肂现在cache和对象都已经通过同一个hash算法映射