使用fegin客户端远程调用,开启了hystrix熔断器。
feign:
hystrix:
enabled: true
由于服务提供者需要调第三方接口,耗时大概在几百毫秒才能执行完。
但发现服务消费者总是报超时(啪的一下,很快啊),记录了下远程调用的时间,几乎是1秒的时间就返回超时错误了。
解决方案
使用FallbackFactory
查看报错信息,报的错是com.netflix.hystrix.exception.HystrixTimeoutException
,Timeout自然是超时,既然是hystrix的错,设置6秒试试:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
这个属性在idea中没有提示,需要去官方文档看:Hystrix文档。
试了下确实是不再报错了,但为了保险起见,在服务提供者打个断点,让他超时6秒看看fallback是否正常工作,发现2秒的时候报了另一个连接超时的错feign.RetryableException
,查了一番才知道还需要设置ribbon的超时时间:
ribbon:
ReadTimeout: 6000
ConnectTimeout: 6000
设置完后就能正常工作,6秒后也能触发fallback。
总结
hystrix的默认超时时间是1秒,而ribbon的默认超时时间是2秒。
一个远程调用的请求过程是:
fegin -> hystrix -> ribbon -> httpClient
所以两个需要同时设置才能生效,不然会以最小的超时时间作为限制。
整体的yml配置:
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
ribbon:
ReadTimeout: 6000
ConnectTimeout: 6000
本文由 visionki 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 17, 2021 at 07:45 am