Spring Cloud中蕉饼,F(xiàn)eign和Ribbon在整合了Hystrix后,可能會(huì)出現(xiàn)首次調(diào)用失敗的問題玛歌,要如何解決該問題呢昧港?
TIPS
本文于2019-01-10更新,基于Spring Cloud Finchley支子。
造成該問題的原因
Hystrix默認(rèn)的超時(shí)時(shí)間是1秒创肥,如果超過這個(gè)時(shí)間尚未響應(yīng),將會(huì)進(jìn)入fallback代碼值朋。而首次請(qǐng)求往往會(huì)比較慢(由于Ribbon是懶加載的叹侄,在首次請(qǐng)求時(shí),才會(huì)開始初始化相關(guān)類)昨登,這個(gè)響應(yīng)時(shí)間可能就大于1秒了趾代。知道原因后,我們來總結(jié)一下解決方案篙骡。以feign為例稽坤,解決方案有如下四種。
方法一糯俗、將Hystrix超時(shí)設(shè)長
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
該配置是讓Hystrix的超時(shí)時(shí)間改為5秒尿褪,這是最容易想到的辦法,不過有點(diǎn)治標(biāo)不治本得湘。
方法二杖玲、禁用Hystrix超時(shí)
hystrix.command.default.execution.timeout.enabled: false
該配置,用于禁用Hystrix的超時(shí)時(shí)間淘正,一般不建議使用摆马。
方法三、為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實(shí)現(xiàn)在啟動(dòng)時(shí)就初始化Ribbon相關(guān)類。
ribbon:
eager-load:
enabled: true
clients: client1, client2, client3
Dalson之前版本可以通過一些Hack的機(jī)制實(shí)現(xiàn)eager load代虾,不過成本略高进肯,不建議,這里就不貼了棉磨。
本文首發(fā)
http://www.itmuch.com/spring-cloud-feign-ribbon-first-request-fail/