一. 背景
在微服務項目中,我的服務消費使用的是Feign
客戶端,在調用服務提供者提供的接口時,報超時異常了,異常如下:
com.netflix.hystrix.exception.HystrixRuntimeException: RemoteCardImgHandleFeign#getVehicleLicenseInfos(CardInfosVi) timed-out and fallback failed.
二. Feign設置超時時間
1.使用Feign
調用接口分兩層,ribbon
的調用和hystrix
的調用,所以ribbon
的超時時間和Hystrix
的超時時間的結合就是Feign
的超時時間
2. 一般情況下 都是 ribbon
的超時時間(<)hystrix
的超時時間(因爲涉及到ribbon
的重試機制),如果ribbon
的超時時間大於hystrix
的超時時間,對於ribbon
的重試是沒有意義的(hystrix
超時熔斷了,ribbon
無法重試)
三. 原因
Hystrix
組件缺省超時判斷默認爲1
秒鐘,超過1
秒就會報超時異常日誌,由於我的服務器是在Linux
環境,網絡延遲非常大,雖然已經把超時設置成了5
秒,但是還是短了,可以將超時再設置長一點。
四. 解決方式
將
hystrix
的默認超時1
秒直接改成10
秒,由於我的測試環境網絡延遲很慢,5秒還是不夠,直接設置成10秒
- application.yml
##feign中使用斷路器Hystrix,默認是沒有開啓的,需要開啓
feign:
hystrix:
enabled: true
#hystrix的超時時間
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
#設置請求超時時間,默認1秒,超過指定的時間後,觸發服務熔斷
timeoutInMilliseconds: 10000
#ribbon的超時時間
ribbon:
ReadTimeout: 5000 #設置請求處理的超時時間
ConnectTimeout: 5000 #設置請求鏈接的超時時間
五. 另外兩種解決方式(未測試過,僅供參考)
下面兩種方式是比較暴力的一種解決方式,但在實際項目中並不推薦,對服務高可用存在一定的影響,兩種我沒有測試,還是推薦使用上面第一種
- 第一種: 禁用Hystrix的請求時間超時限制
#hystrix的超時時間
hystrix:
command:
default:
execution:
timeout:
enabled: false
- 第二種: 禁用
feign
的hystrix
feign:
hystrix:
enabled: false