3-3Feign 超时配置 · SpringCloud微服务实战 · 看云
3. Feign 的超时配置
导航
本节代码地址
服务的请求见,肯定需要设置服务请求之间的超时时间,不可能一直在哪里等待,那feign 的超时时间如何配置?
| 类型 | 备注 | 默认值 |
|---|---|---|
| connectTimeout | 连接超时时间 | 默认 2000毫秒 |
| readTimeout | 读取超时时间 | 默认 5000毫秒 |
代码路径com.netflix.client.config.DefaultClientConfigImpl
3.1 方式一
添加代码配置,但是这个不能注册到全局,需要在FeignClient上指定
@Bean
public Request.Options options(){
return new Request.Options(5000,1000);
}
3.1 方式二
添加application.yml的配置
需要注意的是
connectTimeout和readTimeout必须同时配置,要不然不会生效,这种方式可以全局配置,至于为什么请看后面。
feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 10000
service-name:
connectTimeout: 10000
readTimeout: 10000
或者
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
service-name:
ribbon:
ReadTimeout: 30000
ConnectTimeout: 30000
以上配置default是全局的配置,service-name是配置具体服务的
3.3 配置生效的原因
当然有人会说,我直接配置Ribbon 不也是可以的吗?毕竟Feign 集成了Ribbon,但是在Feign 的实现中,Feign的配置如果不是默认的是优先Ribbon 生效的。
public class LoadBalancerFeignClient implements Client {
IClientConfig getClientConfig(Options options, String clientName) {
Object requestConfig;
if (options == DEFAULT_OPTIONS) {
requestConfig = this.clientFactory.getClientConfig(clientName);
} else {
requestConfig = new LoadBalancerFeignClient.FeignOptionsClientConfig(options);
}
return (IClientConfig)requestConfig;
}
为什么connectTimeout和readTimeout必须同时配置?
class FeignClientFactoryBean implements FactoryBean<Object>, InitializingBean,
ApplicationContextAware {
protected void configureUsingProperties(FeignClientProperties.FeignClientConfiguration config, Feign.Builder builder) {
if (config == null) {
return;
}
if (config.getLoggerLevel() != null) {
builder.logLevel(config.getLoggerLevel());
}
if (config.getConnectTimeout() != null && config.getReadTimeout() != null) {
builder.options(new Request.Options(config.getConnectTimeout(), config.getReadTimeout()));
}