?? 《SpringCloud入門實(shí)戰(zhàn)系列》解鎖SpringCloud主流組件入門應(yīng)用及關(guān)鍵特性荚藻。帶你了解SpringCloud主流組件,是如何一戰(zhàn)解決微服務(wù)諸多難題的。項(xiàng)目demo:源碼地址
一啥刻、Hystrix是什么
老規(guī)矩秃殉,官網(wǎng):Hystrix官網(wǎng)坝初。Hystrix關(guān)鍵特性:服務(wù)降級(jí)、服務(wù)熔斷钾军、服務(wù)限流鳄袍。
Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲
和容錯(cuò)
的開源庫,在分布式系統(tǒng)用吏恭,許多依賴不可避免的會(huì)調(diào)用失敗拗小,比如超時(shí)、異常等樱哼。Hystrix能夠保證在一個(gè)依賴出問題的情況下哀九,不會(huì)導(dǎo)致整體服務(wù)失敗剿配,避免級(jí)聯(lián)故障,以提高分布式系統(tǒng)的彈性阅束。
"斷路器”本身是一種開關(guān)裝置呼胚,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過斷路器的故障監(jiān)控息裸,向調(diào)用方返回一個(gè)符合預(yù)期的蝇更、可處理的相應(yīng)(FallBack),而不是長時(shí)間的等待或者拋出調(diào)用方無法處理的異常
呼盆,這樣就保證了服務(wù)調(diào)用方的線程不會(huì)被長時(shí)間年扩、不必更地占用,從而避免了故障在分布式系統(tǒng)中的蔓延访圃,乃至雪崩常遂。
怎么樣,是不是關(guān)于Hystrix是什么挽荠,怎么學(xué)官網(wǎng)是不是清楚明了克胳。
另外我們關(guān)注到Hystrix也停更了,我們知道任何技術(shù)停更圈匆,也相應(yīng)的有其他不停更技術(shù)的相似替代漠另,Sentinel也要安排學(xué)起來了!
Tip:不管學(xué)習(xí)哪個(gè)技術(shù)跃赚,個(gè)人還是建議要學(xué)會(huì)看官網(wǎng)笆搓,那是最準(zhǔn)確清楚的。
二纬傲、Hystrix的用途
為通過第三方客戶端庫訪問(通常通過網(wǎng)絡(luò))的依賴關(guān)系提供保護(hù)和控制延遲和故障满败。
停止復(fù)雜分布式系統(tǒng)中的級(jí)聯(lián)故障。
故障快速恢復(fù)叹括。
盡可能后退并優(yōu)雅地降級(jí)算墨。
實(shí)現(xiàn)近乎實(shí)時(shí)的監(jiān)控、警報(bào)和操作控制汁雷。
三净嘀、Hystrix的設(shè)計(jì)原則
防止任何單個(gè)依賴項(xiàng)用完所有容器(如Tomcat)用戶線程。
減少負(fù)載并快速故障侠讯,而不是排隊(duì)挖藏。
在可行的情況下提供回退,以保護(hù)用戶免受故障的影響厢漩。
使用隔離技術(shù)(如斷路器模式)來限制任何一種依賴關(guān)系的影響膜眠。
通過近乎實(shí)時(shí)的指標(biāo)、監(jiān)控和警報(bào)優(yōu)化發(fā)現(xiàn)時(shí)間
通過低延遲傳播配置更改和支持Hystrix大多數(shù)方面的動(dòng)態(tài)屬性更改來優(yōu)化恢復(fù)時(shí)間,使您能夠通過低延遲反饋回路進(jìn)行實(shí)時(shí)操作修改宵膨。
防止在整個(gè)依賴客戶端執(zhí)行過程中發(fā)生故障架谎,而不僅僅是在網(wǎng)絡(luò)流量中。
四柄驻、Hystrix重要概念
五狐树、Hystrix實(shí)戰(zhàn)案例
1焙压、準(zhǔn)備項(xiàng)目
新建springcloud-hystrix工程鸿脓,以單機(jī)版注冊(cè)中心為例,陸續(xù)建module搭建環(huán)境涯曲。
環(huán)境搭建參考《SpringCloud入門實(shí)戰(zhàn)系列》前幾篇文章野哭。
2、服務(wù)降級(jí)
服務(wù)降級(jí)
:也就是假設(shè)對(duì)方系統(tǒng)不可用了幻件,向調(diào)用方返回一個(gè)符合預(yù)期的拨黔,可備選的響應(yīng)。比如我們常見的“服務(wù)器忙绰沥,請(qǐng)稍后重試!”篱蝇、“系統(tǒng)開小差,請(qǐng)稍后再試徽曲!”零截、“您的內(nèi)容飛到了外太空…”等,超時(shí)不再等待秃臣,出錯(cuò)有兜底方案涧衙。不用客戶等待并立刻返回一個(gè)友好的提示,這就是服務(wù)降級(jí)奥此。
更多內(nèi)容參看:SpringCloud入門實(shí)戰(zhàn)-Hystrix服務(wù)降級(jí)
3弧哎、服務(wù)熔斷
熔斷機(jī)制
是應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制。當(dāng)扇出鏈路的某個(gè)微服務(wù)出錯(cuò)不可用或者響應(yīng)時(shí)間太長時(shí)會(huì)進(jìn)行服務(wù)的降級(jí)稚虎,進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用撤嫩,快速返回錯(cuò)誤的響應(yīng)信息。當(dāng)檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后蠢终,恢復(fù)調(diào)用鏈路
非洲。
更多內(nèi)容參看:SpringCloud入門實(shí)戰(zhàn)-Hystrix服務(wù)熔斷
4、服務(wù)限流
通過線程池
或者信號(hào)量
判斷是否已滿蜕径,超出容量的請(qǐng)求直接降級(jí)两踏,以達(dá)到限流的作用。
更多內(nèi)容參看:SpringCloud入門實(shí)戰(zhàn)-Hystrix服務(wù)限流
六兜喻、工作流程
1梦染、官網(wǎng)流程圖
翻譯過來就是:
2、流程說明
1)每次調(diào)用創(chuàng)建一個(gè)新的HystrixCommand,把依賴調(diào)用封裝在run()方法中.
2)執(zhí)行execute()/queue做同步或異步調(diào)用.
3)當(dāng)前調(diào)用是否已被緩存,是則直接返回結(jié)果帕识,否則進(jìn)入步驟 4
4)判斷熔斷器(circuit-breaker)是否打開,如果打開跳到步驟 8,進(jìn)行降級(jí)策略,如果關(guān)閉進(jìn)入步驟 5
5)判斷線程池/隊(duì)列/信號(hào)量是否跑滿泛粹,如果跑滿進(jìn)入降級(jí)步驟8,否則繼續(xù)后續(xù)步驟 6
6)調(diào)用HystrixCommand的run方法.運(yùn)行依賴邏輯
調(diào)用是否出現(xiàn)異常,否:繼續(xù)肮疗,是進(jìn)入步驟8晶姊,
調(diào)用是否超時(shí),否:返回調(diào)用結(jié)果伪货,是進(jìn)入步驟8
搜集5们衙、6步驟所有的運(yùn)行狀態(tài)(成功, 失敗, 拒絕,超時(shí))上報(bào)給熔斷器,用于統(tǒng)計(jì)從而判斷熔斷器狀態(tài)
getFallback()降級(jí)邏輯.四種觸發(fā)getFallback調(diào)用情況(圖中步驟8的箭頭來源):返回執(zhí)行成功結(jié)果
3碱呼、Hystrix源碼總結(jié)
- 采用了AOP的方式來對(duì)方法進(jìn)行了增強(qiáng)
- 采用了大量的RxJava響應(yīng)式編程蒙挑,利用了Future+線程池的方法進(jìn)行了大量的異步
- 涉及到了滑動(dòng)窗口的設(shè)計(jì),來進(jìn)行統(tǒng)計(jì)失敗率(到Sentinel再仔細(xì)講述)