SpringCloud Hystrix 服務(wù)降級(jí)

什么是Hystrix?

????在分布式環(huán)境中绘雁,不可避免地會(huì)有許多服務(wù)依賴(lài)項(xiàng)失敗。Hystrix是一個(gè)庫(kù)援所,通過(guò)添加延遲容忍和容錯(cuò)邏輯庐舟,幫助您控制這些分布式服務(wù)之間的交互。Hystrix通過(guò)隔離服務(wù)之間的訪問(wèn)點(diǎn)住拭、停止跨服務(wù)的級(jí)聯(lián)故障并提供回退選項(xiàng)來(lái)實(shí)現(xiàn)這一點(diǎn)挪略,所有這些都可以提高系統(tǒng)的總體彈性。


Hystrix是干什么用的滔岳?

? ? 1 保護(hù)和控制調(diào)用第三方客戶(hù)端庫(kù)的依賴(lài)(通常是通過(guò)網(wǎng)絡(luò))的延遲和失敗杠娱。

? ? 2 防止復(fù)雜分布式系統(tǒng)中的級(jí)聯(lián)故障。

? ? 3 快速失敗和快速恢復(fù)澈蟆。

? ? 4?回退(配置回退方法)并盡可能優(yōu)雅降級(jí)墨辛。

? ? 5?啟用近實(shí)時(shí)監(jiān)視、警報(bào)和操作控制趴俘。

下面講述一個(gè)級(jí)聯(lián)故障的例子睹簇。

? ? 可以看到 App Container服務(wù)調(diào)用了很多的第三方服務(wù)奏赘,當(dāng)服務(wù)都可用的情況下沒(méi)什么問(wèn)題。

但是當(dāng)一個(gè)依賴(lài)的I第三方服務(wù)網(wǎng)絡(luò)調(diào)用延時(shí)或者服務(wù)掛掉的情況下會(huì)導(dǎo)致調(diào)用方用戶(hù)線程阻塞太惠。

????在高流量的情況下磨淌,單個(gè)后端依賴(lài)項(xiàng)(dependency I)的潛在影響可能會(huì)導(dǎo)致所有服務(wù)器(調(diào)用方)上的所有資源在幾秒鐘內(nèi)飽和。

????應(yīng)用程序中通過(guò)網(wǎng)絡(luò)或進(jìn)入客戶(hù)端庫(kù)可能導(dǎo)致網(wǎng)絡(luò)請(qǐng)求的每一點(diǎn)都是潛在故障的根源凿渊。比故障更糟糕的是梁只,這些應(yīng)用程序還會(huì)導(dǎo)致服務(wù)之間的延遲增加,導(dǎo)致更多的級(jí)聯(lián)故障埃脏。

那么豪豬(hystrix)是如何做的呢搪锣?

? ? 1 將對(duì)外部系統(tǒng)(或“依賴(lài)項(xiàng)”)的所有調(diào)用包裝在HystrixCommand或HystrixObservableCommand對(duì)象中,該對(duì)象通常在單獨(dú)的線程中執(zhí)行(這是命令模式的一個(gè)示例)彩掐。

? ? ?2? 超時(shí)調(diào)用的時(shí)間長(zhǎng)于您定義的閾值构舟。有一個(gè)默認(rèn)值,但是對(duì)于大多數(shù)依賴(lài)項(xiàng)堵幽,您可以通過(guò)“屬性”自定義設(shè)置這些超時(shí)狗超,以便它們比每個(gè)依賴(lài)項(xiàng)的99.5%的性能略高。

? ? ?3??為每個(gè)依賴(lài)項(xiàng)維護(hù)一個(gè)小的線程池(或信號(hào)量);如果它已經(jīng)滿了朴下,針對(duì)該依賴(lài)項(xiàng)的請(qǐng)求將立即被拒絕努咐,而不是排隊(duì)。

? ? ?4? 記錄成功殴胧、失敗(客戶(hù)端拋出的異常)渗稍、超時(shí)和線程拒絕。

? ? ?5? 如果服務(wù)的錯(cuò)誤百分比超過(guò)閾值溃肪,可以自動(dòng)或者手動(dòng)的斷開(kāi)斷路器免胃,以在一段時(shí)間內(nèi)停止對(duì)特定服務(wù)的所有請(qǐng)求音五。

? ? ?6? 在請(qǐng)求失敗惫撰、被拒絕、超時(shí)或短路時(shí)執(zhí)行回退邏輯躺涝。

? ? ?7?幾乎實(shí)時(shí)地監(jiān)視度量和配置更改厨钻。


????當(dāng)您使用Hystrix包裝每個(gè)底層依賴(lài)項(xiàng)時(shí),上面圖中所示的體系結(jié)構(gòu)將發(fā)生變化坚嗜,將變成下面的圖夯膀。每個(gè)依賴(lài)項(xiàng)都是相互隔離的,當(dāng)延遲發(fā)生時(shí)苍蔬,分配給被調(diào)用方的資源項(xiàng)(線程池)的資源將會(huì)飽和诱建,將會(huì)觸發(fā)斷路器并調(diào)用預(yù)先設(shè)定的回調(diào)函數(shù),使得不影響調(diào)用方碟绑,并在當(dāng)被調(diào)用方恢復(fù)后會(huì)關(guān)閉短路器俺猿。


下面看看Hystrix的實(shí)現(xiàn)邏輯

? ??

流程如下:

?1? 構(gòu)造一個(gè)HystrixCommand或HystrixObservableCommand對(duì)象

?2??執(zhí)行命令

?3?是否緩存了響應(yīng)

?4 電路打開(kāi)了嗎

5?線程池/隊(duì)列/信號(hào)量是否已滿

6 執(zhí)行HystrixObservableCommand.construct()或HystrixCommand.run()

7?計(jì)算電路健康

8 執(zhí)行回退函數(shù)

9?返回成功響應(yīng)

Circuit Breaker(斷路器)邏輯:


電路開(kāi)閉的條件如下:

1?假設(shè)電路的請(qǐng)求音量滿足域值?HystrixCommandProperties.circuitBreakerRequestVolumeThreshold()

2?假設(shè)誤差百分比超過(guò)閾值誤差百分比?

? ? ? HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()

3?斷路器從閉合過(guò)渡到打開(kāi)

4.?當(dāng)它是開(kāi)著的茎匠,它短路了所有對(duì)斷路器的要求。

5.過(guò)了一段時(shí)間(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds())

短路器處于半開(kāi)狀態(tài)押袍,此時(shí)允許1個(gè)請(qǐng)求通過(guò)執(zhí)行诵冒,當(dāng)請(qǐng)求執(zhí)行成功,則短路器從打開(kāi)到閉合谊惭,若此時(shí)請(qǐng)求還是失敗汽馋,則繼續(xù)阻斷所有請(qǐng)求。

參考:https://github.com/Netflix/Hystrix/wiki/How-it-Works#flow1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圈盔,一起剝皮案震驚了整個(gè)濱河市豹芯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驱敲,老刑警劉巖告组,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異癌佩,居然都是意外死亡木缝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)围辙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)我碟,“玉大人,你說(shuō)我怎么就攤上這事姚建〗冒常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵掸冤,是天一觀的道長(zhǎng)厘托。 經(jīng)常有香客問(wèn)我,道長(zhǎng)稿湿,這世上最難降的妖魔是什么铅匹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮饺藤,結(jié)果婚禮上包斑,老公的妹妹穿的比我還像新娘。我一直安慰自己涕俗,他們只是感情好罗丰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著再姑,像睡著了一般萌抵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天绍填,我揣著相機(jī)與錄音萎坷,去河邊找鬼。 笑死沐兰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的住闯。 我是一名探鬼主播瓜浸,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼插佛!你這毒婦竟也來(lái)了锨侯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冬殃,失蹤者是張志新(化名)和其女友劉穎囚痴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體审葬,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡深滚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣觉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痴荐。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖官册,靈堂內(nèi)的尸體忽然破棺而出生兆,到底是詐尸還是另有隱情,我是刑警寧澤攀隔,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布皂贩,位于F島的核電站栖榨,受9級(jí)特大地震影響昆汹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婴栽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一满粗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愚争,春花似錦映皆、人聲如沸挤聘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)组去。三九已至,卻和暖如春步淹,著一層夾襖步出監(jiān)牢的瞬間从隆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工缭裆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留键闺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓澈驼,卻偏偏與公主長(zhǎng)得像辛燥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缝其,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容