Feign超时不生效问题

使用Feign作为RPC调用组件,可以配置连接超时和读取超时两个参数


使用Feign配置超时需要注意:Feign内部使用了负载均衡组件Ribbon,
而Ribbon本身也有连接超时和读取超时相关配置
一、默认不配置相关参数的情况下:


通过测试发现超时读取使用了Ribbon的默认超时时间,即1s。此时Feign的默认超时时间
60s不会生效。

源码分析:Ribbon的默认超时时间 1s。 Feign的默认读取超时时间60s

 


二、 配置相关参数的情况下:


Fegin可以配置全局超时时间:
feign.client.config.default.readTimeout=3000
feign.client.config.default.connectTimeout=3000
注意:如果只配置读超时,只feign.client.config.default.readTimeout=3000 是不会生效的
要配置Feign读取超时,必须同时配置连接超时

若是想针对单独的Feign Client(client-name)设置超时时间,可以把default替换为Client的name
例如:
feign.client.config.client-name.readTimeout=3000
feign.client.config.client-name.connectTimeout=3000
单独的超时可覆盖全局超时

同时配置Feign和Ribbon的参数

feign.client.config.default.readTimeout=3000
feign.client.config.default.connectTimeout=3000
ribbon.ReadTimeout=4000
ribbon.ConnectTimeout=4000
最终生效的是Feign的超时

源码分析:同时配置Feign和Ribbon的超时,以Feign为准
在LoadBalancerFeignClient源码
如果Request.Options不是默认值,就会创建一个FeignOptionsClientConfig代替原来Ribbon的DefaultClientConfigImpl,导致Ribbon的配置被Feign覆盖

原文地址:https://www.cnblogs.com/wa1l-E/p/13994240.html