1. 簡介
feign封裝了ribbon,支持ribbon的超時配置。
2. 配置方法
# 全局ribbion超時配置
ribbon:
ConnectTimeout: 500
ReadTimeout: 500
# service-a服務ribbion超時配置,優先於全局ribbon超時配置
service-a:
ribbon:
ConnectTimeout: 500
ReadTimeout: 2000
3. 源碼分析
LoadBalancerFeignClient.execute()方法內的getClientConfig()方法用於獲取配置requestConfig,其中包含真正的超時配置
public class LoadBalancerFeignClient implements Client {
public Response execute(Request request, Request.Options options) throws IOException {
//......
IClientConfig requestConfig = getClientConfig(options, clientName);
//......
}
IClientConfig getClientConfig(Request.Options options, String clientName) {
IClientConfig requestConfig;
if (options == DEFAULT_OPTIONS) {
requestConfig = this.clientFactory.getClientConfig(clientName);
} else {
//如果指定了超時時間,則替換超時時間
requestConfig = new FeignOptionsClientConfig(options);
}
return requestConfig;
}
static class FeignOptionsClientConfig extends DefaultClientConfigImpl {
//......
public FeignOptionsClientConfig(Request.Options options) {
setProperty(CommonClientConfigKey.ConnectTimeout,
options.connectTimeoutMillis());
setProperty(CommonClientConfigKey.ReadTimeout, options.readTimeoutMillis());
}
//......
}
}
真實的請求超時時間,可以攔截LoadBalancerCommand.submit的形參operation.requestConfig中獲取ConnectTimeout和ReadTimeout。
public class LoadBalancerCommand<T> {
//......
public Observable<T> submit(final ServerOperation<T> operation) {
//......
}
}
9. 坑
9.1 Request.Options
- 如果在程序自定義了Request.Options對象,則配置文件設置的超時配置都無效。
- feign中默認的超時時間來自於DefaultClientConfigImpl。
- 配置Request.Options示例:
//嚴重不建議通過如下方法,全局配置超時時間。
@Bean
public Request.Options options() {
return new Request.Options(1000, 10000);
}