本文轉載於:http://www.itmuch.com/spring-cloud-feign-ribbon-first-request-fail/ 謝謝作者的分享
Spring Cloud中,Feign和Ribbon在整合了Hystrix後,可能會出現首次調用失敗的問題,要如何解決該問題呢?
本文於基於Spring Cloud Finchley。
造成該問題的原因
Hystrix默認的超時時間是1秒,如果超過這個時間尚未響應,將會進入fallback代碼。而首次請求往往會比較慢(由於Ribbon是懶加載的,在首次請求時,纔會開始初始化相關類),這個響應時間可能就大於1秒了。知道原因後,我們來總結一下解決方案。以feign爲例,解決方案有如下四種。
方法一、將Hystrix超時設長
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:5000
### Hystrix 配置
hystrix:
command:
default:
execution:
isolation:
thread:
# 熔斷器超時時間,默認:1000/毫秒
timeoutInMilliseconds: 5000
該配置是讓Hystrix的超時時間改爲5秒,這是最容易想到的辦法,不過有點治標不治本。
方法二、禁用Hystrix超時
hystrix.command.default.execution.timeout.enabled:false
hystrix:
command:
default:
execution:
timeout:
# 禁用熔斷器超時時間,不推薦
enabled: false
該配置,用於禁用Hystrix的超時時間,一般不建議使用。
方法三、爲Feign禁用Hystrix
全局禁用
feign.hystrix.enabled:false
### Feign 配置
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相關類。
ribbon:
eager-load:
enabled: true
clients: client1, client2, client3
Dalson之前版本可以通過一些Hack的機制實現eager load,不過成本略高,不建議,這裏就不貼了。