最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)在目前都是在一個電腦上運(yù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)文章

  • Java實現(xiàn)限流接口的示例詳解

    Java實現(xiàn)限流接口的示例詳解

    限流是對某一時間窗口內(nèi)的請求數(shù)進(jìn)行限制,保持系統(tǒng)的可用性和穩(wěn)定性,防止因流量暴增而導(dǎo)致的系統(tǒng)運(yùn)行緩慢或宕機(jī),本文主要來和大家聊聊如何使用java實現(xiàn)限流接口,感興趣的可以了解下
    2023-12-12
  • 詳解Java設(shè)計模式編程中命令模式的項目結(jié)構(gòu)實現(xiàn)

    詳解Java設(shè)計模式編程中命令模式的項目結(jié)構(gòu)實現(xiàn)

    這篇文章主要介紹了Java設(shè)計模式編程中命令模式的項目結(jié)構(gòu)實現(xiàn),命令模式將請求與執(zhí)行分離,可以多個命令接口的實現(xiàn)類,隱藏真實的被調(diào)用方,需要的朋友可以參考下
    2016-04-04
  • java實現(xiàn)從方法返回多個值功能示例

    java實現(xiàn)從方法返回多個值功能示例

    這篇文章主要介紹了java實現(xiàn)從方法返回多個值功能,結(jié)合實例形式分析了集合類、封裝對象、引用傳遞三種實現(xiàn)方法,需要的朋友可以參考下
    2017-10-10
  • Java中comparator接口和Comparable接口的比較解析

    Java中comparator接口和Comparable接口的比較解析

    這篇文章主要介紹了Java中comparator接口和Comparable接口的比較解析,Java提供了一個用于比較的接口Comparator和Comparable接口,提供了一個比較的方法,所有實現(xiàn)該接口的類,都動態(tài)的實現(xiàn)了該比較方法,需要的朋友可以參考下
    2023-08-08
  • SpringSecurity HttpSecurity 類處理流程分析

    SpringSecurity HttpSecurity 類處理流程分析

    SpringSecurity在SSM項目中使用基于配置文件,通過XML標(biāo)簽定義認(rèn)證信息,HttpSecurity在SpringBoot中通過代碼配置實現(xiàn)與XML相同功能,詳細(xì)介紹了HttpSecurity的類結(jié)構(gòu)、處理過程及其與SecurityBuilder的關(guān)系,感興趣的朋友一起看看吧
    2024-09-09
  • Java方法的可變參數(shù)類型實例分析

    Java方法的可變參數(shù)類型實例分析

    這篇文章主要介紹了Java方法的可變參數(shù)類型,通過實例對Java中的可變參數(shù)類型進(jìn)行了較為深入的分析,需要的朋友可以參考下
    2014-09-09
  • SpringBoot中的分布式追蹤及使用詳解

    SpringBoot中的分布式追蹤及使用詳解

    隨著互聯(lián)網(wǎng)應(yīng)用程序的復(fù)雜性不斷增加,分布式系統(tǒng)已經(jīng)成為了許多企業(yè)級應(yīng)用程序的標(biāo)配,由于服務(wù)之間的調(diào)用關(guān)系錯綜復(fù)雜,很難追蹤到一個請求在整個系統(tǒng)中的執(zhí)行路徑和時間,為了解決這個問題,本文將介紹SpringBoot中的分布式追蹤技術(shù)及其使用方法
    2023-07-07
  • 詳解如何在Java中創(chuàng)建Excel迷你圖

    詳解如何在Java中創(chuàng)建Excel迷你圖

    迷你圖是一種簡潔而有效的數(shù)據(jù)可視化方式,常用于展示趨勢和變化,通常被用于數(shù)據(jù)儀表盤、報告和展示中,以便在有限的空間內(nèi)展示多個數(shù)據(jù)集的趨勢,今天小編為大家介紹如何在Java中創(chuàng)建Excel迷你圖,需要的朋友可以參考下
    2023-10-10
  • 實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口

    實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口

    這篇文章主要為大家介紹了實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-04-04
  • Spring Hibernate實現(xiàn)分頁功能

    Spring Hibernate實現(xiàn)分頁功能

    這篇文章主要為大家詳細(xì)介紹了Spring Hibernate實現(xiàn)分頁功能的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論

鸡泽县| 沁水县| 漳平市| 宜阳县| 资阳市| 滨海县| 盐源县| 枞阳县| 罗田县| 普定县| 武宁县| 乡城县| 东乌珠穆沁旗| 临邑县| 天水市| 泸定县| 丹棱县| 简阳市| 甘泉县| 杭州市| 抚松县| 保靖县| 南宫市| 湘潭县| 焦作市| 汨罗市| 汝城县| 前郭尔| 乌恰县| 久治县| 临桂县| 永平县| 白水县| 友谊县| 凌海市| 武鸣县| 阿合奇县| 齐齐哈尔市| 泸西县| 江山市| 怀柔区|