Feign Client 超时时间配置不生效的解决
这篇文章主要介绍了Feign Client 超时时间配置不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
目录
Feign Client 超时时间配置不生效
解决方案
问题描述
Feign Client的各种超时时间设置
1. Feign Client Configuration
2. Hystrix Configuration
3. Ribbon Configuration
4. OkHttp Client Configuration
5. 小结一下吧
Feign Client 超时时间配置不生效
解决方案
Feign Client 的 connectTimeout 和 readTimeout 需要同时配置:
1 2 | feign.client.config.my-api.connectTimeout = 10000 feign.client.config.my-api.readTimeout = 600000 |
如果只配置了 readTimeout 或 connectTimeout 的其中一条,配置不生效。
问题描述
Feign Client 配置如下:
1 2 3 | feign.client.config. default .connectTimeout = 3000 feign.client.config. default .readTimeout = 3000 feign.client.config.my-api.readTimeout = 600000 |
默认超时时间配置了 3 秒。
由于 my-api 的响应数据较大,于是配置了 10 分钟超时时间。
执行后发现,my-api 请求仍然 3 秒后就抛出如下异常:
1 2 3 4 5 6 7 8 | Caused by: feign.RetryableException: Read timed out executing POST http: //my-api at feign.FeignException.errorExecuting(FeignException.java: 67 ) at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java: 104 ) at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java: 76 ) at feign.hystrix.HystrixInvocationHandler$ 1 .run(HystrixInvocationHandler.java: 108 ) at com.netflix.hystrix.HystrixCommand$ 2 .call(HystrixCommand.java: 302 ) at com.netflix.hystrix.HystrixCommand$ 2 .call(HystrixCommand.java: 298 ) at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java: 46 ) |
Feign Client的各种超时时间设置
在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常,因此定制化配置超时时间就有必要了。
1. Feign Client Configuration
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 默认开启 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 # 设置重试处理器,默认直接抛出异常 # feign.client.config. default .retryer = Class<Retryer> # 设置日志级别,默认NONE # feign.client.config. default .loggerLevel = FULL |
2. Hystrix Configuration
1 2 | # 全局设置超时: hystrix.command. default .execution.isolation.thread.timeoutInMilliseconds: 30000 |
hystrix在ribbon的外层处理。
3. Ribbon Configuration
1 2 3 4 5 6 | # 连接超时时间,默认为 1 秒,该值会被FeignClient配置connectTimeout覆盖 ribbon.ConnectTimeout= 5000 # 读超时时间,默认为 1 秒,该值会被FeignClient配置readTimeout覆盖 ribbon.ReadTimeout= 5000 # 最大重试次数 ribbon.MaxAutoRetries= 1 |
当Ribbon调用接口发送连接异常或者超时异常时会触发Ribbon 的重试机制。
4. OkHttp Client Configuration
所设置的连接时间和超时时间最后会动态设置到OkHttpClient中,最底层也就是Socket的连接时间和读超时时间。也就是说,直接配置OkHttpClient是无效的。
解决方案:添加OkHttp Client的请求Interceptor,动态设置超时时间。
1 2 3 4 5 6 7 8 9 10 11 12 | @Bean ( "okHttpClient" ) 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(); } |
5. 小结一下吧
1.如何配置好Hystrix和Ribbon的超时时间呢?
其实是有套路的,因为Feign的请求:其实是Hystrix+Ribbon。Hystrix在最外层,然后再到Ribbon,最后里面的是http请求。所以说。Hystrix的熔断时间必须大于Ribbon的 ( ConnectTimeout + ReadTimeout )。而如果Ribbon开启了重试机制,还需要乘以对应的重试次数,保证在Ribbon里的请求还没结束时,Hystrix的熔断时间不会超时。
以上为个人经验,希望能给大家一个参考
原文链接:https://blog.csdn.net/wu_weijie/article/details/112731675