這篇文章主要講解了“何為Hystrix”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“何為Hystrix”吧!
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、茄子河ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的茄子河網(wǎng)站制作公司
在分布式架構(gòu)中,很常見的一個(gè)情形就是某一個(gè)請求需要調(diào)用多個(gè)服務(wù)。
如客戶端訪問 user 服務(wù),而 user 服務(wù)需要調(diào)用 order 服務(wù),order 服務(wù)需要調(diào)用 goods 服務(wù),由于網(wǎng)絡(luò)原因或者自身的原因,如果 order 服務(wù)或者 goods 服務(wù)不能及時(shí)響應(yīng),user 服務(wù)將處于阻塞狀態(tài),直到 order 服務(wù) goods 服務(wù)響應(yīng)。
此時(shí)若有大量的請求涌入,容器的線程資源會被消耗完畢,導(dǎo)致服務(wù)癱瘓。
服務(wù)與服務(wù)之間的依賴性,故障會傳播,造成連鎖反應(yīng),會對整個(gè)微服務(wù)系統(tǒng)造成災(zāi)難性的嚴(yán)重后果,這就是服務(wù)故障的“雪崩”效應(yīng)。

1.如圖所示,此時(shí)的系統(tǒng)正在愉快的運(yùn)行中。
2.突然這個(gè)時(shí)候,goods服務(wù)節(jié)點(diǎn)的網(wǎng)絡(luò)發(fā)生了故障。goods服務(wù)節(jié)點(diǎn)癱瘓,goods服務(wù)不可用。
3.由于good服務(wù)癱瘓導(dǎo)致order服務(wù)向goods服務(wù)發(fā)送的請求得不到返回,一直處于阻塞,此時(shí)user服務(wù)仍然一直 向order服務(wù)發(fā)送請求,最終導(dǎo)致order服務(wù)節(jié)點(diǎn)的資源耗盡,order服務(wù)節(jié)點(diǎn)癱瘓,order服務(wù)不可用。
4.由于good服務(wù)癱瘓導(dǎo)致order服務(wù)向goods服務(wù)發(fā)送的請求得不到返回,一直處于阻塞,此時(shí)user服務(wù)仍然一直 向order服務(wù)發(fā)送請求,最終導(dǎo)致order服務(wù)節(jié)點(diǎn)的資源耗盡,也癱瘓掉。此時(shí)user服務(wù)向order服務(wù)發(fā)送的請求同樣也得不到返回,而客戶端依然源源不斷的向user服務(wù)節(jié)點(diǎn)發(fā)送請求,最終user服務(wù)節(jié)點(diǎn)和order服務(wù)節(jié)點(diǎn)一樣,由于資源耗盡導(dǎo)致服務(wù)器癱瘓,user服務(wù)也不可用。
如上所述,一個(gè)服務(wù)節(jié)點(diǎn)的癱瘓,導(dǎo)致整條鏈路的服務(wù)節(jié)點(diǎn)都癱瘓的情形,我們稱之為服務(wù)雪崩。
流量激增:比如異常流量、用戶重試導(dǎo)致系統(tǒng)負(fù)載升高;
緩存穿透:假設(shè)A為client端,B為Server端,假設(shè)A系統(tǒng)請求都流向B系統(tǒng),請求超出了B系統(tǒng)的承載能力,就會造成B系統(tǒng)崩潰;
程序有Bug:代碼循環(huán)調(diào)用的邏輯問題,資源未釋放引起的內(nèi)存泄漏等問題;
硬件故障:比如宕機(jī),機(jī)房斷電,光纖被挖斷等。
數(shù)據(jù)庫嚴(yán)重瓶頸,比如:長事務(wù)、慢sql等。
線程同步等待:系統(tǒng)間經(jīng)常采用同步服務(wù)調(diào)用模式,核心服務(wù)和非核心服務(wù)共用一個(gè)線程池和消息隊(duì)列。如果一個(gè)核心業(yè)務(wù)線程調(diào)用非核心線程,這個(gè)非核心線程交由第三方系統(tǒng)完成,當(dāng)?shù)谌较到y(tǒng)本身出現(xiàn)問題,導(dǎo)致核心線程阻塞,一直處于等待狀態(tài),而進(jìn)程間的調(diào)用是有超時(shí)限制的,最終這條線程將斷掉,也可能引發(fā)雪崩。
當(dāng)發(fā)生突發(fā)流量激增的情況下,我們可以使用自動擴(kuò)容,或者是在負(fù)載均衡器中添加服務(wù)限流功能
對于緩存穿透造成的服務(wù)雪崩問題,可以通過緩存預(yù)加載、緩存異步加載等方式來解決。
對于程序bug,emmm...,只能改bug了。
對于數(shù)據(jù)庫查詢時(shí)間過長導(dǎo)致的服務(wù)雪崩可以進(jìn)行sql優(yōu)化,硬件升級等。
對于硬件故障造成的服務(wù)雪崩, ,跨機(jī)房路由,異地多活等方式。
對于不同的造成服務(wù)雪崩的場景,有著很多不同的解決方案,但是沒有一個(gè)通用的解決方案可以解決所有的問題。
在通過大量的實(shí)踐證明,線程同步等待是最常見引發(fā)的雪崩效應(yīng)的場景,此刻,本章節(jié)的主人公Hystrix將粉墨登場,我們將詳細(xì)介紹如何使用Hystrix做故障隔離,熔斷器機(jī)制等可以解決依賴服務(wù)不可用的問題。
Hystrix是一個(gè)用于處理微服務(wù)架構(gòu)中的服務(wù)之間調(diào)用故障和容錯的開源庫。
在微服務(wù)架構(gòu)里,各個(gè)服務(wù)之間的調(diào)用都可能會失敗,比如超時(shí)、異常等。
Hystrix能夠保證在一個(gè)依賴出問題的情況下,不會導(dǎo)致整個(gè)服務(wù)鏈路全線崩潰,提高微服務(wù)架構(gòu)的可用性。
Hystrix,我們又稱“斷路器”,其本身是一種開關(guān)裝置,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)符合預(yù)期的、可處理的備選響應(yīng)(FallBack),而不是長時(shí)間的等待或者拋出調(diào)用方無法處理的異常,這樣就保證了服務(wù)調(diào)用方的線程不會被長時(shí)間、不必要地占用,從而避免了故障在分布式系統(tǒng)中的蔓延,乃至雪崩。
設(shè)計(jì)目標(biāo)
(1)對依賴服務(wù)調(diào)用時(shí)出現(xiàn)的調(diào)用延遲和調(diào)用失敗進(jìn)行控制和容錯保護(hù)。
(2)阻止某一個(gè)依賴服務(wù)的故障在整個(gè)系統(tǒng)中蔓延,服務(wù)A->服務(wù)B->服務(wù)C,服務(wù)C故障了,服務(wù)B也故障了,服務(wù)A故障了,整個(gè)系統(tǒng)全部故障,整體宕機(jī)。(3)提供fail-fast(快速失敗)和快速恢復(fù)的支持。
(4)提供fallback優(yōu)雅降級的支持。
(5)支持近實(shí)時(shí)的監(jiān)控、報(bào)警以及運(yùn)維操作。
實(shí)現(xiàn)方式
通過hystrixCommand或者HystrixObservableCommand來封裝對外部依賴的訪問請求,這個(gè)訪問請求一般會運(yùn)行在獨(dú)立的線程中。
對于超出我們設(shè)定的閾(yu)值服務(wù)調(diào)用,直接進(jìn)行超時(shí)返回,不允許它長時(shí)間的阻塞。
對每一個(gè)依賴服務(wù)進(jìn)行資源隔離。通過線程池或者是semaphore這兩種方式。
對依賴服務(wù)被調(diào)用的成功次數(shù),失敗次數(shù),拒絕次數(shù),超時(shí)次數(shù)進(jìn)行統(tǒng)計(jì)。
如果對某一個(gè)依賴服務(wù)的調(diào)用失敗次數(shù)超過了一點(diǎn)的閾值,Hystrix自動進(jìn)行熔斷,并在一段時(shí)間內(nèi)對該服務(wù)的調(diào)用直接進(jìn)行降級,一段時(shí)間后再自動嘗試恢復(fù)
當(dāng)對一個(gè)服務(wù)調(diào)用出現(xiàn)失敗、被拒絕、超時(shí)、短路等異常情況時(shí),自動調(diào)用fallback降級機(jī)制。
對屬性和配置的修改提供近實(shí)時(shí)的支持
首先我們看一下管網(wǎng)的Hystrix工作流程圖:

下面我們針對這張圖詳細(xì)解讀下Hystrix的工作流程。
1.每次調(diào)用都會創(chuàng)建HystrixCommand或者HystrixObservableCommand對象
2.執(zhí)行execute(observe)或queue(toObservable)做同步\異步調(diào)用
3.檢查請求結(jié)果是否被緩存,如果緩存直接返回
4.檢查是否開啟了斷路器,如果開啟直接跳到步驟8
5.檢查線程池/信號量是否跑滿,如果跑滿進(jìn)入步驟8
6.執(zhí)行 HystrixObservableCommand.construct() or HystrixCommand.run(),如果執(zhí)行異常或者調(diào)用超時(shí)直接跳到步驟8
7.計(jì)算斷路器狀態(tài),所有的運(yùn)行狀態(tài)(成功, 失敗, 拒絕,超時(shí))上報(bào)給斷路器,用于統(tǒng)計(jì)從而判斷斷路器狀態(tài)
8.調(diào)用fallback降級機(jī)制,通過上述步驟會有(熔斷器打開,線程池/信號量跑滿,調(diào)用超時(shí),調(diào)用失敗)四種情況會進(jìn)行降級處理
9.返回依賴請求的真正結(jié)果
工作流程詳解
第一步,創(chuàng)建HystrixCommand或者HystrixObservableCommand對象
HytrixCommand和HystrixObservableCommand包裝了對外部依賴訪問的邏輯。
整個(gè)流程的第一個(gè)步驟就是實(shí)例化HystrixCommand或者HystrixObservableCommand對象。
在構(gòu)造這兩個(gè)Command對象時(shí),可以通過構(gòu)造方法傳遞任何執(zhí)行過程中需要的參數(shù)。
如果對外部依賴調(diào)用只返回一個(gè)結(jié)果值,那么可以實(shí)例化一個(gè)HystrixCommand對象。
HystrixCommand command = newHystrixCommand(arg1, arg2);
如果在調(diào)用外部依賴時(shí)需要返回多個(gè)結(jié)果值時(shí),可以實(shí)例化一個(gè)HystrixObservableCommand對象
HystrixObservableCommand command = newHystrixObservableCommand(arg1, arg2);
第二步,執(zhí)行execute(observe)或queue(toObservable)做同步\異步調(diào)用
HystrixCommand主要是使用以下兩個(gè)命令
execute():同步執(zhí)行,從依賴的服務(wù)返回一個(gè)單一的結(jié)果對象,或者是在發(fā)生錯誤的時(shí)候拋出異常。
queue():異步執(zhí)行,直接返回一個(gè)Future對象,其中包含了服務(wù)執(zhí)行結(jié)束時(shí)要返回的單一結(jié)果對象。
HystrixObservableCommand使用以下兩個(gè)命令
observe():返回Observable對象,返回 Observable 對象,立即發(fā)出請求,在依賴服務(wù)響應(yīng)(或者拋出異常/超時(shí))時(shí),通過注冊的 Subscriber 得到返回結(jié)果,它是一個(gè)Hot Observable。
toObservable():返回Observable對象,但只有在訂閱該對象時(shí),才會發(fā)出請求,然后在依賴服務(wù)響應(yīng)(或者拋出異常/超時(shí))時(shí),通過注冊的 Subscriber 得到返回結(jié)果,它是一個(gè)Cold Observable。
第三步,檢查請求結(jié)果是否被緩存,如果緩存直接返回
若當(dāng)前命令的請求緩存功能是被啟用的,并且該命令緩存命中,那么緩存的結(jié)果會立即以O(shè)bservable對象的形式返回。
這個(gè)結(jié)果緩存的好處為:
1、在同一個(gè)請求上下文中,可以減少使用相同參數(shù)請求原始服務(wù)的開銷。
2、請求緩存在步驟5執(zhí)行之前生效,所以可以有效減少不必要的線程開銷。
第四步,檢查是否開啟了斷路器
在緩存沒有被命中時(shí),Hystrix會在執(zhí)行步驟5之前先檢查斷路器是否被打開。如果打開了,Hystrix不會執(zhí)行任何命令執(zhí)行跳轉(zhuǎn)到步驟8
斷路器開關(guān)控制條件: 1.對外部依賴調(diào)用的次數(shù)滿足配置的閾值 2.對外部依賴調(diào)用發(fā)生錯誤的比率滿足配置的閾值
在滿足以上兩個(gè)條件時(shí),斷路器打開熔斷開關(guān),之后所有對外部依賴調(diào)用都將被直接斷開。
在開關(guān)打開時(shí)長超過試探窗口期后,斷路器將嘗試放行部分外部依賴的調(diào)用,
根據(jù)試探的結(jié)果決定重新開啟或者關(guān)閉熔斷開關(guān)。
第五步,檢查線程池/信號量是否跑滿
我們知道,Hystrix引入了線程池和信號量兩種方式實(shí)現(xiàn)資源隔離機(jī)制。如果此時(shí)命令對應(yīng)的線程池或隊(duì)列或信號量已經(jīng)滿了,直接跳轉(zhuǎn)到步驟8。
第六步,執(zhí)行 HystrixObservableCommand.construct() or HystrixCommand.run()
Hystrix會根據(jù)我們編寫的方法來決定采取什么方式去請求依賴服務(wù)。
1.HystrixCommand.run()——返回單個(gè)響應(yīng)或拋出異常。
2.HystrixObservableCommand.construct()——返回 Observable 對象來發(fā)射多個(gè)結(jié)果,或通過onError發(fā)送錯誤通知。
如果run()或construct()方法執(zhí)行時(shí)長超過了命令的超時(shí)閥值,其線程將拋出一個(gè)TimeoutException(或者在一個(gè)單獨(dú)的線程拋出,如果命令沒有運(yùn)行在它自己的線程)。
這種情況下 Hystrix轉(zhuǎn)接到fallback處理邏輯(第8步)。
并且如果該命令沒有取消或中斷,它將放棄run()或construct()方法最終的返回值。
如果命令沒有拋出異常并且返回了響應(yīng),Hystrix 將會在執(zhí)行一些日志記錄和度量報(bào)告之后返回結(jié)果給調(diào)用者。
如果是通過run()運(yùn)行,Hystrix 將返回 Observable 發(fā)射單個(gè)結(jié)果,然后發(fā)送一個(gè)onCompleted的通知;如果是通過construct()運(yùn)行,Hystrix 直接返回該方法產(chǎn)生的Observable對象。
第七步,計(jì)算斷路器狀態(tài)
Hystrix會將每一個(gè)依賴服務(wù)的調(diào)用成功,失敗,拒絕,超時(shí),等事件,都會發(fā)送給circuit breaker斷路器。
HystrixCircuitBreaker通過維護(hù)一系列的counter記錄外部依賴請求的執(zhí)行情況。
斷路器根據(jù)維護(hù)的這些信息,在符合觸發(fā)條件下開啟斷路功能,在條件合適的時(shí)候關(guān)閉斷路開關(guān)。
如果打開了斷路器,那么在一段時(shí)間內(nèi)就會直接短路,然后如果在之后第一次檢查發(fā)現(xiàn)調(diào)用成功了,就關(guān)閉斷路器。
第八步,調(diào)用fallback降級機(jī)制
通過對上述步驟的詳細(xì)解讀,我們發(fā)現(xiàn)有以下幾種情況是會調(diào)用fallback降級機(jī)制的。1.斷路器打開
2.線程池或者信號量已經(jīng)滿了
3.command執(zhí)行異常
4.執(zhí)行超時(shí)
在服務(wù)降級邏輯中,需要實(shí)現(xiàn)一個(gè)通用的響應(yīng)結(jié)果,并且該結(jié)果的處理邏輯應(yīng)當(dāng)是從緩存或是根據(jù)一些靜態(tài)邏輯來獲取,而不是依賴網(wǎng)絡(luò)請求獲取。
如果一定要在服務(wù)降級邏輯中包含網(wǎng)絡(luò)請求,那么該請求也必須包裝在HystrixCommand或HystrixObservableCommand中,從而形成級聯(lián)的降級策略。
而最終的降級邏輯一定不是一個(gè)依賴網(wǎng)絡(luò)請求的處理,而是一個(gè)能夠穩(wěn)定的返回結(jié)果的處理邏輯。
1.在 HystrixCommand 中,在 HystrixCommand.getFallback()方法中提供自定義的回調(diào)邏輯,方法返回單個(gè)回調(diào)值。
2.在 HystrixObservableCommand 中,在HystrixObservableCommand.resumeWithFallback() 方法中提供自定義的回調(diào)邏輯,方法返回一個(gè)Observable對象來發(fā)射一個(gè)或多個(gè)降級結(jié)果
如果fallback返回了結(jié)果,那么Hystrix就會返回這個(gè)結(jié)果。
對于HystrixCommand,會返回一個(gè)Observable對象,其中會發(fā)返回對應(yīng)的結(jié)果;
對于HystrixObservableCommand,會返回一個(gè)原始的Observable對象。
如果沒有實(shí)現(xiàn)fallback,或者是fallback拋出了異常,Hystrix會返回一個(gè)Observable,但是不會返回任何數(shù)據(jù)。
不同的command執(zhí)行方式,其fallback為空或者異常時(shí)的返回結(jié)果不同
1.對于execute(),直接拋出異常 2.對于queue(),返回一個(gè)Future,調(diào)用get()時(shí)拋出異常 3.對于observe(),返回一個(gè)Observable對象,但是調(diào)用subscribe()方法訂閱它時(shí),拋出調(diào)用者的onError方法 4.對于toObservable(),返回一個(gè)Observable對象,但是調(diào)用subscribe()方法訂閱它時(shí),拋出調(diào)用者的onError方法
第九步,返回依賴請求的真正結(jié)果
如果Hystrix命令執(zhí)行成功,它將以O(shè)bservable形式返回響應(yīng)給調(diào)用者。根據(jù)你在步驟2的調(diào)用方式不同,在返回Observablez之前可能會做一些轉(zhuǎn)換。

execute():通過調(diào)用queue()來得到一個(gè)Future對象,然后調(diào)用get()方法來獲取Future中包含的值。
queue():將Observable轉(zhuǎn)換成BlockingObservable,在將BlockingObservable轉(zhuǎn)換成一個(gè)Future。
observe():訂閱返回的Observable,并且立即開始執(zhí)行命令的邏輯。
toObservable():返回一個(gè)沒有改變的Observable,你必須訂閱它,它才能夠開始執(zhí)行命令的邏輯。
上述就是整個(gè)Hystrix的工作流程,當(dāng)然沒有很深入的講解,但是還是建議多看幾遍,我面試的時(shí)候碰到好幾次讓我簡述Hystrix工作流程,多看幾遍,記在心里,面試不慌。
當(dāng)然了,Hystrix也能和Feign 和 Zuul 的集成使用,這些在這里就不贅述了,后續(xù)介紹Feign和Zuul的文章中會詳細(xì)說明。
本文主要介紹HystrixCommand 注解方式的使用。
首先我們搭建一個(gè)HystrixClient項(xiàng)目。
添加配置文件application.properties

新建RestConfiguration類,用來全局配置RestTemplate。

新建HystrixController類
然后在啟動類的上添加@EnableHystrix注解。

改造上一篇萬字詳解Ribbon架構(gòu),針對面試高頻題多角度細(xì)說Ribbon中提供的OrderService,讓代碼休眠5秒后在返回。
在HystrixController中的三個(gè)方法中分別配置了2000ms,10000ms,10000ms如果沒有返回結(jié)果,那么將直接回調(diào)用我們指定的fallback。
OrderService

上述三步,基本的Hystrix使用框架就搭建完成了,然后我們啟動上一篇萬字詳解Ribbon架構(gòu),針對面試高頻題多角度細(xì)說Ribbon中提到的Eureka-Server,并按照上篇文章的啟動方式,分別啟動OrderServeice的7777,8888,9999三個(gè)端口,此時(shí)我們打開 http://localhost:8761/ 頁面,我們發(fā)現(xiàn)已經(jīng)有三個(gè)服務(wù)名為order-service,端口號分別7777,8888,9999的服務(wù)注冊了進(jìn)來。

最后我們啟動HystrixClient啟動類,然后我們先訪問設(shè)置超時(shí)時(shí)間為10000ms的 localhost:8088/test2 ,因?yàn)槲覀冊贠rderService中設(shè)置的休眠時(shí)間為3000ms所以能在超時(shí)時(shí)間內(nèi)返回請求,所以不用調(diào)用fallback。
Execution相關(guān)的屬性的配置
hystrix.command.default.execution.isolation.strategy
隔離策略,默認(rèn)是Thread, 可選Thread,Semaphore
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
命令執(zhí)行超時(shí)時(shí)間,默認(rèn)1000ms。
hystrix.command.default.execution.timeout.enabled
執(zhí)行是否啟用超時(shí),默認(rèn)啟用true。
hystrix.command.default.execution.isolation.thread.interruptOnTimeout
發(fā)生超時(shí)是是否中斷,默認(rèn)true。
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests
理論上選擇semaphore size的原則和選擇thread size一致,但選用semaphore時(shí)每次執(zhí)行的單元要比較小且執(zhí)行速度快(ms級別),否則的話應(yīng)該用thread。semaphore應(yīng)該占整個(gè)容器(tomcat)的線程池的一小部分。
Fallback相關(guān)配置
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests
如果并發(fā)數(shù)達(dá)到該設(shè)置值,請求會被拒絕和拋出異常并且fallback不會被調(diào)用。默認(rèn)10。
hystrix.command.default.fallback.enabled
當(dāng)執(zhí)行失敗或者請求被拒絕,是否會嘗試調(diào)用hystrixCommand.getFallback() 。默認(rèn)true。
Metrics相關(guān)屬性配置
hystrix.command.default.metrics.rollingStats.timeInMilliseconds
設(shè)置統(tǒng)計(jì)的時(shí)間窗口值的,毫秒值,circuit break 的打開會根據(jù)1個(gè)rolling window的統(tǒng)計(jì)來計(jì)算。若rolling window被設(shè)為10000毫秒,則rolling window會被分成n個(gè)buckets,每個(gè)bucket包含success,failure,timeout,rejection的次數(shù)的統(tǒng)計(jì)信息。默認(rèn)10000。
hystrix.command.default.metrics.rollingStats.numBuckets
設(shè)置一個(gè)rolling window被劃分的數(shù)量,若numBuckets=10,rolling window=10000,那么一個(gè)bucket的時(shí)間即1秒。必須符合rolling window % numberBuckets == 0。默認(rèn)10。
hystrix.command.default.metrics.rollingPercentile.enabled
執(zhí)行時(shí)是否enable指標(biāo)的計(jì)算和跟蹤,默認(rèn)true。
hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds
設(shè)置rolling percentile window的時(shí)間,默認(rèn)60000。
hystrix.command.default.metrics.rollingPercentile.numBuckets
設(shè)置rolling percentile window的numberBuckets。邏輯同上。默認(rèn)6。
hystrix.command.default.metrics.rollingPercentile.bucketSize
如果bucket size=100,window=10s,若這10s里有500次執(zhí)行,只有最后100次執(zhí)行會被統(tǒng)計(jì)到bucket里去。增加該值會增加內(nèi)存開銷以及排序的開銷。默認(rèn)100。
hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds
記錄health 快照(用來統(tǒng)計(jì)成功和錯誤綠)的間隔,默認(rèn)500ms。
ThreadPool 相關(guān)屬性配置
hystrix.threadpool.default.coreSize
并發(fā)執(zhí)行的最大線程數(shù),默認(rèn)10。
hystrix.threadpool.default.maxQueueSize
BlockingQueue的最大隊(duì)列數(shù),當(dāng)設(shè)為-1,會使用SynchronousQueue,值為正時(shí)使用LinkedBlcokingQueue。該設(shè)置只會在初始化時(shí)有效,之后不能修改threadpool的queue size,除非reinitialising thread executor。默認(rèn)-1。
hystrix.threadpool.default.queueSizeRejectionThreshold
即使maxQueueSize沒有達(dá)到,達(dá)到queueSizeRejectionThreshold該值后,請求也會被拒絕。因?yàn)閙axQueueSize不能被動態(tài)修改,這個(gè)參數(shù)將允許我們動態(tài)設(shè)置該值。if maxQueueSize == -1,該字段將不起作用。
hystrix.threadpool.default.keepAliveTimeMinutes
如果corePoolSize和maxPoolSize設(shè)成一樣(默認(rèn)實(shí)現(xiàn))該設(shè)置無效。
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds
線程池統(tǒng)計(jì)指標(biāo)的時(shí)間,默認(rèn)10000。
hystrix.threadpool.default.metrics.rollingStats.numBuckets
將rolling window劃分為n個(gè)buckets,默認(rèn)10。
1.什么是降級?
降級,通常指事務(wù)高峰期,為了保證核心服務(wù)正常運(yùn)行,需要停掉一些不太重要的業(yè)務(wù),或者某些服務(wù)不可用時(shí),執(zhí)行備用邏輯從故障服務(wù)中快速失敗或快速返回,以保障主體業(yè)務(wù)不受影響。
Hystrix提供的降級主要是為了容錯,保證當(dāng)前服務(wù)不受依賴服務(wù)故障的影響,從而提高服務(wù)的健壯性。
要支持回退或降級處理,可以重寫HystrixCommand的getFallBack方法或HystrixObservableCommand的resumeWithFallback方法。
2.什么情況下才會走降級?
從Hystrix的工作流程圖中我們可以看到以下情況會走降級邏輯。
1.斷路器打開
2.線程池或者信號量已經(jīng)滿了
3.command執(zhí)行異常
4.執(zhí)行超時(shí)
3.回退降級有哪些處理方式?
快速失敗:發(fā)生故障后直接拋出,不做處理。
無聲失敗:發(fā)生故障后,返回?zé)o意義內(nèi)容,如null,空Map等,故障會被屏蔽。
靜態(tài)失敗:這種配置下,發(fā)生故障會返回靜態(tài)的默認(rèn)值,如返回值是boolean,則結(jié)果為默認(rèn)true。
Stubbed:這種配置適用于返回值是一個(gè)復(fù)合對象的情形,發(fā)生故障時(shí),會手動創(chuàng)建一個(gè)復(fù)合對象的實(shí)例,實(shí)例中往往包含了一些默認(rèn)值或錯誤信息。
依賴緩存:這種情況下,當(dāng)下層服務(wù)故障時(shí),會從緩存中取得之前的舊數(shù)據(jù)供使用。
主次模式:這是回退降級的一種特殊使用方法。
主次模式解釋:
有時(shí)候,我們可能會遇到這樣的場景。針對某個(gè)業(yè)務(wù),可能會有兩種處理方案,A方案高效,但是沒有經(jīng)過規(guī)模化測試,不敢保證可靠性。B方案保守,雖然效率較低,但是不會出現(xiàn)。這時(shí)候,我們就可以嘗試采用主次模式。主流程基于A方案運(yùn)行,fallback基于B方案運(yùn)行。在運(yùn)行過程中,如不出錯,則一直使用A方案,一時(shí)出錯,可通過回退降級,迅速切換為B方案,以避免問題的不受控?cái)U(kuò)散。
什么是Hystrix Dashboard?
Hystrix提供了準(zhǔn)實(shí)時(shí)的調(diào)用監(jiān)控(Hystrix DashBoard),Hystrix會持續(xù)的記錄通過Hystrix發(fā)起的請求的執(zhí)行信息,以統(tǒng)計(jì)報(bào)表和圖形的形式展示給客戶,包括每秒執(zhí)行多少,請求多少成功,請求失敗多少等。
Netflix通過Hystrix-metics-event-stream項(xiàng)目實(shí)現(xiàn)了對以上指標(biāo)的監(jiān)控,SpringCloud也提供了Hystrix DashBoard的整合,對監(jiān)控內(nèi)容轉(zhuǎn)化成可視化的界面,以便于用戶能夠直接的看到服務(wù)和集群的狀態(tài),在實(shí)際使用中,我們往往還要結(jié)合Turbine來使用。
開始搭建Hystrix Dashboard
Hystrix Dashboard的搭建其實(shí)很簡單,分為三步:
創(chuàng)建監(jiān)控Hystrix Dashboard項(xiàng)目模塊
配置application.yml
配置啟動類
首先我們創(chuàng)建一個(gè)HystrixDashboard項(xiàng)目,配置pom.xml文件如下

配置端口為9001
server.port = 9001
配置啟動類,添加@EnableHystrixDashboard注解

啟動后訪問http://localhost:9001/hystrix只要我們能看到一只豪豬就說明啟動成功了。

感謝各位的閱讀,以上就是“何為Hystrix”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對何為Hystrix這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
文章標(biāo)題:何為Hystrix
本文來源:http://www.chinadenli.net/article22/giddcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、定制網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)