更新時間:2020-11-19 來源:黑馬程序員 瀏覽量:
默認(rèn)情況下,Ribbon使用的負(fù)載均衡策略是輪詢,實(shí)際上,Ribbon提供了很多負(fù)載均衡算法,其中IRule接口就是所有負(fù)載均衡算法的父接口,它的實(shí)現(xiàn)類結(jié)構(gòu)如下圖所示。
IRule接口實(shí)現(xiàn)類結(jié)構(gòu)
在下圖中,AbstractLoadBalancerRule是負(fù)載均衡策略的抽象類,該抽象類中定義了負(fù)載均衡器ILoaderBalancer對象,該對象能夠在具體實(shí)現(xiàn)選擇服務(wù)策略時,獲取到一些負(fù)載均衡器中維護(hù)的信息作為分配依據(jù),并以此設(shè)計一些算法來實(shí)現(xiàn)針對特定場景的高效策略。
在上圖中,各個實(shí)現(xiàn)類實(shí)現(xiàn)了一種負(fù)載均衡算法,關(guān)于這些實(shí)現(xiàn)類的具體介紹如下:
● RoundRobinRule:實(shí)現(xiàn)了按照線性輪詢的方式依次選擇服務(wù)的功能。
● WeightedResponseTimeRule: 它是對RoundRobinRule的擴(kuò)展,會根據(jù)平均響應(yīng)時間計算所有服務(wù)的權(quán)重,響應(yīng)時間越快,服務(wù)權(quán)重越大,被選中的概率越高。
● ZoneAvoidanceRule:它是PredicateBasedRule的具體實(shí)現(xiàn)類,其內(nèi)部通過使用ZoneAvoidancePredicate和AvailabilityPredicate判斷是否選擇某個服務(wù),前者用于判斷服務(wù)所在區(qū)域的性能是否可用,后者用于過濾掉連接數(shù)過多的服務(wù)。
● AvailabilityFilteringRule: 使用AvailabilityPredicate過濾由于多次訪問故障而處于斷路器跳閘狀態(tài)的服務(wù),還有并發(fā)的連接數(shù)超過閥值的服務(wù),然后對剩余的服務(wù)列表進(jìn)行輪詢。
● BestAvailableRule:用于先過濾掉多次訪問故障而處于斷路跳閘狀態(tài)的服務(wù),然后選擇一個并發(fā)量最小的服務(wù)。
● RetryRule: 該策略實(shí)現(xiàn)了一個具備重試功能的服務(wù)選擇功能,其內(nèi)部會先按照輪詢策略獲取服務(wù),如果獲取失敗則在指定時間內(nèi)重試,獲取可用服務(wù)。
● RandomRule:該策略實(shí)現(xiàn)了從服務(wù)清單中隨機(jī)選擇一個服務(wù)的功能。
● ClientConfigEnableRoundRobinRule:該類是一個抽象類,該類本身沒有實(shí)現(xiàn)什么特殊的處理邏輯,我們也不會直接使用該策略,但是通過BestAvailableRule和繼承該策略默認(rèn)實(shí)現(xiàn)了線性輪詢,它的內(nèi)部定義了一個RoundRobinRule策略,
●
PredicateBasedRule:繼承了ClientConfigEnableRoundRobinRule,其內(nèi)部會先通過chooseRoundRobinAfterFiltering()方法篩選服務(wù)清單,然后以線性輪詢的方式從過濾后的服務(wù)清單中選擇一個服務(wù)。
猜你喜歡:
JDK安裝教程:Jdk怎么安裝?
IO和NIO有什么區(qū)別?NIO有什么優(yōu)點(diǎn)?