亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

在Eureka注冊中心中我們在添加完@LoadBalanced注解,即可實現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon)。

一、整體流程

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

我們理解如下:

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

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

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

源碼跟蹤

(1)LoadBalancerIntercepor

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

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

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

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

代碼是這樣的:

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

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

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

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

繼續(xù)跟入:

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

我們看看這個rule是誰:

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

這不就是輪詢的意思。

小結(jié)

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

基本流程如下:

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

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

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

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

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

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

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

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

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

饑餓加載

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

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ù)庫的字段命名方式為使用下劃線連接,對應(yīng)的實體類應(yīng)該是駝峰命名方式,而我使用的是和數(shù)據(jù)庫同樣的命名方式,需要的朋友可以參考下
    2022-01-01
  • ChatGPT在IDEA中使用的詳細(xì)過程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    淺析Alibaba Nacos注冊中心源碼剖析

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

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

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

最新評論