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