SpringCloud openFeign遠程調用超時解決辦法


問題

在使用openFein進行遠程調用的時候,調用超時,報錯信息如下:

com.netflix.hystrix.exception.HystrixRuntimeException: XXXService#login(RequestObject) timed-out and no fallback available.

原因

OpenFeign 內部集成了HytrixRibbon 組件,當設置了

feign:
  hystrix:
    # 啟用fegin斷路器
    enabled: true

,相當於啟用了斷路器,那么調用的超時時間將會按照 RibbonHytrix 的較小者去配置。


補充: 在引入了openFein組件后,可以配置的內容如下所示:

1. hystrix可配置的部分:

hystrix.command.default.execution.timeout.enable=true //為false則超時控制有ribbon控制,為true則hystrix超時和ribbon超時都是用,但是誰小誰生效,默認為true

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000//熔斷器的超時時長默認1秒,最常修改的參數

circuitBreaker.requestVolumeThreshold=20 //觸發熔斷的最小請求次數,默認為20

circuitBreaker.sleepWindowInMilliseconds=5000 //休眠時長,默認為5秒

circuitBreaker.errorThresholdPercentage=50 //觸發熔斷的失敗請求最小占比,默認50%

2. ribbon可配置的部分:

ribbon.ReadTimeout=1000 //處理請求的超時時間,默認為1秒

ribbon.ConnectTimeout=1000 //連接建立的超時時長,默認1秒

ribbon.MaxAutoRetries=1 //同一台實例的最大重試次數,但是不包括首次調用,默認為1次

ribbon.MaxAutoRetriesNextServer=0 //重試負載均衡其他實例的最大重試次數,不包括首次調用,默認為0次

ribbon.OkToRetryOnAllOperations=false //是否對所有操作都重試,默認false

 3. Feign可配置的部分:

feign.hystrix.enable=false //feign是否啟用斷路器,默認為false

Ribbon的注意事項:

  1. Ribbon的超時有2個:連接超時和處理超時,默認都是1秒。

  2. Ribbon的默認重試也有2個:同一實例的重試次數和負載均衡的不同實例的重試次數,默認為1次和0次。

也就是說,如果只有一個實例,連接超時重試1次,處理超時也重試1次。即:實際Ribbon的超時時間是 1秒×2+1秒×2=4秒。

  1. Ribbon默認GET請求不論是連接失敗還是處理失敗都會重試,而對於非GET請求只對連接失敗進行重試。

結論:配置Hystrix的timeoutInMillisecond要大於Ribbon的 ( ConnectTimeout + ReadTimeout ) × 2。目的就是保證在熔斷之前完成遠程調用(包括Ribbon的重試時間)。

配置步驟配置步驟:

1. 開啟Feign的Hystrix開關

feign:
  hystrix:
    enabled: true
2. 設置Hystrix超時時長

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000
3. 配置ribbon的連接時長和服務響應時長

ribbon:
  ConnectTimeout: 2000
  ReadTimeout: 5000

解決

版本說明:SpringBoot:2.3.3.Release, OpenFeign: 2.2.7.Release
配置以下Feign的配置:

feign:
  hystrix:
    # 啟用fegin斷路器
    enabled: true
    strategy:
      custom: true  # 自定義feign熔斷策略
  httpclient:
    enabled: true
  okhttp:
    enabled: false

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000

ribbon:
  ConnectTimeout: 2000
  ReadTimeout: 5000

問題解決,遠程調用微服務成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM