整個服務熔斷降級是在消費端
圖中流程的說明:
將遠端服務呼叫邏輯封裝進乙個hystrixcommand。對於每次服務呼叫可以使用同步或非同步機制,對應執行execute()或queue()。判斷熔斷器(circuit-breaker)是否開啟或者半開啟狀態,如果開啟跳到步驟8,進行回退策略,如果關閉進入步驟4。open狀態說明開啟熔斷,也就是服務呼叫方執行本地降級策略,不進行遠端呼叫。
closed狀態說明關閉了熔斷,這時候服務呼叫方直接發起遠端呼叫。
half-open狀態,則是乙個中間狀態,當熔斷器處於這種狀態時候,直接發起遠端呼叫。
三種狀態的轉換:
closed->open:正常情況下熔斷器為closed狀態,當訪問同乙個介面次數超過設定閾值並且錯誤比例超過設定錯誤閾值時候,就會開啟熔斷機制,這時候熔斷器狀態從closed->open。
open->half-open:當服務介面對應的熔斷器狀態為open狀態時候,所有服務呼叫方呼叫該服務方法時候都是執行本地降級方法,那麼什麼時候才會恢復到遠端呼叫那?hystrix提供了一種測試策略,也就是設定了乙個時間視窗,從熔斷器狀態變為open狀態開始的乙個時間視窗內,呼叫該服務介面時候都委託服務降級方法進行執行。如果時間超過了時間視窗,則把熔斷狀態從open->half-open,這時候服務呼叫方呼叫服務介面時候,就可以發起遠端呼叫而不再使用本地降級介面,如果發起遠端呼叫還是失敗,則重新設定熔斷器狀態為open狀態,從新記錄時間視窗開始時間。
half-open->closed: 當熔斷器狀態為half-open,這時候服務呼叫方呼叫服務介面時候,就可以發起遠端呼叫而不再使用本地降級介面,如果發起遠端呼叫成功,則重新設定熔斷器狀態為closed狀態。
判斷執行緒池/佇列/訊號量(使用了艙壁隔離模式)是否跑滿,如果跑滿進入回退步驟8,否則繼續後續步驟5。run方法中執行了實際的服務呼叫。
a. 服務呼叫發生超時時,進入步驟8。判斷run方法中的**是否執行成功。
a. 執行成功返回結果。
b. 執行**現錯誤則進入步驟8。所有的執行狀態(成功,失敗,拒絕,超時)上報給熔斷器,用於統計從而影響熔斷器狀態。進入getfallback()回退邏輯。
a. 沒有實現getfallback()回退邏輯的呼叫將直接丟擲異常。
b. 回退邏輯呼叫成功直接返回。
c. 回退邏輯呼叫失敗丟擲異常。返回執行成功結果。
注意:熔斷是否開啟熔斷器主要由依賴呼叫的錯誤比率決定的,依賴呼叫的錯誤比率=請求失敗數/請求總數。hystrix中斷路器開啟的預設請求錯誤比率為50%(這裡暫時稱為請求錯誤率),還有乙個引數,用於設定在乙個滾動視窗中,開啟斷路器的最少請求數(這裡暫時稱為滾動視窗最小請求數),這裡舉個具體的例子:如果滾動視窗最小請求數為預設20,在乙個視窗內(預設10秒,統計滾動視窗的時間可以設定),收到19個請求,即使這19個請求都失敗了,此時請求錯誤率高達95%,但是斷路器也不會開啟。對於被熔斷的請求,並不是永久被切斷,而是被暫停一段時間(預設是5000ms)之後,允許部分請求通過,若請求都是健康的(responsetime<250ms)則對請求健康恢復(取消熔斷),如果不是健康的,則繼續熔斷。(這裡很容易出現一種錯覺:多個請求失敗但是沒有觸發熔斷。這是因為在乙個滾動視窗內的失敗請求數沒有達到開啟斷路器的最少請求數)
Hystrix熔斷原理
netflix的開源元件hystrix的流程 圖中流程的說明 將遠端服務呼叫邏輯封裝進乙個hystrixcommand。對於每次服務呼叫可以使用同步或非同步機制,對應執行execute 或queue 判斷熔斷器 circuit breaker 是否開啟或者半開啟狀態,如果開啟跳到步驟8,進行回退策略...
Hystrix 服務熔斷
在分布式的環境或者微服務中,不可避免的會出現一些錯誤,乙個服務的失敗或許會導致整個專案的失敗。而hystrix是乙個庫,它可以通過新增容錯邏輯來保護或者控制你的分布式服務之間的互動。hystrix通過隔離服務之間的訪問點,阻止它們之間的級聯故障以及提供後備選項來實現這一目標,所有這些都可以提高系統的...
Hystrix熔斷原理
netflix的開源元件hystrix的流程 圖中流程的說明 將遠端服務呼叫邏輯封裝進乙個hystrixcommand。對於每次服務呼叫可以使用同步或非同步機制,對應執行execute 或queue 判斷熔斷器 circuit breaker 是否開啟或者半開啟狀態,如果開啟跳到步驟8,進行回退策略...