4.feign超时时间设置策略

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

转载于:https://my.oschina.net/andChow/blog/1608698

你可能感兴趣的:(python)