Demo項目采用Spring Cloud 微服務架構,各個SpringBoot項目通過Fegin進行相互調用,但是在使用過程中發現,第一次通過Feign調用其它服務時,總會走到熔斷器進行熔斷。定位發現Hystrix 熔斷器的請求默認超時時間是1s。而第一次調用時會進行初始化ribbon相關組件,超過了1s,導致等待結果超時,就熔斷了。
找了很多博客,很多給出的答案都是加大超時時間,比如給5s或者更長,我覺得這個是不正確的。雖然解決了這個問題,但是會有隱患:當這個接口并發大的時候,如果超時時間比較長,則會很快消耗完連接池的連。
更優雅的解決方式:
1. 開啟ribbon 的饑餓初始化,即服務啟動時就初始化ribbon和feign相關組件
ribbon:
eager-load:
enabled: true #開啟饑餓加載 解決第一次feign調用失敗的問題
clients: commodity-center #需要饑餓加載的服務名稱
2. 開啟DispatchServlet默認初始化
spring:
mvc:
servlet:
load-on-startup: 0 # 啟動時立即初始化 dispatcherServlet,數值表示延遲多久進行自動初始化dispatcherServlet,0是立即初始化
配置后項目啟動日志:
日志截圖
然后再進行第一次Feign請求,問題已解決。