本篇內(nèi)容介紹了“Spring Cloud中的負(fù)載均衡策略是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
十年的榆中網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整榆中建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“榆中網(wǎng)站設(shè)計(jì)”,“榆中網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
這是所有負(fù)載均衡策略的父接口,里邊的核心方法就是choose方法,用來(lái)選擇一個(gè)服務(wù)實(shí)例。
AbstractLoadBalancerRule是一個(gè)抽象類,里邊主要定義了一個(gè)ILoadBalancer,就是我們上文所說(shuō)的負(fù)載均衡器,負(fù)載均衡器的功能我們?cè)谏衔囊呀?jīng)說(shuō)的很詳細(xì)了,這里就不再贅述,這里定義它的目的主要是輔助負(fù)責(zé)均衡策略選取合適的服務(wù)端實(shí)例。
看名字就知道,這種負(fù)載均衡策略就是隨機(jī)選擇一個(gè)服務(wù)實(shí)例,看源碼我們知道,在RandomRule的無(wú)參構(gòu)造方法中初始化了一個(gè)Random對(duì)象,然后在它重寫(xiě)的choose方法又調(diào)用了choose(ILoadBalancer lb, Object key)
這個(gè)重載的choose方法,在這個(gè)重載的choose方法中,每次利用random對(duì)象生成一個(gè)不大于服務(wù)實(shí)例總數(shù)的隨機(jī)數(shù),并將該數(shù)作為下標(biāo)所以獲取一個(gè)服務(wù)實(shí)例。
RoundRobinRule這種負(fù)載均衡策略叫做線性負(fù)載均衡策略,也就是我們?cè)谏衔乃f(shuō)的BaseLoadBalancer負(fù)載均衡器中默認(rèn)采用的負(fù)載均衡策略。這個(gè)類的choose(ILoadBalancer lb, Object key)
函數(shù)整體邏輯是這樣的:開(kāi)啟一個(gè)計(jì)數(shù)器count,在while循環(huán)中遍歷服務(wù)清單,獲取清單之前先通過(guò)incrementAndGetModulo方法獲取一個(gè)下標(biāo),這個(gè)下標(biāo)是一個(gè)不斷自增長(zhǎng)的數(shù)先加1然后和服務(wù)清單總數(shù)取模之后獲取到的(所以這個(gè)下標(biāo)從來(lái)不會(huì)越界),拿著下標(biāo)再去服務(wù)清單列表中取服務(wù),每次循環(huán)計(jì)數(shù)器都會(huì)加1,如果連續(xù)10次都沒(méi)有取到服務(wù),則會(huì)報(bào)一個(gè)警告No available alive servers after 10 tries from load balancer: XXXX
。
看名字就知道這種負(fù)載均衡策略帶有重試功能。首先RetryRule中又定義了一個(gè)subRule,它的實(shí)現(xiàn)類是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)
方法中,每次還是采用RoundRobinRule中的choose規(guī)則來(lái)選擇一個(gè)服務(wù)實(shí)例,如果選到的實(shí)例正常就返回,如果選擇的服務(wù)實(shí)例為null或者已經(jīng)失效,則在失效時(shí)間deadline之前不斷的進(jìn)行重試(重試時(shí)獲取服務(wù)的策略還是RoundRobinRule中定義的策略),如果超過(guò)了deadline還是沒(méi)取到則會(huì)返回一個(gè)null。
WeightedResponseTimeRule是RoundRobinRule的一個(gè)子類,在WeightedResponseTimeRule中對(duì)RoundRobinRule的功能進(jìn)行了擴(kuò)展,WeightedResponseTimeRule中會(huì)根據(jù)每一個(gè)實(shí)例的運(yùn)行情況來(lái)給計(jì)算出該實(shí)例的一個(gè)權(quán)重,然后在挑選實(shí)例的時(shí)候則根據(jù)權(quán)重進(jìn)行挑選,這樣能夠?qū)崿F(xiàn)更優(yōu)的實(shí)例調(diào)用。WeightedResponseTimeRule中有一個(gè)名叫DynamicServerWeightTask的定時(shí)任務(wù),默認(rèn)情況下每隔30秒會(huì)計(jì)算一次各個(gè)服務(wù)實(shí)例的權(quán)重,權(quán)重的計(jì)算規(guī)則也很簡(jiǎn)單,如果一個(gè)服務(wù)的平均響應(yīng)時(shí)間越短則權(quán)重越大,那么該服務(wù)實(shí)例被選中執(zhí)行任務(wù)的概率也就越大。
ClientConfigEnabledRoundRobinRule選擇策略的實(shí)現(xiàn)很簡(jiǎn)單,內(nèi)部定義了RoundRobinRule,choose方法還是采用了RoundRobinRule的choose方法,所以它的選擇策略和RoundRobinRule的選擇策略一致,不贅述。
BestAvailableRule繼承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基礎(chǔ)上主要增加了根據(jù)loadBalancerStats中保存的服務(wù)實(shí)例的狀態(tài)信息來(lái)過(guò)濾掉失效的服務(wù)實(shí)例的功能,然后順便找出并發(fā)請(qǐng)求最小的服務(wù)實(shí)例來(lái)使用。然而loadBalancerStats有可能為null,如果loadBalancerStats為null,則BestAvailableRule將采用它的父類即ClientConfigEnabledRoundRobinRule的服務(wù)選取策略(線性輪詢)。
PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一個(gè)子類,它先通過(guò)內(nèi)部定義的一個(gè)過(guò)濾器過(guò)濾出一部分服務(wù)實(shí)例清單,然后再采用線性輪詢的方式從過(guò)濾出來(lái)的結(jié)果中選取一個(gè)服務(wù)實(shí)例。
ZoneAvoidanceRule是PredicateBasedRule的一個(gè)實(shí)現(xiàn)類,只不過(guò)這里多一個(gè)過(guò)濾條件,ZoneAvoidanceRule中的過(guò)濾條件是以ZoneAvoidancePredicate為主過(guò)濾條件和以AvailabilityPredicate為次過(guò)濾條件組成的一個(gè)叫做CompositePredicate的組合過(guò)濾條件,過(guò)濾成功之后,繼續(xù)采用線性輪詢的方式從過(guò)濾結(jié)果中選擇一個(gè)出來(lái)。
“Spring Cloud中的負(fù)載均衡策略是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!