造成该问题的原因
Hystrix 默认的超时时间是 1 秒, 如果超过这个时间尚未响应, 将会进入 fallback 代码. 而首次请求往往会比较慢 (由于 Ribbon 是懒加载的, 在首次请求时, 才会开始初始化相关类), 这个响应时间可能就大于 1 秒了. 知道原因后, 我们来总结一下解决方案. 以 feign 为例, 解决方案有如下四种.
方法一, 将 Hystrix 超时设长
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
该配置是让 Hystrix 的超时时间改为 5 秒, 这是最容易想到的办法, 不过有点治标不治本.
方法二, 禁用 Hystrix 超时
hystrix.command.default.execution.timeout.enabled: false
该配置, 用于禁用 Hystrix 的超时时间, 一般不建议使用.
方法三, 为 Feign 禁用 Hystrix
全局禁用
feign.hystrix.enabled: false
索性禁用 feign 的 hystrix, 该做法比较极端, 除非一些特殊场景, 不推荐使用.
局部禁用
为名为 microservice-provider-user 的 Feign Client 禁用 Hystrix
- @FeignClient(name = "microservice-provider-user")
- public interface UserFeignClient {
- @GetMapping("/users/{id}")
- User findById(@PathVariable("id") Long id);
- }
- class FooConfiguration {
- @Bean
- @Scope("prototype")
- public Feign.Builder feignBuilder(){
- return Feign.builder();
- }
- }
方法四, Ribbon 配置饥饿加载 (最佳)
从 Dalston 开始, Ribbon 支持配置 eager load 实现在启动时就初始化 Ribbon 相关类.
来源: http://www.bubuko.com/infodetail-3456715.html