欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud?Ribbon負(fù)載均衡流程分析

 更新時(shí)間:2024年03月30日 12:18:51   作者:浩澤學(xué)編程  
在Eureka注冊(cè)中心中我們?cè)谔砑油闌LoadBalanced注解,即可實(shí)現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon),感興趣的朋友一起看看吧

前言

在Eureka注冊(cè)中心中我們?cè)谔砑油闌LoadBalanced注解,即可實(shí)現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon)。

一、整體流程

現(xiàn)在我們發(fā)出的請(qǐng)求明明是http://userservice/user/8,怎么變成了http://localhost:8081(http://localhost:8082,http://localhost:8083)的呢?

我們理解如下:

  • 現(xiàn)在有倆個(gè)服務(wù)order-server和user-server,現(xiàn)在我們使用的假設(shè)是Eureka注冊(cè)中心,且order-server內(nèi)存在遠(yuǎn)程調(diào)用服務(wù)user-server(不過我們現(xiàn)在目前都是在一個(gè)電腦上運(yùn)行,不要在意這個(gè)遠(yuǎn)程的說法不貼切)。
  • 在這兩個(gè)服務(wù)啟動(dòng)時(shí)會(huì)注冊(cè)信息到Eureka注冊(cè)中心(現(xiàn)在假設(shè)user-server服務(wù)有三個(gè)相同服務(wù),怎去選擇呢,三個(gè)服務(wù)地址分別是local:8081、local:8082、local:8083都已經(jīng)注冊(cè)到注冊(cè)中心,并且服務(wù)名稱都是userserver)
  • order-server遠(yuǎn)程調(diào)用userserver服務(wù)(http://userservice/user/8),現(xiàn)在會(huì)去注冊(cè)中心拉取user-server的信息,注冊(cè)中心找到三個(gè)服務(wù)名為userserver的ip地址并全部返回。
  • order-server用的哪個(gè)?這時(shí)候就是根據(jù)Ribbon負(fù)載均衡算法進(jìn)行選擇的,它默認(rèn)是輪詢的規(guī)則。
  • 假設(shè)首先輪詢到的是localhost:8081,就去訪問http://localhost:8081。

二、負(fù)載均衡原理

有人幫我們根據(jù)service名稱,獲取到了服務(wù)實(shí)例的ip和端口。它就是LoadBalancerInterceptor,這個(gè)類會(huì)在對(duì)RestTemplate的請(qǐng)求進(jìn)行攔截(上篇文章講過,我們使用RestTemplate實(shí)現(xiàn)遠(yuǎn)程調(diào)用),然后從Eureka根據(jù)服務(wù)id獲取服務(wù)列表,隨后利用負(fù)載均衡算法得到真實(shí)的服務(wù)地址信息,替換服務(wù)id

源碼跟蹤

(1)LoadBalancerIntercepor

可以看到這里的intercept方法,攔截了用戶的HttpRequest請(qǐng)求,然后做了幾件事:

  • request.getURI():獲取請(qǐng)求uri,本例中就是 http://userservice/user/8
  • originalUri.getHost():獲取uri路徑的主機(jī)名,其實(shí)就是服務(wù)id:userservicethis.loadBalancer.execute():處理服務(wù)id和用戶請(qǐng)求。

這里的this.loadBalancerLoadBalancerClient類型,我們繼續(xù)跟入。

(2)LoadBalancerClient
繼續(xù)跟入execute方法:

代碼是這樣的:

  • getLoadBalancer(serviceId):根據(jù)服務(wù)id獲取ILoadBalancer,而ILoadBalancer會(huì)拿著服務(wù)id去eureka中獲取服務(wù)列表并保存起來。
  • getServer(loadBalancer):利用內(nèi)置的負(fù)載均衡算法,從服務(wù)列表中選擇一個(gè)。本例中,可以看到獲取了8082端口的服務(wù)

放行后,再次訪問并跟蹤,發(fā)現(xiàn)獲取的是8081:

顯然實(shí)現(xiàn)了負(fù)載均衡。

(3)負(fù)載均衡策略IRule
在剛才的代碼中,可以看到獲取服務(wù)使通過一個(gè)getServer方法來做負(fù)載均衡:

繼續(xù)跟入:

繼續(xù)跟蹤源碼chooseServer方法,發(fā)現(xiàn)這么一段代碼:

我們看看這個(gè)rule是誰:

這里的rule默認(rèn)值是一個(gè)RoundRobinRule,看類的介紹:

這不就是輪詢的意思。

小結(jié)

SpringCloud Ribbon的底層采用了一個(gè)攔截器,攔截了RestTemplate發(fā)出的請(qǐng)求,對(duì)地址做了修改。用一幅圖來總結(jié)一下:

基本流程如下:

  • 攔截我們的RestTemplate請(qǐng)求http://userservice/user/1
  • RibbonLoadBalancerClient會(huì)從請(qǐng)求url中獲取服務(wù)名稱,也就是userservice
  • DynamicServerListLoadBalancer根據(jù)userservice到eureka拉取服務(wù)列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用內(nèi)置負(fù)載均衡規(guī)則,從列表中選擇一個(gè),例如localhost:8081
  • RibbonLoadBalancerClient修改請(qǐng)求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,發(fā)起真實(shí)請(qǐng)求

三、負(fù)載均衡策略

負(fù)載均衡的規(guī)則都定義在IRule接口中,而IRule有很多不同的實(shí)現(xiàn)類:

內(nèi)置負(fù)載均衡規(guī)則類規(guī)則描述
RoundRobinRule簡(jiǎn)單輪詢服務(wù)列表來選擇服務(wù)器。它是Ribbon默認(rèn)的負(fù)載均衡規(guī)則。
AvailabilityFilteringRule對(duì)以下兩種服務(wù)器進(jìn)行忽略: (1)在默認(rèn)情況下,這臺(tái)服務(wù)器如果3次連接失敗,這臺(tái)服務(wù)器就會(huì)被設(shè)置為“短路”狀態(tài)。短路狀態(tài)將持續(xù)30秒,如果再次連接失敗,短路的持續(xù)時(shí)間就會(huì)幾何級(jí)地增加。 (2)并發(fā)數(shù)過高的服務(wù)器。如果一個(gè)服務(wù)器的并發(fā)連接數(shù)過高,配置了AvailabilityFilteringRule規(guī)則的客戶端也會(huì)將其忽略。并發(fā)連接數(shù)的上限,可以由客戶端的..ActiveConnectionsLimit屬性進(jìn)行配置。
WeightedResponseTimeRule為每一個(gè)服務(wù)器賦予一個(gè)權(quán)重值。服務(wù)器響應(yīng)時(shí)間越長(zhǎng),這個(gè)服務(wù)器的權(quán)重就越小。這個(gè)規(guī)則會(huì)隨機(jī)選擇服務(wù)器,這個(gè)權(quán)重值會(huì)影響服務(wù)器的選擇。
ZoneAvoidanceRule以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇。使用Zone對(duì)服務(wù)器進(jìn)行分類,這個(gè)Zone可以理解為一個(gè)機(jī)房、一個(gè)機(jī)架等。而后再對(duì)Zone內(nèi)的多個(gè)服務(wù)做輪詢。
BestAvailableRule忽略那些短路的服務(wù)器,并選擇并發(fā)數(shù)較低的服務(wù)器。
RandomRule隨機(jī)選擇一個(gè)可用的服務(wù)器。
RetryRule重試機(jī)制的選擇邏輯

自定義負(fù)載均衡策略

通過定義IRule實(shí)現(xiàn)可以修改負(fù)載均衡規(guī)則,有兩種方式:
1.代碼方式:在order-service中的OrderApplication類中,定義一個(gè)新的IRule:

@Bean
public IRule randomRule(){
    return new RandomRule();
}

2.配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改規(guī)則:

userservice: # 給某個(gè)微服務(wù)配置負(fù)載均衡規(guī)則,這里是userservice服務(wù)
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負(fù)載均衡規(guī)則 

饑餓加載

Ribbon默認(rèn)是采用懶加載,即第一次訪問時(shí)才會(huì)去創(chuàng)建LoadBalanceClient,請(qǐng)求時(shí)間會(huì)很長(zhǎng)。
而饑餓加載則會(huì)在項(xiàng)目啟動(dòng)時(shí)創(chuàng)建,降低第一次訪問的耗時(shí),通過下面配置開啟饑餓加載:

ribbon:
  eager-load:
    enabled: true
    clients: userservice

總結(jié)

以上就是關(guān)于Ribbon負(fù)載均衡的講解。

相關(guān)文章

  • Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull)

    Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull)

    這篇文章主要介紹了Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull),數(shù)據(jù)庫(kù)的字段命名方式為使用下劃線連接,對(duì)應(yīng)的實(shí)體類應(yīng)該是駝峰命名方式,而我使用的是和數(shù)據(jù)庫(kù)同樣的命名方式,需要的朋友可以參考下
    2022-01-01
  • ChatGPT在IDEA中使用的詳細(xì)過程

    ChatGPT在IDEA中使用的詳細(xì)過程

    這篇文章主要介紹了ChatGPT在IDEA中使用的詳細(xì)過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • SpringBoot實(shí)現(xiàn)yml配置文件為變量賦值

    SpringBoot實(shí)現(xiàn)yml配置文件為變量賦值

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)yml配置文件為變量賦值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • JDK10中的局部變量類型推斷var

    JDK10中的局部變量類型推斷var

    這篇文章主要介紹了JDK10中的局部變量類型推斷var,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java Lambda表達(dá)式原理及多線程實(shí)現(xiàn)

    Java Lambda表達(dá)式原理及多線程實(shí)現(xiàn)

    這篇文章主要介紹了Java Lambda表達(dá)式原理及多線程實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 每日幾道java新手入門面試題,通往自由的道路

    每日幾道java新手入門面試題,通往自由的道路

    這篇文章主要為大家分享了最有價(jià)值的是幾道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對(duì)hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Spring Boot(五)之跨域、自定義查詢及分頁(yè)

    Spring Boot(五)之跨域、自定義查詢及分頁(yè)

    這篇文章主要介紹了Spring Boot(五)之跨域、自定義查詢及分頁(yè)的的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Springboot之如何統(tǒng)計(jì)代碼執(zhí)行耗時(shí)時(shí)間

    Springboot之如何統(tǒng)計(jì)代碼執(zhí)行耗時(shí)時(shí)間

    這篇文章主要介紹了Springboot之如何統(tǒng)計(jì)代碼執(zhí)行耗時(shí)時(shí)間問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 淺析Alibaba Nacos注冊(cè)中心源碼剖析

    淺析Alibaba Nacos注冊(cè)中心源碼剖析

    這篇文章主要介紹了淺析Alibaba Nacos注冊(cè)中心源碼剖析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • java 啟動(dòng)exe程序,傳遞參數(shù)和獲取參數(shù)操作

    java 啟動(dòng)exe程序,傳遞參數(shù)和獲取參數(shù)操作

    這篇文章主要介紹了java 啟動(dòng)exe程序,傳遞參數(shù)和獲取參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評(píng)論