轉(zhuǎn):https://blog.csdn.net/hry2015/article/details/78533758?ref=myread
一. Hystrix的處理流程

-
構(gòu)造HystrixCommand或HystrixObservableCommand對(duì)象
創(chuàng)建代碼如下
HystrixCommand command = new HystrixCommand(arg1, arg2);
HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);
- 執(zhí)行Command 命令
共有4種執(zhí)行命令的方法,前2種只支持HystrixCommand ,后2種只支持HystrixObservableCommand
- execute(): 同步阻塞直至從依賴服務(wù)返回結(jié)果或拋出異常
- queue(): 異步模式,返回Future,F(xiàn)uture封裝返回的內(nèi)容
- observe() : 直接訂閱Observable ,此對(duì)象包含了從依賴服務(wù)返回的結(jié)果
- toObservable() : 返回Observable 對(duì)象,當(dāng)你訂閱他時(shí),它會(huì)執(zhí)行Hystrix命令并返回結(jié)果
HystrixCommand.execute(): 實(shí)際調(diào)用queue()的方法
public R execute() {
return queue().get();
}
HystrixCommand.queue(): 實(shí)際調(diào)用toObservable()的方法
public Future<R> queue() {
final Future<R> delegate = toObservable().toBlocking().toFuture();
....
}
HystrixObservableCommand.observe():實(shí)際調(diào)用toObservable()的方法
public Observable<R> observe() {
....
final Subscription sourceSubscription = toObservable().subscribe(subject);
....
通過以上的代碼,我們可以知道:第1種是同步阻塞性調(diào)用,第2種是異步非阻塞性調(diào)用,第3、4種是基于發(fā)布-訂閱響應(yīng)式的調(diào)用。雖然是4種調(diào)用方式,其實(shí)際最后都是基于toObservable方法來實(shí)現(xiàn)的
判斷結(jié)束是否有緩存
如果請(qǐng)求緩存功能開啟,并且請(qǐng)求在緩存命中,那么返回一個(gè)Observable,此對(duì)象包含請(qǐng)求的結(jié)束判斷短路器是否開啟
在執(zhí)行命令時(shí),Hystrix 如果發(fā)現(xiàn)斷路器跳閘,那么hystix會(huì)跳到步驟8去執(zhí)行回退(fallback)邏輯。如果斷路器沒有跳閘,則繼續(xù)執(zhí)行步驟5
關(guān)于斷路器打開和關(guān)閉的條件見本文的下方。
判斷線程池/隊(duì)列/信號(hào)資源是否滿了
如果命令關(guān)聯(lián)的線程池和隊(duì)列(或信號(hào)量)滿了,則不會(huì)執(zhí)行命令,會(huì)跳到步驟8去執(zhí)行回退(fallback)邏輯執(zhí)行HystrixObservableCommand.construct()或HystrixCommand.run()
執(zhí)行HystrixCommand.run()或HystrixObservableCommand.construct()時(shí),如果執(zhí)行超時(shí)或者執(zhí)行失敗,則執(zhí)行會(huì)跳到步驟8去執(zhí)行回退(fallback)邏輯;如果正常結(jié)束,Hystrix 會(huì)記錄一些日志和監(jiān)控?cái)?shù)據(jù),并返回處理結(jié)果
Calculate Circuit Health
Hystrix向斷路器報(bào)告成功、失敗、拒絕和超時(shí)。斷路器維護(hù)一組計(jì)數(shù)器來統(tǒng)計(jì)執(zhí)行數(shù)據(jù)。獲取 Fallback邏輯
當(dāng)發(fā)生如下情況時(shí),Hystrix會(huì)嘗試執(zhí)行回退(fallback)邏輯:
- 在執(zhí)行時(shí)construct() or run() ,跑出異常 (發(fā)生在步驟6.)
- 斷路器打開時(shí),命令被斷路 (發(fā)生在步驟4.)
- 當(dāng)執(zhí)行命令時(shí),依賴的線程池、隊(duì)列或信號(hào)量滿(發(fā)生在步驟5.)
- 執(zhí)行命令超時(shí)
編寫回退(fallback)邏輯時(shí),這個(gè)邏輯里最好沒有網(wǎng)絡(luò)調(diào)用,只從內(nèi)存中獲取或者只有靜態(tài)的邏輯,這個(gè)邏輯保證不會(huì)執(zhí)行失敗。如果非要通過網(wǎng)絡(luò)去獲取Fallback,你需要在使用其他HystrixCommand或HystrixObservableCommand封裝請(qǐng)求,并且這個(gè)請(qǐng)求必須有fallback邏輯且值沒有網(wǎng)絡(luò)調(diào)用,只有靜態(tài)邏輯
-
Return the Successful Response
返回執(zhí)行結(jié)束或者Observable
二. 斷路器工作流程
下圖顯示HystrixCommand或HystrixObservableCommand如何與HystrixCircuitBreaker及其邏輯和決策流程交互,包括計(jì)數(shù)器在斷路器中的行為。

斷路器開啟關(guān)閉的規(guī)則如下:
- 如果服務(wù)請(qǐng)求數(shù)量達(dá)到一定閾值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold)且如果服務(wù)請(qǐng)求失敗的百分比超過閾值(HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())…
- 然后斷路器的狀態(tài)從CLOSED改變?yōu)镺PEN.
- 當(dāng)斷路器open時(shí),它會(huì)短路所有經(jīng)過此斷路器的請(qǐng)求。
- 經(jīng)過一段時(shí)間(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()),接下來的第一個(gè)請(qǐng)求允許通過(此時(shí)斷路器是處于HALF-OPEN狀態(tài))。 如果請(qǐng)求失敗,斷路器將在睡眠窗口持續(xù)時(shí)間內(nèi)返回到OPEN狀態(tài)。 如果請(qǐng)求成功,斷路器狀態(tài)將轉(zhuǎn)換到CLOSED,又會(huì)轉(zhuǎn)到邏輯1。