版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第深入理解JavaSpringCloudRibbon負(fù)載均衡目錄前言1、拋出問(wèn)題2、源碼解析2.1、LoadBalancerIntercepor2.2、LoadBalancerClient2.3、負(fù)載均衡策略IRule2.4、總結(jié)3、負(fù)載均衡策略總結(jié)
前言
該技術(shù)博客是關(guān)于黑馬視頻教程的筆記總結(jié)!
服務(wù)消費(fèi)者需要通過(guò)RestTemplate調(diào)用注冊(cè)中心(Eureka)的服務(wù)提供者,但當(dāng)同一服務(wù)名稱的服務(wù)有多個(gè)的時(shí)候,我們的服務(wù)消費(fèi)者應(yīng)該調(diào)用哪一個(gè)服務(wù)呢?這時(shí)候就需要我們學(xué)習(xí)理解Ribbon負(fù)載均衡的實(shí)現(xiàn)原理。
當(dāng)我們?cè)赗estTemplate組件上加上@LoadBalanced注解,就會(huì)去注冊(cè)中心中拉取服務(wù)的實(shí)例列表,并且實(shí)現(xiàn)負(fù)載均衡,SpringCloud底層其實(shí)是利用了一個(gè)名為Ribbon的組件,來(lái)實(shí)現(xiàn)負(fù)載均衡功能的。
1、拋出問(wèn)題
比如我們的服務(wù)消費(fèi)者order-service發(fā)出請(qǐng)求:http://userservice/user/1
該請(qǐng)求并不能與注冊(cè)中心中的服務(wù)列表信息相符,那么是如何找到http://localhost:8081呢?
2、源碼解析
2.1、LoadBalancerIntercepor
上述信息已經(jīng)表明,我們沒(méi)有輸出IP和端口號(hào),只是通過(guò)了服務(wù)名稱(userservice)就能找到我們想要調(diào)用的服務(wù)!
這是因?yàn)镽ibbon組件中的LoadBalancerInterceptor(負(fù)載均衡攔截器)會(huì)將調(diào)用請(qǐng)求攔截,根據(jù)服務(wù)名稱獲取到服務(wù)實(shí)例的ip和端口。
LoadBalancerInterceptor會(huì)在將RestTemplate的請(qǐng)求進(jìn)行攔截,然后在Eureka注冊(cè)中心根據(jù)服務(wù)名稱獲取服務(wù)列表,隨后利用負(fù)載均衡算法得到真實(shí)的服務(wù)地址信息,替換服務(wù)名稱。
可以看到這里的intercept方法,攔截了調(diào)用請(qǐng)求HttpRequest,然后做了一下操作:
1.request.getURI():獲取請(qǐng)求uri,本例中就是http://user-service/user/8
2.originalUri.getHost():獲取uri路徑的主機(jī)名,其實(shí)就是服名稱:userservice
3.this.loadBalancer.execute():處理服務(wù)名稱,和用戶請(qǐng)求
這里的this.loadBalancer是LoadBalancerClient類型,我們繼續(xù)跟入execute方法!
2.2、LoadBalancerClient
代碼是這樣的:
getLoadBalancer(serviceId):根據(jù)服務(wù)名稱獲取ILoadBalancer接口,而ILoadBalancer會(huì)拿著服務(wù)名稱去eureka中獲取服務(wù)列表并保存起來(lái)。
getServer(loadBalancer):利用內(nèi)置的負(fù)載均衡算法,從服務(wù)列表中選擇一個(gè)。本例中,可以看到獲取了8082端口的服務(wù)
放行后,再次訪問(wèn)并跟蹤,發(fā)現(xiàn)變成獲取8081端口服務(wù),實(shí)現(xiàn)了負(fù)載均衡:
2.3、負(fù)載均衡策略IRule
在剛才的代碼中,可以看到獲取服務(wù)使通過(guò)一個(gè)getServer方法來(lái)做負(fù)載均衡:
繼續(xù)跟入getServer方法:
繼續(xù)跟蹤源碼chooseServer方法,發(fā)現(xiàn)這么一段代碼:
我們看看這個(gè)rule是誰(shuí):
這里的rule默認(rèn)值是一個(gè)RoundRobinRule,看看介紹:
翻譯過(guò)來(lái)就是輪詢的意思,這樣,整個(gè)負(fù)載均衡的流程我們就清楚了。
2.4、總結(jié)
Ribbon的底層采用了一個(gè)攔截器,攔截了RestTemplate發(fā)出的請(qǐng)求,對(duì)地址做了修改。用一幅圖來(lái)總結(jié)一下:
基本流程如下:
攔截我們的RestTemplate請(qǐng)求http://userservice/user/1
RibbonLoadBalancerClient會(huì)從請(qǐng)求url中獲取服務(wù)名稱,也就是userservice
DynamicServerListLoadBalancer根據(jù)userservice到eureka拉取服務(wù)列表:localhost:8081、localhost:8082
IRule利用內(nèi)置負(fù)載均衡規(guī)則,從列表中選擇一個(gè)服務(wù),例如localhost:8081
RibbonLoadBalancerClient修改請(qǐng)求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,發(fā)起真實(shí)請(qǐng)求
3、負(fù)載均衡策略
負(fù)載均衡的規(guī)則都定義在IRule接口中,而IRule有很多不同的實(shí)現(xiàn)類:
不同規(guī)則的含義如下:
默認(rèn)的實(shí)現(xiàn)就是ZoneAvoidanceRule,是一種輪詢方案
那么如何自定義負(fù)載均衡策略?
通過(guò)定義IRule實(shí)現(xiàn)可以修改負(fù)載均衡規(guī)則,有兩種方式:
1.代碼方式:在配置類或啟動(dòng)類(可以看作配置類)中,定義一個(gè)新的IRule:
@Bean
publicIRulerandomRule(){
//隨機(jī)策略
returnnewRandomRule();
配置文件方式:在application.yml文件中,添加新的配置也可以修改規(guī)則:
userservice:#給某個(gè)微服務(wù)配置負(fù)載均衡規(guī)則,這里是userservice服務(wù)
ribbon:
NFLoadBalance
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生計(jì)生監(jiān)督所管理制度
- 衛(wèi)生院藥品出庫(kù)制度
- 衛(wèi)生院農(nóng)合管理制度
- 經(jīng)營(yíng)店衛(wèi)生規(guī)章制度
- 游泳館衛(wèi)生清潔制度
- 衛(wèi)生院預(yù)防犯罪制度
- 鎮(zhèn)江市2025-2026學(xué)年第一學(xué)期高三零模英語(yǔ)試卷(含答案)+聽(tīng)力音頻+聽(tīng)力原文
- 衛(wèi)生院健康教育管理制度
- 鄉(xiāng)鎮(zhèn)衛(wèi)生院扶貧管理制度
- 鄉(xiāng)鎮(zhèn)衛(wèi)生院捐贈(zèng)管理制度
- 2026云南昭通市搬遷安置局招聘公益性崗位人員3人備考題庫(kù)及答案詳解(考點(diǎn)梳理)
- 四川發(fā)展控股有限責(zé)任公司會(huì)計(jì)崗筆試題
- 2025-2030心理健康行業(yè)市場(chǎng)發(fā)展分析及趨勢(shì)前景與投資戰(zhàn)略研究報(bào)告
- 技術(shù)副總年終總結(jié)
- 《馬年馬上有錢(qián)》少兒美術(shù)教育繪畫(huà)課件創(chuàng)意教程教案
- 天津市專升本高等數(shù)學(xué)歷年真題(2016-2025)
- 兒童骨科主任論兒童骨科
- 2025年化工原理考試題及答案
- 湖南省益陽(yáng)市2024-2025學(xué)年高二上學(xué)期語(yǔ)文1月期末考試試卷(含答案)
- 幕墻工程售后質(zhì)量保障服務(wù)方案
- 鋁合金鑄造項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論