在 Spring Cloud 中, Feign 和 Ribbon 在整合了 Hystrix 后, 可能会出现首次调用失败的问题
- com.netflix.hystrix.exception.HystrixTimeoutException: null
- at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.run(AbstractCommand.java:1142) ~[hystrix-core-1.5.18.jar:1.5.18]
- at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41) ~[hystrix-core-1.5.18.jar:1.5.18]
- at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:37) ~[hystrix-core-1.5.18.jar:1.5.18]
- at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57) ~[hystrix-core-1.5.18.jar:1.5.18]
- at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$2.tick(AbstractCommand.java:1159) [hystrix-core-1.5.18.jar:1.5.18]
- at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:99) [hystrix-core-1.5.18.jar:1.5.18]
- at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_131]
- at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_131]
- at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_131]
- at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_131]
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
- at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
产生的原因:
Hystrix 默认的超时时间是 1 秒, 如果超过这个时间尚未响应, 将会进入 fallback
第一次请求往往会比较慢, 响应时间可能会大于 1 秒
解决的方法有 3 种:
(1)Hystrix 的超时时间设置为 5 秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
(2) 禁用 Hystrix 的超时时间
hystrix.command.default.execution.timeout.enabled
(3) 禁用 feign 的 hystrix
feign.hystrix.enabled=false
来源: http://www.bubuko.com/infodetail-3323094.html