<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Feign第一次調用為什么會很慢?

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-08-17 15:00 ? 次閱讀

前言

首先要了解 Feign 是如何進行遠程調用的,這里面包括,注冊中心、負載均衡、FeignClient 之間的關系,微服務通過不論是 eureka、nacos 也好注冊到服務端,Feign 是靠 Ribbon 做負載的,而 Ribbon 需要拿到注冊中心的服務列表,將服務進行負載緩存到本地,然后 FeignClient 客戶端在進行調用,大概就是這么一個過程。

Ribbon是如何進行負載的

首先我們要清楚 Ribbon 是如何進行負載的,也就是如何獲取 nacos、eureka 的服務列表,這個很關鍵。

3769c2fe-3c9e-11ee-ac96-dac502259ad0.jpg

Ribbon是如何進行負載的

RibbonClientConfiguration

RibbonClientConfiguration 類中通過 LoadBalancer,我們知道 ribbon 是靠LoadBalancer 做負載的 無非就是 ILoadBalancer 接口的方法,依次是添加新的服務、在負載均衡里選擇一個服務、markServerDown 服務下線、獲取服務列表、獲取存活的服務器、獲取所有服務器(包括健康和不健康的)

377c7a2a-3c9e-11ee-ac96-dac502259ad0.jpg

ILoadBalancer 接口

ZoneAwareLoadBalancer

loadBalancer 默認的是 ZoneAwareLoadBalancer 負載均衡器,通過繼承父類DynamicServerListLoadBalancer 的 restOfInit 方法,里面比較重要的兩個方法,enableAndInitLearnNewServersFeature和updateListOfServers 方法

37b342bc-3c9e-11ee-ac96-dac502259ad0.jpg

restOfInit 方法

enableAndInitLearnNewServersFeature 方法里面。

LOGGER.info("UsingserverListUpdater{}",serverListUpdater.getClass().getSimpleName());
serverListUpdater.start(updateAction);

讓我們看 ServerListUpdater.start 方法的實現,通過自定義線程去拿,這就是獲取服務列表。

37cc6d50-3c9e-11ee-ac96-dac502259ad0.jpg

ServerListUpdater.start

Ribbon負載均衡策略

服務列表獲取說了,當然負載均衡的策略這塊也有必要講一下,主要有七種;

RoundRobinRule(輪詢策略,按照服務順序依次循環調用)

WeightedResponseTimeRule(權重比策略,優先選擇權重比高的服務,也就是服務響應時間比較短的,響應時間越長權重比越低)

RandomRule(隨機策略,服務提供者列表隨機選擇一個服務)

BestAvailableRule(最小連接數策略,獲取服務列表中連接數最小的服務實例)

RetryRule(重試策略,重試獲取已經失效的服務,指定時間沒有獲取到返回NULL)

AvailabilityFilteringRule(可用性敏感策略,過濾非健康服務實例,選擇lianji)

ZoneAvoidanceRule(區域敏感策略)

Ribbon-eager-load(饑餓加載)模式

Ribbon 對于負載 Client 是在服務啟動后,發生調用的時候才會去創建 Client,所以在第一次發生 http 請求調用的時候,不光要算上 http 的請求時間,還要算上 Client 的創建時間,所以第一次調用的時候才會很慢,寫個方法調用下。

System 服務調用 System2 服務

@GetMapping("/requestSystem2Api")
publicStringrequestSystem2Api(){
longstartTime=System.currentTimeMillis();
RstringR=iTestServiceClient.testRequestMethod();
if(null!=stringR){
log.info("接口返回:"+stringR.getMsg());
}
longneedTime=System.currentTimeMillis()-startTime;
log.info("接口調用需要的時間:"+needTime);
return"";
}

從調用日志可以看出,第一次調用 System2 服務,Ribbon 的 DynamicServerListLoadBalancer 會將 feign 客戶端進行負載,然后進行調用,第一次調用的時間就是會長一些,第二次調用直接進行請求可以看到調用時間很快。

37f311da-3c9e-11ee-ac96-dac502259ad0.jpg

第一次慢,第二次快

開啟Ribbon饑餓加載

ribbon:
nacos:
enabled:true#開啟naocos輪詢
eager-load:
enabled:true#開啟Ribbon的饑餓加載模式(防止第一次請求超時的問題)
clients:Lxlxxx-system2#指定需要開啟的服務(需要開啟Ribbon的饑餓加載模式)
ReadTimeout:10000
ConnectTimeout:10000
MaxAutoRetries:0
MaxAutoRetriesNextServer:1
OkToRetryOnAllOperations:false

在項目啟動的時候,可以從日志看到,已經把 Lxlxxx-system2 服務進行加載,從而避免了第一次請求超時的情況。

380b5f9c-3c9e-11ee-ac96-dac502259ad0.jpg

開啟Ribbon饑餓加載

總結

其實這種饑餓加載模式,類似于“客戶端負載預熱”的一個操作,項目啟動的時候進行加載,防止服務之間調用可以因為數據量、業務邏輯處理復雜性導致接口超時,如果你的服務之間調用業務處理比較復雜、且慢,不妨可以試試這種解決方式。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • HTTP接口
    +關注

    關注

    0

    文章

    21

    瀏覽量

    1661
  • 負載均衡器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    2557

原文標題:面試官:Feign 第一次調用為什么會很慢?大部分人都答不上來!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    下載第一次就e幣不夠咋辦

    下載第一次就e幣不夠咋辦
    發表于 04-04 14:16

    第一次

    嘿嘿??!我是第一次來??!大家好??!
    發表于 07-29 09:12

    第一次畫的板子

    第一次畫的板子
    發表于 12-25 16:27

    第一次發帖

    第一次發帖,大家好!!!!
    發表于 12-29 13:00

    第一次

    新人第一次發帖,還望多多指教,本人在互聯先鋒,做海外服務器這快的,有需要的可以Q我,有優惠哦!QQ:228830658
    發表于 05-16 16:42

    第一次發帖,關于制作機器人越野車的問題

    第一次做機器人,也是第一次來論壇發帖。我在設計個越野車,可以過些簡單的路障,跟隨引導線前進的。我有幾個問題不明白:1、跟隨引導線(白色)前進是什么原理?攝像頭識別白色引導前進么?2
    發表于 07-17 16:34

    第一次申請成功

    第一次申請成功,還沒有收到。使用后再上傳試用報告。
    發表于 01-29 13:17

    第一次發帖,試試看

    第一次發帖,試試看,新手
    發表于 03-11 10:44

    第一次來到

    第一次來找不到自己的行業,想哭
    發表于 06-07 11:54

    第一次使用3081模塊

    第一次使用3081模塊,也是第一次使用wifi模塊,自己把那些要調試的引腳都接出來,用SecureCRT發送AT指令完全沒有回應。手冊說可以用wifi連接模塊,然而無線收不到wifi的信息。我想應該是我理解錯了,請告知正確的不用開發板的調試方式。
    發表于 08-16 16:41

    labview如何記錄函數輸出第一次出現某重復值的時刻

    `調用dll函數時,函數輸出會由0變為1最后為2,為1時是對采集的聲音信號進行處理,故持續段時間,想把當輸出第一次由0變為1的時刻記錄下來,該怎么做?`
    發表于 03-01 15:53

    為什么A/D的第一次閱讀可能丟失

    我想知道為什么A/D的第一次閱讀可能丟失。我將更詳細地解釋它,并提供代碼,但認為可能首先有個簡單的解釋,比如采集時間或其他我沒有正確設置的東西。PIC18F26K40@64MHz。第一次
    發表于 04-01 10:19

    第一次網站設計稿的方法

    第一次網站設計稿
    發表于 06-16 09:43

    為什么IO第一次讀時可能讀不到

    需要讀的IO第一次讀時可能讀不到,要第二才可以,在需要進睡眠的時候注意單片機計時標記最好使用加,不要用減,否則可能減不到0,加volatile也不行仿真時加volatile可以看變量,否則未
    發表于 07-16 06:36

    NTPClient為什么只有第一次調用“timeClient.update”時日期部分是錯誤的嗎?

    秒讀取一次)。 要讀取日期和時間,我正在使用 NTPClient 庫,當“顯示單元”啟動時會出現問題。 在草圖中“循環”的“第一次調用中,它讀取當前日期和時間并顯示它。 所以第一次
    發表于 05-12 07:35
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>