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》