對於feign的介面請求失敗的重試配置可通過如下自定義配置檔案實現(一般不建議配置)
@configuration
public
class
feignconfig
}
當然,也可使用預設的retry配置檔案,下方是feign.retryer的原始碼
// 類的全路徑是feign.retryer
public
default()
public
default
(long period,
long maxperiod,
int maxattempts)
public
void
continueorpropagate
(retryableexception e)
long interval;
if(e.
retryafter()
!= null)
if(interval <0)
}else
trycatch
(interruptedexception ignored)
// sleptformillis變數是總的重試間隔
sleptformillis += interval;
}/**
* 下一次重試的間隔,間隔時間每一次重試都是1.5倍遞增,直到最大間隔
**/long
nextmaxinterval()
spring cloud中的feign整合了ribbon,但feign和ribbon都有重試功能,springcloud統一了兩者的行為,將feign的重試策略設定成永不重試,如果要使用feign的重試功能,只需要設定ribbon的重試配置即可,所以一般不建議配置feign的重試策略
ribbon預設配置如下
ribbon:
# 同一例項最大重試次數,不包括首次呼叫。預設值為0
maxautoretries: 0
# 同乙個微服務其他例項的最大重試次數,不包括第一次呼叫的例項。預設值為1
maxautoretriesnextserver: 1
# 是否所有操作(get、post等)都允許重試。預設值為false
oktoretryonalloperations: false
預設情況下,get方式請求無論是連線異常還是讀取異常,都會進行重試
非get方式請求,只有連線異常時,才會進行重試
如此看來,如果同乙個微服務只有乙個例項是不會進行重試的,但事實並非如此分析一下原始碼,feign的重試是在org.springframework.retry.support.retrytemplate中的doexecute方法中進行中
protected
throwable
> t doexecute
(retrycallback
retrycallback,recoverycallback
recoverycallback, retrystate state)
throws e, exhaustedretryexception
// reset the last exception, so if we are successful
// the close interceptors will not think we failed...
lastexception = null;
return retrycallback.
dowithretry
(context);}
......}
上方的canretry是關鍵
最後一行policy.canretrynextserver是能否選擇下乙個例項進行重試
而lbcontext.getretryhandler().getmaxretriesonnextserver()就是變數retrynextserver
retrynextserver的值就是**於maxautoretriesnextserver,預設是1,所以canretry在返回的是true,所以呼叫了二次
解決辦法就是要進行如下配置
ribbon:
# 同一例項最大重試次數,不包括首次呼叫。預設值為0
maxautoretries: 0
# 同乙個微服務其他例項的最大重試次數,不包括第一次呼叫的例項。預設值為1
maxautoretriesnextserver: 0
# 是否所有操作(get、post等)都允許重試。預設值為false
oktoretryonalloperations: false
feignribbonclient的自動配置類
可以看出,其預設使用loadbalancerfeignclient的配置
檢視其default_options可知道預設連線超時時間是10s,讀取超時是6s
預設的網路請求框架是httpurlconnection
如要更換相應的網路請求框架,只需要新增相應的pom依賴即可
檢視負載均衡怎麼做的,檢視executewithloadbalancer
檢視其submit任務
其方法selectserver就是負載均衡的關鍵
feign的流程如下
通過@enablefeignclients開啟feign
根據要遠端呼叫的介面新增@feignclient
程式掃瞄特定包下的feignclient註解並注入ioc容器
當feign介面被呼叫時,通過jdk**生成相應的requesttemplate
根據requesttemplate生成相應的request
request交給類client去呼叫,client可以是httpclient,okhttp或httpurlconnection
最後client被封裝到loadbalanceclient,這個類結合ribbon實現負載均衡
Feign學習筆記2 原始碼解讀
spring cloud netflix feign,這個是feign的全名。spring官網上是沒有feign這個專案存在的,feign是作為netflix的乙個子專案存在。netflix包涵eureka zuul ribbon feign hystrix hystrix dashboard tu...
Feign原始碼解析
首先我要說的是springcloud沒有rpc,這就涉及rpc和微服務的區別。springcloud的模組通訊工具feign跟httpclient和okhttp是一樣的東西,都是對http請求封裝的工具,其實feign可以選擇httpclient或者okhttp作為底層實現 修改配置即可 一 fei...
Feign原始碼分析
feign主要圍繞註解 feignclient和 autowired來分析就好了,feignclient是註解在乙個介面上面的,這個註解是乙個標誌,相應的後置處理器把有該標誌的類加入到bean defenition中。autowired是注入屬性的,feign採用的是factorybean的方式進行...