Ribbon的饑餓加載(eager-load)模式解讀
Ribbon的饑餓加載(eager-load)模式
目前測(cè)試的時(shí)候發(fā)現(xiàn)在服務(wù)都成功啟動(dòng)的時(shí)候第一次訪問會(huì)有報(bào)錯(cuò)的情況發(fā)生,但是之后又恢復(fù)正常訪問
通過查詢相關(guān)文檔,了解到要解決此問題那么讓需要實(shí)例化的類提前創(chuàng)建,而不是在第一次調(diào)用的時(shí)候創(chuàng)建
摘自DD的博客:
主要是Ribbon進(jìn)行客戶端負(fù)載均衡的Client并不是在服務(wù)啟動(dòng)的時(shí)候就初始化好的,而是在調(diào)用的時(shí)候才會(huì)去創(chuàng)建相應(yīng)的Client,所以第一次調(diào)用的耗時(shí)不僅僅包含發(fā)送HTTP請(qǐng)求的時(shí)間,還包含了創(chuàng)建RibbonClient的時(shí)間,這樣一來如果創(chuàng)建時(shí)間速度較慢,同時(shí)設(shè)置的超時(shí)時(shí)間又比較短的話,很容易就會(huì)出現(xiàn)上面所描述的顯現(xiàn)。
因此我們可以通過設(shè)置:
ribbon.eager-load.enabled=true ribbon.eager-load.clients=cloud-shop-userservice
參數(shù)說明:
ribbon.eager-load.enabled:開啟Ribbon的饑餓加載模式ribbon.eager-load.clients:指定需要饑餓加載的服務(wù)名
SpringCloud之Ribbon的饑餓加載(解決首次調(diào)用超時(shí)的問題)
Ribbon的饑餓加載(eager-load)模式
我們?cè)谑褂肧pring Cloud的Ribbon或Feign來實(shí)現(xiàn)服務(wù)調(diào)用的時(shí)候,如果我們的機(jī)器或網(wǎng)絡(luò)環(huán)境等原因不是很好的話,有時(shí)候會(huì)發(fā)現(xiàn)這樣一個(gè)問題:我們服務(wù)消費(fèi)方調(diào)用服務(wù)提供方接口的時(shí)候,第一次請(qǐng)求經(jīng)常會(huì)超時(shí),而之后的調(diào)用就沒有問題了。
下面我們就來說說造成這個(gè)問題的原因,以及如何解決的方法。
問題原因
造成第一次服務(wù)調(diào)用出現(xiàn)失敗的原因主要是Ribbon進(jìn)行客戶端負(fù)載均衡的Client并不是在服務(wù)啟動(dòng)的時(shí)候就初始化好的,而是在調(diào)用的時(shí)候才會(huì)去創(chuàng)建相應(yīng)的Client,所以第一次調(diào)用的耗時(shí)不僅僅包含發(fā)送HTTP請(qǐng)求的時(shí)間,還包含了創(chuàng)建RibbonClient的時(shí)間,這樣一來如果創(chuàng)建時(shí)間速度較慢,同時(shí)設(shè)置的超時(shí)時(shí)間又比較短的話,很容易就會(huì)出現(xiàn)上面所描述的顯現(xiàn)。
從日志中我們也能知道這一點(diǎn)細(xì)節(jié),在第一次發(fā)起調(diào)用的時(shí)候我們可以從日志中看到如下信息:
2017-09-25 08:29:54,201 INFO [main] com.netflix.loadbalancer.DynamicServerListLoadBalancer - DynamicServerListLoadBalancer for client hello-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=hello-service,current list of Servers=[192.168.99.176:9901],Load balancer stats=Zone stats: {unknown=[Zone:unknown; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
},Server stats: [[Server:192.168.99.176:9901; Zone:UNKNOWN; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:ConsulServerList{serviceId='hello-service', tag=null}
而Feign的實(shí)現(xiàn)基于Ribbon,所以它也有一樣的問題,下面就來看看如何解決這個(gè)問題。
解決方法
解決的方法很簡(jiǎn)單,既然第一次調(diào)用時(shí)候產(chǎn)生RibbonClient耗時(shí),那么就讓它提前創(chuàng)建,而不是在第一次調(diào)用的時(shí)候創(chuàng)建。
在Spring Cloud的Dlaston版本中提供了幾個(gè)新的參數(shù),它們可以很方便的幫我們實(shí)現(xiàn)這樣的功能。
ribbon: ?? ?eager-load: ? ? ?? ?enabled:true ?? ?clients:kong-auth,kong-uc-service
參數(shù)說明:
ribbon.eager-load.enabled:開啟Ribbon的饑餓加載模式ribbon.eager-load.clients:指定需要饑餓加載的客戶端名稱、服務(wù)名
通過上面的配置完成之后,我們嘗試重啟一下服務(wù)消費(fèi)者,這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn),我們沒有開始調(diào)用服務(wù)接口,但是上面初始化負(fù)載均衡的日志就已經(jīng)打印出來了。
這就說明我們對(duì)ribbon的饑餓加載模塊設(shè)置已經(jīng)生效了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
通過簡(jiǎn)易例子講解Java回調(diào)機(jī)制
這篇文章主要介紹了通過簡(jiǎn)易例子講解Java回調(diào)機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
MyBatis圖文并茂講解注解開發(fā)多對(duì)多查詢
這篇文章主要介紹了SpringBoot中Mybatis注解多對(duì)多查詢的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
詳解Eclipse提交項(xiàng)目到GitHub以及解決代碼沖突
這篇文章主要介紹了詳解Eclipse提交項(xiàng)目到GitHub以及解決代碼沖突,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
Java使用JMeter進(jìn)行高并發(fā)測(cè)試
軟件的壓力測(cè)試是一種保證軟件質(zhì)量的行為,本文主要介紹了Java使用JMeter進(jìn)行高并發(fā)測(cè)試,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java如何實(shí)現(xiàn)URL帶請(qǐng)求參數(shù)(get/post)及得到get和post請(qǐng)求url和參數(shù)列表的方法
本文給大家介紹Java如何實(shí)現(xiàn)URL帶請(qǐng)求參數(shù)(get/post)及得到get和post請(qǐng)求url和參數(shù)列表的方法,涉及到 java獲取post請(qǐng)求參數(shù)的方法,感興趣的朋友一起看看吧2015-10-10
Spring Data JPA 簡(jiǎn)單查詢--方法定義規(guī)則(詳解)
下面小編就為大家?guī)硪黄猄pring Data JPA 簡(jiǎn)單查詢--方法定義規(guī)則(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
SpringBoot整合ShardingSphere5.x實(shí)現(xiàn)數(shù)據(jù)加解密功能(最新推薦)
這篇文章主要介紹了SpringBoot整合ShardingSphere5.x實(shí)現(xiàn)數(shù)據(jù)加解密功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06

