2019独角兽企业重金招聘Python工程师标准>>>
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 {
//......
public Observable submit(final ServerOperation operation) {
//......
}
}
9. 坑
9.1 Request.Options
- 如果在程序自定义了Request.Options对象,则配置文件设置的超时配置都无效。
- feign中默认的超时时间来自于DefaultClientConfigImpl。
- 配置Request.Options示例:
//严重不建议通过如下方法,全局配置超时时间。
@Bean
public Request.Options options() {
return new Request.Options(1000, 10000);
}