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

