新聞中心
作者 | 波哥

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的下陸網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
審校 | 重樓
在現(xiàn)代分布式微服務(wù)架構(gòu)中,負(fù)載均衡是保證系統(tǒng)高可用、高性能的關(guān)鍵組件之一。Netflix Ribbon作為Netflix開(kāi)源的負(fù)載均衡庫(kù),為微服務(wù)架構(gòu)提供了強(qiáng)大的負(fù)載均衡能力,極大地促進(jìn)了微服務(wù)間的通信和協(xié)作。本篇筆者將深入剖析Netflix Ribbon的底層實(shí)現(xiàn)原理,帶您揭開(kāi)其神秘面紗。
Netflix Ribbon是Netflix開(kāi)源的負(fù)載均衡庫(kù),它可以無(wú)縫集成到微服務(wù)架構(gòu)中,提供了多種負(fù)載均衡策略和豐富的配置選項(xiàng),幫助開(kāi)發(fā)者實(shí)現(xiàn)高性能、高可用的服務(wù)調(diào)用。先來(lái)看下Ribbond 架構(gòu):
1.Ribbon的架構(gòu)
Ribbon的架構(gòu)主要由以下幾個(gè)核心組件構(gòu)成:
- IClientConfig:配置接口,用于獲取配置信息,如連接超時(shí)、讀取超時(shí)等。
- IRule:負(fù)載均衡規(guī)則接口,用于決定請(qǐng)求應(yīng)該轉(zhuǎn)發(fā)到哪個(gè)服務(wù)實(shí)例。
其中:
- choose(Object key): 從所有服務(wù)實(shí)例中選擇一個(gè),根據(jù)具體的負(fù)載均衡規(guī)則,返回選定的服務(wù)實(shí)例。
- setLoadBalancer(ILoadBalancer lb): 設(shè)置與負(fù)載均衡規(guī)則相關(guān)的負(fù)載均衡器。
- getLoadBalancer(): 獲取與負(fù)載均衡規(guī)則相關(guān)聯(lián)的負(fù)載均衡器。
IRule 接口提供了選擇服務(wù)實(shí)例的方法,具體選擇哪個(gè)服務(wù)實(shí)例取決于實(shí)現(xiàn)該接口的負(fù)載均衡規(guī)則。這個(gè)規(guī)則可以是輪詢(xún)、隨機(jī)、加權(quán)輪詢(xún)等不同的策略。使用示例如下:
當(dāng)然我們一般使用是和Spring/SpringBoot整合使用,只需要在配置中加以配置即可。如果想實(shí)現(xiàn)自己的選擇機(jī)制,則只需要實(shí)現(xiàn)IRule,并完成使用配置即可。
- IPing:用于檢測(cè)服務(wù)實(shí)例的存活狀態(tài)。
主要有兩種實(shí)現(xiàn)方式:PingUrl 和 PingConstant。
PingUrl 實(shí)現(xiàn)通過(guò)向服務(wù)實(shí)例發(fā)送HTTP請(qǐng)求來(lái)檢查其健康狀態(tài)。默認(rèn)情況下,它會(huì)向服務(wù)實(shí)例的 / 路徑發(fā)送 GET 請(qǐng)求來(lái)檢查服務(wù)實(shí)例是否存活。
而PingConstant 實(shí)現(xiàn)則更簡(jiǎn)單粗暴,無(wú)論什么情況下都返回 true,表示服務(wù)實(shí)例一直存活:
- ServerList:用于獲取所有可用的服務(wù)實(shí)例列表。
該接口有兩個(gè)方法:
- getInitialListOfServers(): 用于獲取初始化時(shí)所有可用的服務(wù)實(shí)例列表。
- getUpdatedListOfServers(): 用于獲取更新后的所有服務(wù)實(shí)例列表,包括動(dòng)態(tài)刷新的列表。
ServerList 接口的實(shí)現(xiàn)是由具體的服務(wù)發(fā)現(xiàn)組件完成的。在 Netflix Ribbon 中,常用的服務(wù)發(fā)現(xiàn)組件是 Netflix Eureka,它可以通過(guò) Eureka Server 獲取服務(wù)實(shí)例信息。
例如,Netflix Ribbon 提供了 DiscoveryEnabledNIWSServerList,它是通過(guò) Eureka 獲取服務(wù)實(shí)例的一個(gè)實(shí)現(xiàn)類(lèi)。這個(gè)實(shí)現(xiàn)類(lèi)會(huì)調(diào)用 Eureka Client 獲取服務(wù)實(shí)例的信息,然后將服務(wù)實(shí)例封裝成 Ribbon 的 Server 對(duì)象。
- ServerListFilter:用于對(duì)服務(wù)實(shí)例列表進(jìn)行過(guò)濾,以適應(yīng)特定需求。
它只有g(shù)etFilteredListOfServers這個(gè)方法,用于過(guò)濾服務(wù)實(shí)例列表,返回過(guò)濾后的服務(wù)實(shí)例列表。
ServerListFilter允許我們自定義過(guò)濾規(guī)則,以決定負(fù)載均衡器最終選擇的服務(wù)實(shí)例。我們可以根據(jù)自己的需求實(shí)現(xiàn)這個(gè)接口,定義自己的過(guò)濾規(guī)則。這個(gè)過(guò)程可以包括排除一些不符合條件的服務(wù)實(shí)例,或者根據(jù)特定標(biāo)準(zhǔn)重新排序服務(wù)實(shí)例列表等。
在 Netflix Ribbon 中,有一些內(nèi)置的過(guò)濾器,例如 ZonePreferenceServerListFilter、ZoneAffinityServerListFilter 等。這些過(guò)濾器基于服務(wù)實(shí)例所在的區(qū)域(Zone)來(lái)進(jìn)行服務(wù)實(shí)例的過(guò)濾和排序,例如:
2.Ribbon的負(fù)載均衡流程
下面詳細(xì)介紹下Ribbon的負(fù)載均衡流程:
- 獲取服務(wù)實(shí)例列表:Ribbon通過(guò)ServerList獲取可用的服務(wù)實(shí)例列表。
- 過(guò)濾服務(wù)實(shí)例:Ribbon會(huì)通過(guò)ServerListFilter對(duì)服務(wù)實(shí)例列表進(jìn)行過(guò)濾,可能會(huì)過(guò)濾掉一些不符合特定條件的實(shí)例。
- 選擇負(fù)載均衡策略:根據(jù)IRule選擇合適的負(fù)載均衡策略,如輪詢(xún)、隨機(jī)、加權(quán)輪詢(xún)等。這里的IRule可以是我們自己實(shí)現(xiàn)的規(guī)則。
- 選擇目標(biāo)服務(wù)實(shí)例:根據(jù)負(fù)載均衡策略,選擇一個(gè)目標(biāo)服務(wù)實(shí)例。
- 執(zhí)行請(qǐng)求:將請(qǐng)求發(fā)送到選擇的服務(wù)實(shí)例上。
3. Ribbon具體使用
接下來(lái),我們?cè)敿?xì)說(shuō)明下如何在項(xiàng)目中使用Ribbon。
- 首先,我們需要在Spring配置文件中初始化Ribbon(當(dāng)然maven的配置,各位老鐵就自己去配置了):
在上述配置中,我們通過(guò)ribbonRule指定了負(fù)載均衡規(guī)則,這里使用了AvailabilityFilteringRule,它會(huì)根據(jù)服務(wù)實(shí)例的狀態(tài)來(lái)判斷是否選擇該實(shí)例。而ribbonPing則用于設(shè)置服務(wù)實(shí)例的健康檢查策略。
- 發(fā)起服務(wù)調(diào)用
接下來(lái),我們通過(guò)RestTemplate來(lái)發(fā)起服務(wù)調(diào)用:
在這段代碼中,我們通過(guò)RestTemplate發(fā)起了對(duì)名為SERVICE-PROVIDER的服務(wù)的調(diào)用。
- 實(shí)現(xiàn)負(fù)載均衡
通過(guò)上述配置和代碼,Ribbon將會(huì)根據(jù)我們指定的負(fù)載均衡規(guī)則和健康檢查策略來(lái)選擇合適的服務(wù)實(shí)例,從而實(shí)現(xiàn)負(fù)載均衡。
本篇對(duì)Netflix Ribbon的底層實(shí)現(xiàn)原理進(jìn)行了簡(jiǎn)要介紹,涵蓋了其核心組件、架構(gòu)、負(fù)載均衡流程以及實(shí)現(xiàn)原理的基本概念。深入理解Netflix Ribbon對(duì)于構(gòu)建高性能、高可用的微服務(wù)架構(gòu)至關(guān)重要,希望能對(duì)您有所幫助。
作者介紹
波哥,互聯(lián)行業(yè)從業(yè)10余年,先后擔(dān)任項(xiàng)目總監(jiān)及架構(gòu)師。目前專(zhuān)攻技術(shù),喜歡研究技術(shù)原理。技術(shù)全面,主攻Java,精通JVM底層機(jī)制及Spring全家桶底層框架原理,熟練掌握當(dāng)前主流的中間件、服務(wù)網(wǎng)格等技術(shù)原理。
當(dāng)前名稱(chēng):深入剖析NetflixRibbon:分布式微服務(wù)架構(gòu)的負(fù)載均衡神器
當(dāng)前網(wǎng)址:http://m.fisionsoft.com.cn/article/cdgidgg.html


咨詢(xún)
建站咨詢(xún)
