Ribbon自帶負載均衡策略


 

IRule
這是所有負載均衡策略的父接口,里邊的核心方法就是choose方法,用來選擇一個服務實例。

AbstractLoadBalancerRule
AbstractLoadBalancerRule是一個抽象類,里邊主要定義了一個ILoadBalancer,就是我們上文所說的負載均衡器,負載均衡器的功能我們在上文已經說的很詳細了,這里就不再贅述,這里定義它的目的主要是輔助負責均衡策略選取合適的服務端實例。

RandomRule
看名字就知道,這種負載均衡策略就是隨機選擇一個服務實例,看源碼我們知道,在RandomRule的無參構造方法中初始化了一個Random對象,然后在它重寫的choose方法又調用了choose(ILoadBalancer lb, Object key)這個重載的choose方法,在這個重載的choose方法中,每次利用random對象生成一個不大於服務實例總數的隨機數,並將該數作為下標所以獲取一個服務實例。

RoundRobinRule
RoundRobinRule這種負載均衡策略叫做線性負載均衡策略,也就是我們在上文所說的BaseLoadBalancer負載均衡器中默認采用的負載均衡策略。這個類的choose(ILoadBalancer lb, Object key)函數整體邏輯是這樣的:開啟一個計數器count,在while循環中遍歷服務清單,獲取清單之前先通過incrementAndGetModulo方法獲取一個下標,這個下標是一個不斷自增長的數先加1然后和服務清單總數取模之后獲取到的(所以這個下標從來不會越界),拿着下標再去服務清單列表中取服務,每次循環計數器都會加1,如果連續10次都沒有取到服務,則會報一個警告No available alive servers after 10 tries from load balancer: XXXX。

RetryRule
看名字就知道這種負載均衡策略帶有重試功能。首先RetryRule中又定義了一個subRule,它的實現類是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)方法中,每次還是采用RoundRobinRule中的choose規則來選擇一個服務實例,如果選到的實例正常就返回,如果選擇的服務實例為null或者已經失效,則在失效時間deadline之前不斷的進行重試(重試時獲取服務的策略還是RoundRobinRule中定義的策略),如果超過了deadline還是沒取到則會返回一個null。

WeightedResponseTimeRule
WeightedResponseTimeRule是RoundRobinRule的一個子類,在WeightedResponseTimeRule中對RoundRobinRule的功能進行了擴展,WeightedResponseTimeRule中會根據每一個實例的運行情況來給計算出該實例的一個權重,然后在挑選實例的時候則根據權重進行挑選,這樣能夠實現更優的實例調用。WeightedResponseTimeRule中有一個名叫DynamicServerWeightTask的定時任務,默認情況下每隔30秒會計算一次各個服務實例的權重,權重的計算規則也很簡單,如果一個服務的平均響應時間越短則權重越大,那么該服務實例被選中執行任務的概率也就越大。

ClientConfigEnabledRoundRobinRule
ClientConfigEnabledRoundRobinRule選擇策略的實現很簡單,內部定義了RoundRobinRule,choose方法還是采用了RoundRobinRule的choose方法,所以它的選擇策略和RoundRobinRule的選擇策略一致,不贅述。

BestAvailableRule
BestAvailableRule繼承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基礎上主要增加了根據loadBalancerStats中保存的服務實例的狀態信息來過濾掉失效的服務實例的功能,然后順便找出並發請求最小的服務實例來使用。然而loadBalancerStats有可能為null,如果loadBalancerStats為null,則BestAvailableRule將采用它的父類即ClientConfigEnabledRoundRobinRule的服務選取策略(線性輪詢)。

PredicateBasedRule
PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一個子類,它先通過內部定義的一個過濾器過濾出一部分服務實例清單,然后再采用線性輪詢的方式從過濾出來的結果中選取一個服務實例。

ZoneAvoidanceRule
ZoneAvoidanceRule是PredicateBasedRule的一個實現類,只不過這里多一個過濾條件,ZoneAvoidanceRule中的過濾條件是以ZoneAvoidancePredicate為主過濾條件和以AvailabilityPredicate為次過濾條件組成的一個叫做CompositePredicate的組合過濾條件,過濾成功之后,繼續采用線性輪詢的方式從過濾結果中選擇一個出來。

 

Ribbon自帶負載均衡策略比較

策略名 策略聲明 策略描述 實現說明
BestAvailableRule public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 選擇一個最小的並發請求的server 逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server
AvailabilityFilteringRule public class AvailabilityFilteringRule extends PredicateBasedRule 過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,並過濾掉那些高並發的的后端server(active connections 超過配置的閾值) 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個server的運行狀態
WeightedResponseTimeRule public class WeightedResponseTimeRule extends RoundRobinRule 根據相應時間分配一個weight,相應時間越長,weight越小,被選中的可能性越低。 一個后台線程定期的從status里面讀取評價響應時間,為每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運行,沒有形成statas時,使用roubine策略選擇server。
RetryRule public class RetryRule extends AbstractLoadBalancerRule 對選定的負載均衡策略機上重試機制。 在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server
RoundRobinRule public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式輪詢選擇server 輪詢index,選擇index對應位置的server
RandomRule public class RandomRule extends AbstractLoadBalancerRule 隨機選擇一個server 在index上隨機,選擇index對應位置的server
ZoneAvoidanceRule public class ZoneAvoidanceRule extends PredicateBasedRule 復合判斷server所在區域的性能和server的可用性選擇server 使用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用於過濾掉連接數過多的Server。

 

Ribbon架構圖

 

參考資料

http://lxlong.iteye.com/blog/2314573

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM