4.feign超時時間設置策略

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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章