Spring Cloud 系列之Hystrix、Ribbon、Feign 源碼剖析(一)引子


系列目錄

Spring Cloud 系列之Hystrix、Ribbon、Feign 源碼剖析(一)引子

Spring Cloud 系列之Hystrix、Ribbon、Feign 源碼剖析(二)原理概括

Spring Cloud 系列之Hystrix、Ribbon、Feign 源碼剖析(三)源碼詳解

Spring Cloud 系列之Hystrix、Ribbon、Feign 源碼剖析(四)總結提高

 

一、引子

前幾天線上服務出現調用失敗,架構是spring cloud Greenwich.SR4版本。線上日志排查后發現:feign client調用微服務一秒就自動超時失敗。上網搜了一下,說hystrix默認超時配置就是1秒,加了如下配置,問題解決:

#Feign
#使用apahce httpclient 連接池
feign:
  httpclient:
    enabled: true
  hystrix:
    enabled: true

#超時處理
hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 30000


# 全局ribbion超時配置
ribbon:
  ConnectTimeout: 10000
  ReadTimeout: 10000

 如上圖所示:

1.feign.hystrix.enabled=true 代表開啟熔斷器

2.hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000 熔斷器超時毫秒數,30秒(默認1000)

公式如下:

Hystrix的超時時間=Ribbon的重試次數(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)

這個超時,有什么官方佐證呢?

查詢 spring cloud官網后,找到如下一段:

 

 

翻譯如下:

hystrix超時>ribbon超時(包含潛在的重試時間),例如ribbon連接超時1秒,重試3次,所以Hystrix超時必須>3秒

至此,我們知道:

1.hystrix默認超時1秒。

2.hystrix超時>ribbon超時

問題來了:怎么得知是1秒的???

二、解決步驟

揭露一下我的解決問題步驟,希望能給大家帶來一點解決問題的思路。

咱們采用三步驟:發現問題、分析問題、解決問題

2.1 發現問題

這里無非2個重點:

  • 使用spring cloud 全家桶,hystrix、ribbon、feign調用的原理清晰嗎?
  • yml中的配置有哪些?使用的默認配置了解么?

2.2 分析問題

  • 原理可以通過官方文檔+源碼(代碼都是開源的)。沒看懂?懶得看?現在源碼級別的博客越來越少,大家浮躁的連博客都是抄襲的了...
  • 怎么得知具體有哪些配置?無頭緒!!!

結束了嗎?

經過閱讀官方文檔,發現Spring boot所有的jar包,yml自動補全配置在:spring-configuration-metadata.json或者additional-spring-configuration-metadata.json。前者是編譯時自動生成的,后者是手動自定義的。后者可覆蓋前者。(但是這也只是部分配置!!!大量細節配置在源碼中!!!聊勝於無吧!!!

如下圖:

具體看一下additional-spring-configuration-metadata.json內容如下:

如上圖:

feign.hysgtrix.enabled 如果為true,開啟hystrix熔斷器。默認為false,不開啟。

feign.httpclient.enabled 開啟使用apache http client 連接池,默認開啟。

問題來了,並沒發現第一節的配置。

 

老老實實地閱讀源碼后:

在hysyrix-core-1.5.18.jar(在spring-cloud-starter-netflix-hystrix:2.1.4.RELEASE中 )中終於發現了配置類HystrixCommandProperties,中有一段默認配置  key=hystrix(propertyPrefix配置key前綴)+execution.isolation.thread.timeoutInMilliseconds 

 

default_executionTimeoutInMilliseconds默認超時時間毫秒數=1000ms=1S

果然是默認1秒,終於實錘了。我們來看一下這個配置的注釋,徹底解密一下,如下圖:

如上圖,實際業務執行時,取超時時間,就是取的executionTimeoutInMilliseconds這個屬性。並且從1.4.0開始,超時不僅支持thread-isolated線程隔離,也支持semaphore-isolated信號量隔離。關於Hystrix的2種模式,Thread和Semaphore,后續章節會慢慢分析。

2.3 解決問題

本系列文章就是一次解決問題的實踐。通過閱讀官方文檔+源碼,徹底摸清Spring Cloud Hystrix+Ribbon+Feign的老底兒。后續章節,就是我們一步步解決問題的過程。

再次重申,技術容不得偷懶!!!

 


免責聲明!

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



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