0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Feign第一次調(diào)用為什么會(huì)很慢?

jf_ro2CN3Fa ? 來(lái)源:稀土掘金 ? 2023-08-17 15:00 ? 次閱讀

前言

首先要了解 Feign 是如何進(jìn)行遠(yuǎn)程調(diào)用的,這里面包括,注冊(cè)中心、負(fù)載均衡、FeignClient 之間的關(guān)系,微服務(wù)通過(guò)不論是 eureka、nacos 也好注冊(cè)到服務(wù)端,F(xiàn)eign 是靠 Ribbon 做負(fù)載的,而 Ribbon 需要拿到注冊(cè)中心的服務(wù)列表,將服務(wù)進(jìn)行負(fù)載緩存到本地,然后 FeignClient 客戶(hù)端在進(jìn)行調(diào)用,大概就是這么一個(gè)過(guò)程。

Ribbon是如何進(jìn)行負(fù)載的

首先我們要清楚 Ribbon 是如何進(jìn)行負(fù)載的,也就是如何獲取 nacos、eureka 的服務(wù)列表,這個(gè)很關(guān)鍵。

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

Ribbon是如何進(jìn)行負(fù)載的

RibbonClientConfiguration

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

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

ILoadBalancer 接口

ZoneAwareLoadBalancer

loadBalancer 默認(rèn)的是 ZoneAwareLoadBalancer 負(fù)載均衡器,通過(guò)繼承父類(lèi)DynamicServerListLoadBalancer 的 restOfInit 方法,里面比較重要的兩個(gè)方法,enableAndInitLearnNewServersFeature和updateListOfServers 方法

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

restOfInit 方法

enableAndInitLearnNewServersFeature 方法里面。

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

讓我們看 ServerListUpdater.start 方法的實(shí)現(xiàn),通過(guò)自定義線(xiàn)程去拿,這就是獲取服務(wù)列表。

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

ServerListUpdater.start

Ribbon負(fù)載均衡策略

服務(wù)列表獲取說(shuō)了,當(dāng)然負(fù)載均衡的策略這塊也有必要講一下,主要有七種;

RoundRobinRule(輪詢(xún)策略,按照服務(wù)順序依次循環(huán)調(diào)用)

WeightedResponseTimeRule(權(quán)重比策略,優(yōu)先選擇權(quán)重比高的服務(wù),也就是服務(wù)響應(yīng)時(shí)間比較短的,響應(yīng)時(shí)間越長(zhǎng)權(quán)重比越低)

RandomRule(隨機(jī)策略,服務(wù)提供者列表隨機(jī)選擇一個(gè)服務(wù))

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

RetryRule(重試策略,重試獲取已經(jīng)失效的服務(wù),指定時(shí)間沒(méi)有獲取到返回NULL)

AvailabilityFilteringRule(可用性敏感策略,過(guò)濾非健康服務(wù)實(shí)例,選擇lianji)

ZoneAvoidanceRule(區(qū)域敏感策略)

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

Ribbon 對(duì)于負(fù)載 Client 是在服務(wù)啟動(dòng)后,發(fā)生調(diào)用的時(shí)候才會(huì)去創(chuàng)建 Client,所以在第一次發(fā)生 http 請(qǐng)求調(diào)用的時(shí)候,不光要算上 http 的請(qǐng)求時(shí)間,還要算上 Client 的創(chuàng)建時(shí)間,所以第一次調(diào)用的時(shí)候才會(huì)很慢,寫(xiě)個(gè)方法調(diào)用下。

System 服務(wù)調(diào)用 System2 服務(wù)

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

從調(diào)用日志可以看出,第一次調(diào)用 System2 服務(wù),Ribbon 的 DynamicServerListLoadBalancer 會(huì)將 feign 客戶(hù)端進(jìn)行負(fù)載,然后進(jìn)行調(diào)用,第一次調(diào)用的時(shí)間就是會(huì)長(zhǎng)一些,第二次調(diào)用直接進(jìn)行請(qǐng)求可以看到調(diào)用時(shí)間很快。

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

第一次慢,第二次快

開(kāi)啟Ribbon饑餓加載

ribbon:
nacos:
enabled:true#開(kāi)啟naocos輪詢(xún)
eager-load:
enabled:true#開(kāi)啟Ribbon的饑餓加載模式(防止第一次請(qǐng)求超時(shí)的問(wèn)題)
clients:Lxlxxx-system2#指定需要開(kāi)啟的服務(wù)(需要開(kāi)啟Ribbon的饑餓加載模式)
ReadTimeout:10000
ConnectTimeout:10000
MaxAutoRetries:0
MaxAutoRetriesNextServer:1
OkToRetryOnAllOperations:false

在項(xiàng)目啟動(dòng)的時(shí)候,可以從日志看到,已經(jīng)把 Lxlxxx-system2 服務(wù)進(jìn)行加載,從而避免了第一次請(qǐng)求超時(shí)的情況。

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

開(kāi)啟Ribbon饑餓加載

總結(jié)

其實(shí)這種饑餓加載模式,類(lèi)似于“客戶(hù)端負(fù)載預(yù)熱”的一個(gè)操作,項(xiàng)目啟動(dòng)的時(shí)候進(jìn)行加載,防止服務(wù)之間調(diào)用可以因?yàn)閿?shù)據(jù)量、業(yè)務(wù)邏輯處理復(fù)雜性導(dǎo)致接口超時(shí),如果你的服務(wù)之間調(diào)用業(yè)務(wù)處理比較復(fù)雜、且慢,不妨可以試試這種解決方式。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HTTP接口
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    1768
  • 負(fù)載均衡器
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    2573

原文標(biāo)題:面試官:Feign 第一次調(diào)用為什么會(huì)很慢?大部分人都答不上來(lái)!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PCB Layout的第一次經(jīng)歷分享

    PCB Layout的第一次經(jīng)歷分享 試著layout回,使用的軟件是PADS layout 2005 sp1。據(jù)同事說(shuō)這個(gè)軟件不算穩(wěn)定,用時(shí)心里也有點(diǎn)虛,不過(guò)上手的時(shí)候用的就是這個(gè)版本,就沒(méi)
    發(fā)表于 01-16 16:59 ?2601次閱讀

    第一次來(lái)

    嘿嘿??!我是第一次來(lái)!!大家好!!
    發(fā)表于 07-29 09:12

    第一次畫(huà)的板子

    第一次畫(huà)的板子
    發(fā)表于 12-25 16:27

    第一次發(fā)帖

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

    第一次

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

    第一次發(fā)帖,關(guān)于制作機(jī)器人越野車(chē)的問(wèn)題

    第一次做機(jī)器人,也是第一次來(lái)論壇發(fā)帖。我在設(shè)計(jì)個(gè)越野車(chē),可以過(guò)些簡(jiǎn)單的路障,跟隨引導(dǎo)線(xiàn)前進(jìn)的。我有幾個(gè)問(wèn)題不明白:1、跟隨引導(dǎo)線(xiàn)(白色)前進(jìn)是什么原理?攝像頭識(shí)別白色引導(dǎo)前進(jìn)么?2
    發(fā)表于 07-17 16:34

    第一次申請(qǐng)成功

    第一次申請(qǐng)成功,還沒(méi)有收到。使用后再上傳試用報(bào)告。
    發(fā)表于 01-29 13:17

    第一次來(lái)到

    第一次來(lái)找不到自己的行業(yè),想哭
    發(fā)表于 06-07 11:54

    第一次使用3081模塊

    第一次使用3081模塊,也是第一次使用wifi模塊,自己把那些要調(diào)試的引腳都接出來(lái),用SecureCRT發(fā)送AT指令完全沒(méi)有回應(yīng)。手冊(cè)說(shuō)可以用wifi連接模塊,然而無(wú)線(xiàn)收不到wifi的信息。我想應(yīng)該是我理解錯(cuò)了,請(qǐng)告知正確的不用開(kāi)發(fā)板的調(diào)試方式。
    發(fā)表于 08-16 16:41

    為什么A/D的第一次閱讀可能會(huì)丟失

    我想知道為什么A/D的第一次閱讀可能會(huì)丟失。我將更詳細(xì)地解釋它,并提供代碼,但認(rèn)為可能首先有個(gè)簡(jiǎn)單的解釋?zhuān)热绮杉瘯r(shí)間或其他我沒(méi)有正確設(shè)置的東西。PIC18F26K40@64MHz。第一次
    發(fā)表于 04-01 10:19

    為什么IO第一次讀時(shí)可能讀不到

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

    NTPClient為什么只有第一次調(diào)用“timeClient.update”時(shí)日期部分是錯(cuò)誤的嗎?

    秒讀取一次)。 要讀取日期和時(shí)間,我正在使用 NTPClient 庫(kù),當(dāng)“顯示單元”啟動(dòng)時(shí)會(huì)出現(xiàn)問(wèn)題。 在草圖中“循環(huán)”的“第一次調(diào)用中,它讀取當(dāng)前日期和時(shí)間并顯示它。 所以第一次
    發(fā)表于 05-12 07:35

    第一次使用國(guó)產(chǎn)芯片--芯旺微--KungFu--ChipOn

    第一次使用國(guó)產(chǎn)芯片--芯旺微--KungFu--ChipOn
    發(fā)表于 11-30 16:51 ?21次下載
    <b class='flag-5'>第一次</b>使用國(guó)產(chǎn)芯片--芯旺微--KungFu--ChipOn

    第一次用示波器如何測(cè)個(gè)信號(hào)(新人基礎(chǔ))

    有的人第一次使用示波器可能會(huì)被示波器的堆理論知識(shí)繞暈,從而喪失學(xué)習(xí)的興趣。
    的頭像 發(fā)表于 11-05 17:15 ?3208次閱讀
    <b class='flag-5'>第一次</b>用示波器如何測(cè)<b class='flag-5'>一</b>個(gè)信號(hào)(新人基礎(chǔ))

    OpenHarmony項(xiàng)目群生態(tài)委員會(huì)第一次線(xiàn)下會(huì)議成功召開(kāi)

    4月18日,在鴻湖萬(wàn)聯(lián)(江蘇)科技發(fā)展有限公司支持下, OpenAtom OpenHarmony(簡(jiǎn)稱(chēng)"OpenHarmony")項(xiàng)目群生態(tài)委員會(huì)第一次線(xiàn)下會(huì)議在無(wú)錫市國(guó)家軟件園召開(kāi)。
    的頭像 發(fā)表于 04-20 09:42 ?519次閱讀