深入理解Java SpringCloud Ribbon 負(fù)載均衡_第1頁(yè)
深入理解Java SpringCloud Ribbon 負(fù)載均衡_第2頁(yè)
深入理解Java SpringCloud Ribbon 負(fù)載均衡_第3頁(yè)
深入理解Java SpringCloud Ribbon 負(fù)載均衡_第4頁(yè)
深入理解Java SpringCloud Ribbon 負(fù)載均衡_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論