天天看點

Hystrix - 什麼是Hystrix?Hystrix的整體流程

一、什麼是Hystrix? 有什麼用?

總的來說:為了預防服務雪崩(Hystrix - 什麼是服務雪崩?),通過Hystrix的資源隔離(線程池隔離),斷路器,服務降級來預防服務雪崩。

舉個例子:

“訂單服務”調用“積分服務”的時候,一旦在“訂單服務”内,配置設定給“積分服務”的hystrix線程池中的線程全被占用且無響應,

“訂單服務”的熔斷器Circuit Breaker就會打開,不再調用實際的“積分服務”,改為調用降級邏輯。

Hystrix - 什麼是Hystrix?Hystrix的整體流程

二、Hystrix流程圖

下圖為Hystrix服務調用的内部邏輯:

Hystrix - 什麼是Hystrix?Hystrix的整體流程

建構Hystrix的Command對象, 調用執行方法.

Hystrix檢查目前服務的熔斷器開關是否開啟, 若開啟, 則執行降級服務getFallback方法.

若熔斷器開關關閉, 則Hystrix檢查目前服務的線程池是否能接收新的請求, 若超過線程池已滿, 則執行降級服務getFallback方法.

若線程池接受請求, 則Hystrix開始執行服務調用具體邏輯run方法.

若服務執行失敗, 則執行降級服務getFallback方法, 并将執行結果上報Metrics更新服務健康狀況.

若服務執行逾時, 則執行降級服務getFallback方法, 并将執行結果上報Metrics更新服務健康狀況.

若服務執行成功, 傳回正常結果.

若服務降級方法getFallback執行成功, 則傳回降級結果.

若服務降級方法getFallback執行失敗, 則抛出異常.

Hystrix - 什麼是Hystrix?Hystrix的整體流程

流程說明:

1:每次調用建立一個新的HystrixCommand,把依賴調用封裝在run()方法中。

2:執行execute()/queue做同步或異步調用。

3:判斷熔斷器(circuit-breaker)是否打開,如果打開跳到步驟8,進行降級政策,如果關閉進入步驟。

4:判斷線程池/隊列/信号量是否跑滿,如果跑滿進入降級步驟8,否則繼續後續步驟。

5:調用HystrixCommand的run方法。運作依賴邏輯

5a:依賴邏輯調用逾時,進入步驟8。

6:判斷邏輯是否調用成功

6a:傳回成功調用結果

6b:調用出錯,進入步驟8。

7:計算熔斷器狀态,所有的運作狀态(成功, 失敗, 拒絕,逾時)上報給熔斷器,用于統計進而判斷熔斷器狀态。

8:getFallback()降級邏輯。

以下四種情況将觸發getFallback調用:

(1):run()方法抛出非HystrixBadRequestException異常

(2):run()方法調用逾時

(3):熔斷器開啟攔截調用

(4):線程池/隊列/信号量是否跑滿

8a:沒有實作getFallback的Command将直接抛出異常

8b:fallback降級邏輯調用成功直接傳回

8c:降級邏輯調用失敗抛出異常

9:傳回執行成功結果

繼續閱讀