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的配置

需要注意的是connectTimeoutreadTimeout必须同时配置,要不然不会生效,这种方式可以全局配置,至于为什么请看后面。

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;
}

为什么connectTimeoutreadTimeout必须同时配置?

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()));
        }