在上一篇文章中,我們介紹了如何使用功能區(qū)的輪詢機制為消費者配置負(fù)載平衡策略。這一次,我們將進一步了解功能區(qū)的一些細(xì)節(jié)以及如何自定義負(fù)載平衡策略。
談?wù)凴ibbon上負(fù)載均衡的總體思路。它用@ LoadBalanced修改RestTemplate,并將其提交到功能區(qū)進行配置。它為RestTemplate定義了一個攔截器,攔截rest請求,并將其提交給Ribbon進行處理,然后將其發(fā)送出去。Ribbon主要負(fù)責(zé)選擇合適的實例和構(gòu)造URL。(不想詳細(xì)分析。如果你有興趣,可以看看LoadBalancerAutoConfiguration,LoadBalancerClient和LoadBalancerClient。).
讓我們來看看以下我們可能使用的重要接口。
load平衡器:Ribbon的負(fù)載平衡器接口,定義了添加服務(wù)實例、選擇服務(wù)實例、標(biāo)記服務(wù)實例離線、獲取當(dāng)前可用實例和獲取所有服務(wù)實例的方法。通過方法定義可以看出,這個類是Ribbon最重要的管理類。它管理所有實例,并通過在實例方法中獲取負(fù)載平衡策略來選擇要返回的適當(dāng)實例。主要涉及到AbstractLoadBalancer平衡器的實現(xiàn)接口,定義了一些基本方法。
1.baseload平衡器:繼承了負(fù)載平衡器的基本實現(xiàn)類AbstractLoad平衡器,有幾點需要注意:IP(檢測實例狀態(tài)的方法)對象沒有實現(xiàn),是空,需要在構(gòu)造時傳入。檢查實例狀態(tài)的默認(rèn)策略是串行策略,它使用傳入規(guī)則和輪詢實例來檢查它們的狀態(tài),這在網(wǎng)絡(luò)中是不好的。檢查策略也可以自定義傳入。定義了IRule對象,主要用于定義負(fù)載均衡策略。iLoad平衡器將通過構(gòu)造函數(shù)將自身傳遞到IRule中,IRule將通過select函數(shù)獲取服務(wù)器列表,并返回規(guī)則下的服務(wù)器。均衡器的默認(rèn)規(guī)則是RoundRobinRule,其策略是線性輪詢服務(wù)實例返回。
2.這個類繼承了抽象負(fù)載平衡器。從名字可以看出來,反正也沒啥用。。。
3.動態(tài)服務(wù)器列表負(fù)載均衡器繼承了BaseLoadBalancer,實現(xiàn)了在運行過程中動態(tài)更新服務(wù)列表的能力,并具有過濾服務(wù)列表的功能。你可以自己看,我也沒仔細(xì)看。
4.繼承了DynamicServerlistloadBalancer的ZoneWareloadBalancer是功能最完善、最強大的。由于DynamicServerlistloadBalancer平衡器使用輪詢方法調(diào)用實例,在不同的區(qū)域,網(wǎng)絡(luò)延遲可能會影響性能,因此出現(xiàn)了Zonewareload平衡器,它具有區(qū)域親和力,會優(yōu)先考慮同一區(qū)域的實例。它使用區(qū)域回避規(guī)則作為負(fù)載平衡策略。
規(guī)則:負(fù)載平衡策略接口
1.抽象負(fù)載平衡規(guī)則,實現(xiàn)一些基本方法。iLoad平衡器對象已定義。
2.隨機規(guī)則:隨機選擇策略。
3.圓形輪詢規(guī)則:線性輪詢策略
4.RetryRule:內(nèi)部定義了另一種輪換策略,它具有判斷一個實例是否存活的能力,如果不存活,輪詢選擇其他實例,判斷實例的狀態(tài)。它還設(shè)置了一個超時函數(shù),如果在指定的時間內(nèi)無法選擇可用的實例,則返回null。
5.加權(quán)響應(yīng)時間規(guī)則:RoundRobinRule的擴展,它定義了一個計算實例權(quán)重的算法。權(quán)重與實例的響應(yīng)時間有關(guān)。反正最后的效果就是響應(yīng)時間短的實例更容易被選中。
6.clientconfigenabledroundorbinrule:實現(xiàn)與roundRobinrule一致,后者用于其他類通過繼承來擴展。
7.BestAvailableRule從ClientConfigenableDroundroBinrule繼承,后者通過遍歷所有實例來篩選故障實例,并找到需要返回的并發(fā)請求最少的實例。誰最閑找誰做事。
8.PredicateBasedRule:這個規(guī)則首先實現(xiàn)過濾(一種判斷實例是否有故障且沒有空忙的算法),然后遍歷尋找一個實例。這個我不太清楚。
9.AvailabilityFilteringRule:Inherit PredicateBasedRule,直接遍歷實例,根據(jù)規(guī)則找到合適的實例后返回。
10.區(qū)域回避規(guī)則:繼承了表語基本規(guī)則,具有區(qū)域親和策略。首先,通過區(qū)域過濾掉同一區(qū)域中的實例,然后選擇一個實例。如果同一區(qū)域中沒有實例,則線性遍歷其他實例。
檢測實例是否可用的接口
1.抽象負(fù)載平衡器:實現(xiàn)IPing,定義抽象負(fù)載平衡器。
2.no apping:ipping被實現(xiàn)并返回true,表示默認(rèn)情況下所有實例都可用。
3.DummyPing:默認(rèn)情況下返回true,構(gòu)造一個initwithinWSConfig空方法,應(yīng)該用來給開發(fā)人員提供自己繼承的類。
4.NiwsDiscoverging:與尤里卡結(jié)合使用時,以注冊中心管理的實例狀態(tài)為準(zhǔn),處于UP狀態(tài)的實例返回為可用。
5.PingConstant:實現(xiàn)IPing,可以通過設(shè)置setConstant來設(shè)置當(dāng)前或所有實例的狀態(tài)。
6.pingur:實現(xiàn)IP,通過發(fā)送http請求判斷實例返回值的狀態(tài)碼是否為200,判斷實例是否存活。默認(rèn)地址為http或https://ip: port,可以通過setPingAppendString將ip后的字符串聯(lián)起來形成。
以上三個接口是Ribbon上最重要的接口,其他接口這里不介紹。
先說一下Ribbon使用的默認(rèn)接口。注意,與尤里卡整合后,界面發(fā)生了變化。
1.iLoad平衡器,所用的區(qū)域負(fù)載平衡器
2.I規(guī)則,已使用區(qū)域回避規(guī)則
3.IPing,使用NoOpPing,可以默認(rèn)完成
4.服務(wù)器列表服務(wù)器,由ConfigurationBasedServerList決定。配置模式為:servername . ribbon . list of server = localhost:8001,localhost: 8002,localhost: 8003
5.服務(wù)器列表過濾服務(wù)器,默認(rèn)使用ZonePreferenceServerListFilter,優(yōu)先過濾同一區(qū)域的實例。
6.功能區(qū)的客戶端配置IClientConfig默認(rèn)使用默認(rèn)客戶端配置
與尤里卡集成后,界面實例的使用有以下變化:
1.服務(wù)器列表服務(wù)器,由DiscoveryEnabledNIWSServerList替換。這個類實現(xiàn)了尤里卡注冊中心對服務(wù)實例列表的管理。指示Ribbon直接從尤里卡注冊中心獲取服務(wù)列表。
2.IPing被。NIWSDiscoveryPing,這意味著實例的狀態(tài)由尤里卡注冊表維護,如果注冊表列表中的實例處于UP狀態(tài),它將返回可用。
以上介紹完畢,我們來看看如何定制這些策略的實現(xiàn)類。如果想實現(xiàn)這些接口,可以自己做。
通過查看功能區(qū)源代碼,我們可以找到以下類,其構(gòu)造函數(shù)定義了這些配置的字段。
publicPropertiesFactory(){class to property . put(iLoad平衡器. class,NFLoadBalancerClassName);
class topproperty . put(ipping . class,nfloadbalancerspingClassName);
class topproperty . put(irule . class,nfloadbalancercruleclassname);
class topproperty . put(serverlist . class,niwsserverlist class name);
class topproperty . put(serveristfilter . class,niwsserveristfilterclassname);
}
我們可以看到它支持五個接口的實現(xiàn)類配置。例如,通過servername . ribbon . nfloadbalancercruleclassname = com . Netflix . load balancer . random rule,配置servername的負(fù)載平衡策略以隨機選擇一個實例。沒有服務(wù)名的配置意味著全局效應(yīng)。好了,結(jié)束了,親測有效。您可以嘗試自定義自己的負(fù)載平衡配置!
1.《ribbon Spring Cloud Netflix Ribbon介紹》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《ribbon Spring Cloud Netflix Ribbon介紹》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/jiaoyu/824197.html