公司使用Spring Cloud微服务架构中,都是利用Feign进行服务间的调用,因为最近业务更改,服务繁杂响应时间边长,需要优化超时时间的配置。

1.Feign配置

# 默认开启
feign.httpclient.enabled=false
# 默认关闭
feign.okhttp.enabled=true
# 默认关闭
feign.hystrix.enabled=false
# 默认关闭
feign.sentinel.enabled=true

# default context 连接超时时间
feign.client.config.default.connectTimeout = 5000
# default context 读超时时间
feign.client.config.default.readTimeout = 10000

2.Hystrix配置

# 全局设置超时:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 30000

3.Ribbon配置

# 连接超时时间,默认为1秒,该值会被FeignClient配置connectTimeout覆盖
ribbon.ConnectTimeout=5000
# 读超时时间,默认为1秒,该值会被FeignClient配置readTimeout覆盖
ribbon.ReadTimeout=5000
# 最大重试次数
ribbon.MaxAutoRetries=1

4.OkHttp的配置

由于Feign所设置的连接时间和超时时间最后会将OkHttpClient中的配置给覆盖掉。直接配置OkHttpClient是无效的解决方案如下:添加一个拦截器即可

@Bean("HttpClient")
public OkHttpClient okHttpClient(ConnectionPool connectionPool) {
	return new OkHttpClient().newBuilder().connectionPool(connectionPool)
             // 该值在FeignClient体系中会被动态覆盖
			.connectTimeout(6, TimeUnit.SECONDS)
             // 该值在FeignClient体系中会被动态覆盖
			.readTimeout(VmcConstants.TEN_SECONDS, TimeUnit.SECONDS)
             // 添加拦截器,支持动态设置超时时间
			.addInterceptor(new OkHttpClientDynamicTimeoutInterceptor())
            .eventListener(eventListener())
			.build();
}

注:关于配置Hystrix和Ribbon的超时时间配置

Feign的请求方式是先Hystrix然后Ribbon,Hystrix在最外层则熔断时间必须大于Ribbon的(ConnectTimeout + ReadTimeout)。而且如果Ribbon开启了重试机制,还需要计算对应的重试次数,保证在Ribbon的超时时间*重试次数这个时间范围内,Hystrix的熔断时间不会超时。

Feign的请求流程大致如下:

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐