feign首次調(diào)用時初始化操作導(dǎo)致的超時問題及處理
feign等待的時間默認情況下為1秒.如果1秒之內(nèi)沒有返回,那么此時會進行重試(默認情況下會重試一次)重試失敗后 會進行降級邏輯處理,如果沒有提供降級邏輯就會報錯
問題1
feign在進行第一次遠程調(diào)用時需要做很多的初始化操作(ribbon進行初始化),就會導(dǎo)致第一次遠程調(diào)用的時消耗的時間較長,有的時候可能會出現(xiàn)超時,在我們業(yè)務(wù)系統(tǒng)中應(yīng)該盡量避免觸發(fā)超時!
解決方案1
對ribbon的初始化操作提前完成,不要在第一次調(diào)用的時候才進行初始化
#開啟ribbon的饑餓加載
ribbon:
eager-load:
enabled: true
clients: service-xxx服務(wù)模塊,可寫多個模塊解決方案2
延長feign的超時時間
弊端:產(chǎn)生雪崩效應(yīng)的概率增大了
注意:顯示指定后如果還觸發(fā)超時,那么feign是不會進行重試
- feign的超時配置方式 1(顯式的指定超時時間):
feign:
#feign集成sentinel服務(wù)保護(斷路器,防止雪崩)
sentinel:
enabled: true
client:
config:
#feign延長超時時間
default: #表示應(yīng)用到所有服務(wù)提供方(也可以指定服務(wù)名稱)
connectTimeout: 4000
readTimeout: 4000feign的超時配置方式 2(精準設(shè)置接口超時配置):弊端:有時候需要每個接口都配置
2.1為feign接口添加Request.Options options參數(shù)
@GetMapping(value="/api/xx") public abstract Resulttest(Request.Optionsoptions) ;
2.2遠程調(diào)用時候傳遞Request.Options參數(shù),直接new出來就行
Request.Optionsoptions=newRequest.Options(3, TimeUnit.MILLISECONDS, 3, TimeUnit.MILLISECONDS, true); //參數(shù)說明: connectTimeout:連接超時時間\時間單位 readTimeout :讀取數(shù)據(jù)超時時間\時間單位 followRedirects :是否允許重定向
伴隨問題:如果顯示指定后如果還觸發(fā)超時,那么feign是不會進行重試但是對于特殊業(yè)務(wù)場景需要進行重試時
解決方案:自定義重試器
重試原理:執(zhí)行業(yè)務(wù)方法的時候報錯了,那么此時就需要調(diào)用重試器中的continueOrPropagate方法。如果該方法產(chǎn)生了異常,那么重試結(jié)束;如果
該方法沒有產(chǎn)生異常那么則進行重試。
如果我們想在自定義超時時間的同時使用重試機制,那么此時就需要自定義重試器。
- 步鄹1:自定義一個類實現(xiàn)Retryer重寫方法
public class MyRetryer implements Retryer {
private intstart=1 ;
private intend=3 ; //規(guī)定重試次數(shù)
?
?
/**
* 遠程調(diào)用失敗以后,會調(diào)用重試器的這個方法
*/
@Override//判斷是否需要重試
public void continueOrPropagate(RetryableExceptione) {
if(start>end) {
throwe ;
}
start++ ;
System.out.println("MyRetryer...continueOrPropagate....");
}
?
@Override//返回對象
public Retryer clone() {
return new MyRetryer();
}
}步鄹2:將自定義的重試器配置給feign
feign:
#feign集成sentinel服務(wù)保護(斷路器,防止雪崩)
sentinel:
enabled: true
client:
config:
#feign延長超時時間
default: #表示應(yīng)用到所有服務(wù)提供方(也可以指定服務(wù)名稱)
# connectTimeout: 4000
# readTimeout: 4000
retryer: com.aa.bb.MyRetryer #配置重試器,全類名可以將配置抽取到nacos中心,哪里需要哪里添加
#feign集成sentinel服務(wù)保護(斷路器,防止雪崩)
feign:
sentinel:
enabled: true
client:
config:
#feign延長超時時間
default:
connectTimeout: 1500
readTimeout: 1500
retryer: com.xx.feign.retry.FeignClientRetryer
#配置ribbon的饑餓加載
ribbon:
eager-load:
enabled: true
clients: 微服務(wù),微服務(wù)2,微服務(wù)3總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java虛擬機內(nèi)存結(jié)構(gòu)及編碼實戰(zhàn)分享
這篇文章主要介紹了Java虛擬機內(nèi)存結(jié)構(gòu)及編碼實戰(zhàn)分享,文章圍繞詳細主題展開相關(guān)資料具有一定的參考價值,需要的小伙伴可以參考一下2022-04-04
淺談DetachedCriteria和Criteria的使用方法(必看)
下面小編就為大家?guī)硪黄獪\談DetachedCriteria和Criteria的使用方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

