原文地址:Feign調用首次失敗問題 || 關於feign第一次訪問接口失敗問題
springcloud中Feign調用常見問題
一、Feign調用首次失敗問題
1、Feign簡介:
Feign是一個聲明式的僞Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要創建一個接口並註解。它具有可插拔的註解特性,可使用Feign 註解和JAX-RS註解,Feign 整合了Ribbon。
2、原因分析:
Feign整合Hystrix組件後,Hystrix默認的超時時間是1秒,如果超過這個時間尚未響應,將會進入自定義的fallback代碼,往往首次請求會比較慢(由於Ribbon是懶加載的,在首次請求時,纔會開始初始化相關類),這個響應時間可能就大於1秒了,出現調用失敗
3、解決方案
(1)增加Hystrix的超時時間,默認爲1s
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
(2)配置餓加載(推薦使用)
ribbon:
eager-load:
clients: project1,project2
enabled: true
(3)禁用Hystrix超時(不推薦使用)
hystrix:
command:
default:
execution:
timeout:
enabled: false
(4)爲fegin全局禁用hystrix(此種方式較爲極端,不建議使用)
feign:
hystrix:
enabled: false
二、Feign整合Hystrix之後日誌顯示問題
1、解決方案
Feign整合Hystrix之後,當調用失敗會走fallback邏輯,造成日誌不顯示,往往我們需要看日誌分析原因,進行故障排查。
(1)在application中配置,開區Feign對Hystrix的支持
feign:
hystrix:
enabled: true
(2)編寫Feigin的客戶端以及回滾類
在客戶端FeignClient註解配置相對應的回滾類,fallbackFactory = LogFallbackFactory.class,name屬性爲註冊中心其他服務的名稱
/**
* @description:fegin調用客戶端
*
* @author: LUOYUAN
* @date: 2019-08-07-10:33
* @function:
*/
@FeignClient(name = "eureka-log",path = "/api/log",fallbackFactory = LogFallbackFactory.class)
public interface LogFeignClient {
@RequestMapping(value = "list", method = RequestMethod.GET)
public String logList();
}
/**
* @description:feign調用失敗邏輯
* @author: LUOYUAN
* @date: 2019-08-07-10:34
* @function:
*/
@Slf4j
public class LogFallbackFactory implements FallbackFactory<LogFeignClient> {
@Override
public LogFeignClient create(Throwable throwable) {
return new LogFeignClient() {
@Override
public String logList() {
log.info("query log fallback reason was:",throwable);
return null;
}
};
}
}
調用失敗會打印異常信息
query log fallback reason was:
feign.RetryableException: Connection refused: connect executing GET http://eureka-log/api/log/list
at feign.FeignException.errorExecuting(FeignException.java:132)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)
at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
三、Feign調用時定義的fallback不生效
Springcloud Dalston之前得到版本,Feign默認已經開啓了Hystrix熔斷器,從Dalaton版本開始,默認關閉Hystrix支持,需手動開啓,在application.yaml中添加如下配置
feign:
hystrix:
enabled: true