Spring Cloud中,如何解決Feign/Ribbon第一次請求失敗的問題?

Spring Cloud中,F(xiàn)eign和Ribbon在整合了Hystrix后,可能會出現(xiàn)首次調(diào)用失敗的問題,要如何解決該問題呢?

TIPS

本文于2019-01-10更新,基于Spring Cloud Finchley。

造成該問題的原因

Hystrix默認(rèn)的超時時間是1秒,如果超過這個時間尚未響應(yīng),將會進(jìn)入fallback代碼。而首次請求往往會比較慢(由于Ribbon是懶加載的,在首次請求時,才會開始初始化相關(guān)類),這個響應(yīng)時間可能就大于1秒了。知道原因后,我們來總結(jié)一下解決方案。以feign為例,解決方案有如下四種。

方法一、將Hystrix超時設(shè)長

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

該配置是讓Hystrix的超時時間改為5秒,這是最容易想到的辦法,不過有點治標(biāo)不治本。

方法二、禁用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實現(xiàn)在啟動時就初始化Ribbon相關(guān)類。

ribbon:
  eager-load:
    enabled: true
    clients: client1, client2, client3

Dalson之前版本可以通過一些Hack的機(jī)制實現(xiàn)eager load,不過成本略高,不建議,這里就不貼了。

本文首發(fā)

http://www.itmuch.com/spring-cloud-feign-ribbon-first-request-fail/

干貨分享

全是干貨
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容