SpringCloud Hystrix 功能簡(jiǎn)介

1.Hystrix的概述

在分布式系統(tǒng)中,每個(gè)服務(wù)都可能會(huì)調(diào)用很多其他服務(wù)呼猪,被調(diào)用的那些服務(wù)就是依賴服務(wù),有的時(shí)候某些依賴服務(wù)出現(xiàn)故障也是很正常的。

Hystrix可以讓我們?cè)诜植际较到y(tǒng)中對(duì)服務(wù)間的調(diào)用進(jìn)行控制炕置,加入一些調(diào)用延遲或者依賴故障的容錯(cuò)機(jī)制。

Hystrix通過將依賴服務(wù)進(jìn)行資源隔離男韧,進(jìn)而組織某個(gè)依賴服務(wù)出現(xiàn)故障的時(shí)候朴摊,這種故障在整個(gè)系統(tǒng)所有的依賴服務(wù)調(diào)用中進(jìn)行蔓延,同時(shí)Hystrix還提供故障時(shí)的fallback降級(jí)機(jī)制

總而言之此虑,Hystrix通過這些方法幫助我們提升分布式系統(tǒng)的可用性和穩(wěn)定性

2.Hystrix的功能

hystrix仍劈,就是一種高可用保障的一個(gè)框架,類似于spring(ioc寡壮,mvc),mybatis讹弯,activiti况既,lucene,框架组民,預(yù)先封裝好的為了解決某個(gè)特定領(lǐng)域的特定問題的一套代碼庫

高可用性保障的一個(gè)框架

3.Hystrix的設(shè)計(jì)原則是什么棒仍?

(1)對(duì)依賴服務(wù)調(diào)用時(shí)出現(xiàn)的調(diào)用延遲和調(diào)用失敗進(jìn)行控制和容錯(cuò)保護(hù)

(2)在復(fù)雜的分布式系統(tǒng)中,阻止某一個(gè)依賴服務(wù)的故障在整個(gè)系統(tǒng)中蔓延臭胜,服務(wù)A->服務(wù)B->服務(wù)C莫其,服務(wù)C故障了,服務(wù)B也故障了耸三,服務(wù)A故障了乱陡,整套分布式系統(tǒng)全部故障,整體宕機(jī)

(3)提供fail-fast(快速失斠亲场)和快速恢復(fù)的支持

(4)提供fallback優(yōu)雅降級(jí)的支持

(5)支持近實(shí)時(shí)的監(jiān)控憨颠、報(bào)警以及運(yùn)維操作

調(diào)用延遲+失敗,提供容錯(cuò)

阻止故障蔓延

快速失敗+快速恢復(fù)

降級(jí)

監(jiān)控+報(bào)警+運(yùn)維

完全描述了hystrix的功能,提供整個(gè)分布式系統(tǒng)的高可用的架構(gòu)

4爽彤、Hystrix要解決的問題是什么养盗?

(1)在復(fù)雜的分布式系統(tǒng)架構(gòu)中,每個(gè)服務(wù)都有很多的依賴服務(wù)适篙,而每個(gè)依賴服務(wù)都可能會(huì)故障

(2)如果服務(wù)沒有和自己的依賴服務(wù)進(jìn)行隔離往核,那么可能某一個(gè)依賴服務(wù)的故障就會(huì)拖垮當(dāng)前這個(gè)服務(wù)

舉例來說,某個(gè)服務(wù)有30個(gè)依賴服務(wù)嚷节,每個(gè)依賴服務(wù)的可用性非常高聂儒,已經(jīng)達(dá)到了99.99%的高可用性,那么該服務(wù)的可用性就是99.99%的30次方丹喻,也就是99.7%的可用性薄货,

99.7%的可用性就意味著3%的請(qǐng)求可能會(huì)失敗,因?yàn)?%的時(shí)間內(nèi)系統(tǒng)可能出現(xiàn)了故障不可用了碍论,對(duì)于1億次訪問來說谅猾,3%的請(qǐng)求失敗,也就意味著300萬次請(qǐng)求會(huì)失敗鳍悠,也意味著每個(gè)月有2個(gè)小時(shí)的時(shí)間系統(tǒng)是不可用的税娜,在真實(shí)生產(chǎn)環(huán)境中,可能更加糟糕藏研,上面也就是說敬矩,即使你每個(gè)依賴服務(wù)都是99.99%高可用性,但是一旦你有幾十個(gè)依賴服務(wù)蠢挡,還是會(huì)導(dǎo)致你每個(gè)月都有幾個(gè)小時(shí)是不可用的


5弧岳、再看Hystrix的更加細(xì)節(jié)的設(shè)計(jì)原則是什么?

(1)阻止任何一個(gè)依賴服務(wù)耗盡所有的資源业踏,比如tomcat中的所有線程資源

(2)避免請(qǐng)求排隊(duì)和積壓禽炬,采用限流和fail fast來控制故障

(3)提供fallback降級(jí)機(jī)制來應(yīng)對(duì)故障

(4)使用資源隔離技術(shù),比如bulkhead(艙壁隔離技術(shù))勤家,swimlane(泳道技術(shù))腹尖,circuit breaker(短路技術(shù)),來限制任何一個(gè)依賴服務(wù)的故障的影響

(5)通過近實(shí)時(shí)的統(tǒng)計(jì)/監(jiān)控/報(bào)警功能伐脖,來提高故障發(fā)現(xiàn)的速度

(6)通過近實(shí)時(shí)的屬性和配置熱修改功能热幔,來提高故障處理和恢復(fù)的速度

(7)保護(hù)依賴服務(wù)調(diào)用的所有故障情況,而不僅僅只是網(wǎng)絡(luò)故障情況讼庇,調(diào)用這個(gè)依賴服務(wù)的時(shí)候绎巨,client調(diào)用包有bug,阻塞蠕啄,等等认烁,依賴服務(wù)的各種各樣的調(diào)用的故障,都可以處理

6、Hystrix是如何實(shí)現(xiàn)它的目標(biāo)的却嗡?

(1)通過HystrixCommand或者HystrixObservableCommand來封裝對(duì)外部依賴的訪問請(qǐng)求舶沛,這個(gè)訪問請(qǐng)求一般會(huì)運(yùn)行在獨(dú)立的線程中,資源隔離

(2)對(duì)于超出我們?cè)O(shè)定閾值的服務(wù)調(diào)用窗价,直接進(jìn)行超時(shí)如庭,不允許其耗費(fèi)過長時(shí)間阻塞住。這個(gè)超時(shí)時(shí)間默認(rèn)是99.5%的訪問時(shí)間撼港,但是一般我們可以自己設(shè)置一下

(3)為每一個(gè)依賴服務(wù)維護(hù)一個(gè)獨(dú)立的線程池坪它,或者是semaphore,當(dāng)線程池已滿時(shí)帝牡,直接拒絕對(duì)這個(gè)服務(wù)的調(diào)用

(4)對(duì)依賴服務(wù)的調(diào)用的成功次數(shù)往毡,失敗次數(shù),拒絕次數(shù)靶溜,超時(shí)次數(shù)开瞭,進(jìn)行統(tǒng)計(jì)

(5)如果對(duì)一個(gè)依賴服務(wù)的調(diào)用失敗次數(shù)超過了一定的閾值,自動(dòng)進(jìn)行熔斷罩息,在一定時(shí)間內(nèi)對(duì)該服務(wù)的調(diào)用直接降級(jí)嗤详,一段時(shí)間后再自動(dòng)嘗試恢復(fù)

(6)當(dāng)一個(gè)服務(wù)調(diào)用出現(xiàn)失敗,被拒絕瓷炮,超時(shí)葱色,短路等異常情況時(shí),自動(dòng)調(diào)用fallback降級(jí)機(jī)制

(7)對(duì)屬性和配置的修改提供近實(shí)時(shí)的支持

7娘香、簡(jiǎn)單案例

(1)引入依賴

<!-- hystrix斷路器 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

</dependency>

(2)相關(guān)配置

# 配置開啟

feign:

? hystrix:

? ? enabled: true

# hystrix禁止服務(wù)超時(shí)苍狰,默認(rèn)為1s就會(huì)走服務(wù)降級(jí),導(dǎo)致業(yè)務(wù)邏輯正常走了烘绽,只是因?yàn)闆]及時(shí)返回導(dǎo)致走了服務(wù)降級(jí)的操作

hystrix:?

command:

? default:

? ? ? execution:

? ? ? timeout:

? ? ? ? enabled: false

生產(chǎn)環(huán)境不要寫false淋昭,最好是設(shè)置超時(shí)時(shí)間,默認(rèn)為1s

??? (3) ?? 代碼塊


@SpringBootApplication

@EnableEurekaClient

@EnableFeignClients

@EnableHystrix

public class AppOrder{

publicstaticvoidmain(String[]args){

SpringApplication.run(AppOrder.class,args);

?????? }

}

?????//服務(wù)降級(jí)demo

? ? @HystrixCommand(fallbackMethod ="orderToUserInfoFallback")

@GetMapping("/orderToUserInfo")

public ResponseBaseorderToUserInfoHystrix() {

System.out.println("orderToUserInfo:" +"當(dāng)前線程池名稱:" + Thread.currentThread().getName());

? ? ? ? return memberServiceFeigin.getUserInfo();

? ? }

@RequestMapping("/orderToUserInfoFallback")

public ResponseBaseorderToUserInfoFallback() {

return setResultError("系統(tǒng)錯(cuò)誤!!!!");

? ? }

(4)Fallback方法獨(dú)立模塊

使用@HystrixCommand會(huì)很復(fù)雜诀姚,尤其是把fallbackMethod寫在每個(gè)具體的類里。

可以把fallbackMethod寫到獨(dú)立的模塊玷禽,繼承Feign客戶端赫段,然后在feignClient里加上fallback對(duì)應(yīng)的類即可。

@FeignClient(name=””,fallbackMethod=A1.class)

public Aextends Interfaces{};

? ? public A1extends A{

@Override

public method1(){

//fallback具體內(nèi)容

? ? ? ? }

}

(5)Fallback與blockHandler的區(qū)別

fallback是服務(wù)熔斷或者業(yè)務(wù)邏輯出現(xiàn)異常執(zhí)行的方法(1.6版本以上)

blockHandler 限流出現(xiàn)錯(cuò)誤執(zhí)行的方法矢赁。

?????????????????????????????????????????????????????????????????????????? 《什么是分布式系統(tǒng)以及其中的故障和Hystrix》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糯笙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撩银,更是在濱河造成了極大的恐慌给涕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異够庙,居然都是意外死亡恭应,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門耘眨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昼榛,“玉大人,你說我怎么就攤上這事剔难〉ㄓ欤” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵偶宫,是天一觀的道長非迹。 經(jīng)常有香客問我,道長纯趋,這世上最難降的妖魔是什么憎兽? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮结闸,結(jié)果婚禮上唇兑,老公的妹妹穿的比我還像新娘。我一直安慰自己桦锄,他們只是感情好扎附,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著结耀,像睡著了一般留夜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上图甜,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天碍粥,我揣著相機(jī)與錄音,去河邊找鬼黑毅。 笑死嚼摩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矿瘦。 我是一名探鬼主播枕面,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缚去!你這毒婦竟也來了潮秘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤易结,失蹤者是張志新(化名)和其女友劉穎枕荞,沒想到半個(gè)月后柜候,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躏精,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年渣刷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玉控。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飞主,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出高诺,到底是詐尸還是另有隱情碌识,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布虱而,位于F島的核電站筏餐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏牡拇。R本人自食惡果不足惜魁瞪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠呼。 院中可真熱鬧导俘,春花似錦、人聲如沸剔蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泣崩。三九已至少梁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矫付,已是汗流浹背凯沪。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留买优,地道東北人妨马。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像杀赢,于是被迫代替她去往敵國和親烘跺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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