LoadBalance負(fù)載均衡, 負(fù)責(zé)從多個(gè) Invokers當(dāng)選出具體的1個(gè)Invoker用于本次調(diào)用,調(diào)用進(jìn)程中包括了負(fù)載均衡的算法,調(diào)用失敗后需要重新選擇
LoadBalance接口定義
@SPI(RandomLoadBalance.NAME)
public interface LoadBalance{
@Adaptive("loadbalance")
<T> Invoker<T> select(List<Invoker<T>> invokers,URL url, Invocation invocation)throws RpcException;
}
類注解@SPI說明可以基于Dubbo的擴(kuò)大機(jī)制進(jìn)行自定義的負(fù)責(zé)均衡算法實(shí)現(xiàn),默許是隨機(jī)算法
方法注解@Adaptive說明能夠生成設(shè)配方法
Select方法設(shè)配類通過url的參數(shù)選擇具體的算法, 在從invokers集合中根據(jù)具體的算法選擇1個(gè)invoker
1. RandomLoadBalance: 隨機(jī)訪問策略,按權(quán)重設(shè)置隨機(jī)幾率,是默許策略
1)獲得所有invokers的個(gè)數(shù)
2)遍歷所有Invokers, 獲得計(jì)算每一個(gè)invokers的權(quán)重,并把權(quán)重累計(jì)加起來
每相鄰的兩個(gè)invoker比較他們的權(quán)重是不是1樣,有1個(gè)不1樣說明權(quán)重不均等
3)總權(quán)重大于零且權(quán)重不均等的情況下
按總權(quán)重獲得隨機(jī)數(shù)offset = random.netx(totalWeight);
遍歷invokers肯定隨機(jī)數(shù)offset落在哪一個(gè)片斷(invoker上)
4)權(quán)重相同或總權(quán)重為0, 根據(jù)invokers個(gè)數(shù)均等選擇
invokers.get(random.nextInt(length))
2. RoundRobinLoadBalance:輪詢,按公約后的權(quán)重設(shè)置輪詢比率
1)獲得輪詢key 服務(wù)名+方法名
獲得可供調(diào)用的invokers個(gè)數(shù)length
設(shè)置最大權(quán)重的默許值maxWeight=0
設(shè)置最小權(quán)重的默許值minWeight=Integer.MAX_VALUE
2)遍歷所有Inokers,比較出得出maxWeight和minWeight
3)如果權(quán)重是不1樣的
根據(jù)key獲得自增序列
自增序列加1與最大權(quán)重取模默許得到currentWeigth
遍歷所有invokers挑選出大于currentWeight的invokers
設(shè)置可供調(diào)用的invokers的個(gè)數(shù)length
4)自增序列加1并與length取模,從invokers獲得invoker
3. LeastActiveLoadBalance: 最少活躍調(diào)用數(shù), 相同的活躍的隨機(jī)選擇,
活躍數(shù)是指調(diào)用前后的計(jì)數(shù)差, 使慢的提供者收到更少的要求,由于越慢的提供者前后的計(jì)數(shù)差越大。
活躍計(jì)數(shù)的功能消費(fèi)者是在ActiveLimitFilter中設(shè)置的
4. 最少活躍的選擇進(jìn)程以下:
1)獲得可調(diào)用invoker的總個(gè)數(shù)
初始化最小活躍數(shù),相同最小活躍的個(gè)數(shù)
相同最小活躍數(shù)的下標(biāo)數(shù)組
等等
2)遍歷所有invokers, 獲得每一個(gè)invoker的獲得數(shù)active和權(quán)重
找出最小權(quán)重的invoker
如果有相同最小權(quán)重的inovkers, 將下標(biāo)記錄到數(shù)組leastIndexs[]數(shù)組中
累計(jì)所有的權(quán)重到totalWeight變量
3)如果invokers的權(quán)重不相等且totalWeight大于0
按總權(quán)重隨機(jī)offsetWeight = random.nextInt(totalWeight)
計(jì)算隨機(jī)值在哪一個(gè)片斷上并返回invoker
4)如果invokers的權(quán)重相等或totalWeight等于0,均等隨機(jī)
5. ConsistentHashLoadBalance:1致性hash, 相同參數(shù)的要求總是發(fā)到同1個(gè)提供者,當(dāng)某1臺(tái)提供者掛時(shí),本來發(fā)往該提供者的要求,基于虛擬節(jié)點(diǎn),平攤到其它提供者,不會(huì)引發(fā)劇烈變動(dòng)。對(duì)1致性哈希算法介紹網(wǎng)上很多,這個(gè)給出1篇http://blog.csdn.net/sparkliang/article/details/5279393供參考,讀者請(qǐng)自行瀏覽ConsistentashLoadBalance中對(duì)1致性哈希算法的實(shí)現(xiàn),還是比較通俗易懂的這里不再