hystrix的執行流程大概有以下幾個步驟,大致流程如下:
一、建立command
建立乙個hystrixcommand或者hystrixobservablecommand物件,代表了對某個依賴服務發起的一次請求或者呼叫。構造的時候,可以在建構函式中傳入任何需要的引數。
hystrixcommand:主要用於僅僅會返回乙個結果的呼叫。
hystrixobservablecommand:主要用於可能會返回多條結果的呼叫。
hystrixcommand command = new hystrixcommand(arg1, arg2);
hystrixobservablecommand command = new hystrixobservablecommand(arg1, arg2);
二、執行command
執行command就可以發起一次對依賴服務的呼叫,要執行command需要在4個方法中選擇其中的乙個:execute(),queue(),observe(),toobservable()。其中execute()和queue()僅僅對hystrixcommand適用。
execute():呼叫後直接block住,屬於同步呼叫,直到依賴服務返回單條結果,或者丟擲異常。
queue():返回乙個future,屬於非同步呼叫,後面可以通過future獲取單條結果。
observe():訂閱乙個observable物件,observable代表的是依賴服務返回的結果,獲取到乙個那個代表結果的observable物件的拷貝物件。
toobservable():返回乙個observable物件,如果我們訂閱這個物件,就會執行command並且獲取返回結果。
三、檢查是否開啟快取
如果這個command開啟了請求快取,而且這個呼叫的結果在快取中存在,那麼直接從快取中返回結果。
四、檢查是否開啟了斷路器
檢查這個command對應的依賴服務是否開啟了短路器,如果斷路器被開啟了,那麼hystrix就不會執行這個command,而是直接去執行fallback降級機制。
五、檢查執行緒池/佇列/semaphore是否已經滿了
如果command對應的執行緒池/佇列/semaphore已經滿了,那麼也不會執行command,而是直接去呼叫fallback降級機制。
六、執行command
呼叫hystrixobservablecommand.construct()或hystrixcommand.run()來實際執行這個command。
hystrixcommand.run():返回乙個單條結果,或者丟擲乙個異常。
hystrixobservablecommand.construct():返回乙個observable物件,可以獲取多條結果。
如果hystrixcommand.run()或hystrixobservablecommand.construct()的執行,超過了timeout時長的話,那麼command所在的執行緒就會丟擲乙個timeoutexception,如果timeout了,也會去執行fallback降級機制,而且就不會管run()或construct()返回的值了。如果沒有timeout的話,那麼就會拿到一些呼叫依賴服務獲取到的結果,然後hystrix會做一些logging記錄和metric統計。
七、短路健康檢查
hystrix會將每乙個依賴服務的呼叫成功,失敗,拒絕,超時,等事件,都會傳送給circuit breaker斷路器,短路器就會對呼叫成功/失敗/拒絕/超時等事件的次數進行統計。
短路器會根據這些統計次數來決定,是否要進行短路,如果開啟了短路器,那麼在一段時間內就會直接短路,然後如果在之後第一次檢查發現呼叫成功了,就關閉斷路器。
八、呼叫fallback降級機制
在以下幾種情況中,hystrix會呼叫fallback降級機制:
(1)run()或construct()丟擲乙個異常
(2)短路器開啟
(3)執行緒池/佇列/semaphore滿了
(4)command執行超時了
一般在降級機制中,都建議給出一些預設的返回值,比如靜態的一些**邏輯,或者從記憶體中的快取中提取一些資料,盡量在這裡不要再進行網路請求了。即使在降級中,一定要進行網路呼叫,也應該將那個呼叫放在乙個hystrixcommand中,進行隔離。
在hystrixcommand中,重寫getfallback()方法,可以提供降級機制。在hystirxobservablecommand中,實現乙個resumewithfallback()方法,返回乙個observable物件,可以提供降級結果。
如果fallback返回了結果,那麼hystrix就會返回這個結果。如果沒有實現fallback,或者是fallback丟擲了異常,hystrix會返回乙個observable,但是不會返回任何資料。不同的command執行方式,其fallback為空或者異常時的返回結果不同:
(1)對於execute(),直接丟擲異常
(2)對於queue(),返回乙個future,呼叫get()時丟擲異常
(3)對於observe(),返回乙個observable物件,但是呼叫subscribe()方法訂閱它時,理解丟擲呼叫者的onerror方法
(4)對於toobservable(),返回乙個observable物件,但是呼叫subscribe()方法訂閱它時,理解丟擲呼叫者的onerror方法
Hystrix的執行流程和原理
hystrix是netflix開源的一款容錯框架。hystrix h st r ks 中文含義是豪豬,因其背上長滿棘刺,從而擁有了自我保護的能力。說明 1.構建乙個hystrixcommand或者hystrixobservablecommand物件,將請求包裝到command物件中。2.執行命令。3...
Hystrix工作流程
工作流程主要分為三部分 呼叫請求封裝成hystrixcommand 執行請求呼叫第三方服務和呼叫結果處理,如下圖所示 執行方式 執行過程 step1 響應是否被快取 如果請求對應的結果已經被快取,則直接返回結果 否則,執行下一步 step2 熔斷器是否被開啟 如果熔斷器被開啟,說明請求鏈路被熔斷,無...
Hystrix熔斷流程
整個服務熔斷降級是在消費端 圖中流程的說明 將遠端服務呼叫邏輯封裝進乙個hystrixcommand。對於每次服務呼叫可以使用同步或非同步機制,對應執行execute 或queue 判斷熔斷器 circuit breaker 是否開啟或者半開啟狀態,如果開啟跳到步驟8,進行回退策略,如果關閉進入步驟...