1. Hystrix是誰?
Hystrix源于Netflix API團隊在2011年啟動的彈性工程工作,而目前它在Netflix每天處理著數(shù)百億的隔離線程以及數(shù)千億的隔離信號調(diào)用。該庫旨在通過控制那些訪問遠程系統(tǒng)、服務和第三方庫的節(jié)點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。
目前托管在github上。
在大中型分布式系統(tǒng)中,通常系統(tǒng)很多依賴(HTTP,Dubbo等),如果一個應用不能對來自依賴的故障進行有效處理,那該應用本身就處在被拖垮的風險中。在一個高流量的網(wǎng)站中,某個單一的后端一旦發(fā)生延遲,將會在數(shù)秒內(nèi)導致所有應用資源被耗盡。
例如:一個依賴30個服務的系統(tǒng),每個服務99.99%可用。
此系統(tǒng)的失敗率為1-99.99%的30次方 ≈ 0.3%
意味著一億次請求 會有 3,000,00次失敗
隨著服務依賴數(shù)量的變多,服務不穩(wěn)定的概率會成指數(shù)性提高.
Hystrix把服務調(diào)用統(tǒng)稱為依賴調(diào)用, Hystrix通過命令模式封裝依賴調(diào)用,每一個依賴調(diào)用封裝在HystrixCommand中,每個命令在Hystrix的線程池中運行。另外可以對其配置分組名、線程組,使得不同的依賴可以分類在不同的線程組,隔離不同模塊的依賴,也可根據(jù)負載情況,配置不同組的線程數(shù)。Hystrix還提供一種熔斷器(CircuitBreaker)的機制,Hystrix可以通過設定的條件判斷該封裝的依賴調(diào)用是否可以正確調(diào)用,如果在一定時間內(nèi)調(diào)用失敗次數(shù)過多,則會熔斷自身,使得相同的調(diào)用無法執(zhí)行,待冷卻之后重新再試。
3. 如何使用?1.pom.xml中加入依賴
com.netflix.hystrix hystrix-core ${hystrix.version}
2.繼承HystrixCommand,在run()方法中完成對依賴的調(diào)用:
public class CustomeCommand extends HystrixCommandHystxixCommand支持如下的配置:{ protected CustomeCommand(String input) { //設置HystrixCommand的屬性 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomeGroup")) .andCommandKey(HystrixCommandKey.Factory.asKey("CustomeKey")) .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("CustomeThreadPool")) .andCommandPropertiesDefaults(HystrixCommandProperties.Setter() .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)) .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter() .withCoreSize(10)) ); } @Override protected String run() throws Exception { //訪問真正的服務 return "hello World!"; } //服務降級 @Override protected String getFallback() { return "exeucute Falled"; } //請求緩存 @Override protected String getCacheKey() { // } }
GroupKey:該命令屬于哪一個組,可以幫助我們更好的組織命令。
CommandKey:該命令的名稱
ThreadPoolKey:該命令所屬線程池的名稱,同樣配置的命令會共享同一線程池,若不配置,會默認使用GroupKey作為線程池名稱。
CommandProperties:該命令的一些設置,包括斷路器的配置,隔離策略,降級設置,以及一些監(jiān)控指標等。
ThreadPoolProerties:關(guān)于線程池的配置,包括線程池大小,排隊隊列的大小等。
3.調(diào)用HystrixCommand
CustomeCommand command = new CustomeCommand(); String result = command.execute();HystrixCommand提供了3種執(zhí)行方式:
同步執(zhí)行:即一旦開始執(zhí)行該命令,當前線程就得阻塞著直到該命令返回結(jié)果,然后才能繼續(xù)執(zhí)行下面的邏輯。當調(diào)用命令的execute()方法即為同步執(zhí)行(內(nèi)部使用queue().get() )。
異步執(zhí)行:命令開始執(zhí)行會返回一個Future
CustomeCommand command = new CustomeCommand(); Futureresult = command.queue(); while (!result.isDone()){ System.out.println("Do other things ..."); }
響應式執(zhí)行:命令開始執(zhí)行會返回一個Observable
CustomeCommand command = new CustomeCommand(); Observableresult = command.observe(); result.subscribe(new Action1 () { @Override public void call(String str) { logger.info("Command called. Result is:{}", str); } });
或
CustomeCommand command = new CustomeCommand(); Observable4. Hystrix監(jiān)控result = command.observe(); result.subscribe(new Observer () { @Override public void onCompleted() { logger.info("Command Completed"); } @Override public void onError(Throwable e) { logger.error("Command failed", e); } @Override public void onNext(String args) { logger.info("Command finish,result is {}", args); } }); }
Hystrix還提供給我們一個監(jiān)控功能Hystrix-dashboard,可以直接使用其開源項目進行配置,就能實時的觀察我們的服務調(diào)用情況。
1.構(gòu)建dashboard項目
Shell代碼 收藏代碼
$ git clone https://github.com/Netflix/Hy...
$ cd Hystrix/hystrix-dashboard
$ ../gradlew jettyRun
打開路徑:http://localhost:7979/hystrix...
2.配置服務狀態(tài)上報
HystrixMetricsStreamServlet HystrixMetricsStreamServlet com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet HystrixMetricsStreamServlet /hystrix.stream
3.添加stream
在hystrix-dashboard中按照說明添加自己的 http://hystrix-app:port/hystr... ,然后監(jiān)視
4.如果是集群,通過turbine進行監(jiān)視
https://github.com/Netflix/Hy...
http://ningandjiao.iteye.com/...
http://fobject.iteye.com/blog...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/70329.html
摘要:斷路器本身是一種開關(guān)裝置,用于在電路上保護線路過載,當線路中有電器發(fā)生短路時,斷路器能夠及時的切斷故障電路,防止發(fā)生過載發(fā)熱甚至起火等嚴重后果。具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。 轉(zhuǎn)載請注明出處 http://www.paraller.com 代碼機制:熔斷 & Fallback & 資源隔離 熔斷 概念: 在微服務架構(gòu)中,我們將系...
摘要:以下示例顯示了具有斷路器的最小服務器由名為的庫提供,在連接到斷路器的代理中自動包裝帶有該注解的,斷路器計算何時打開和關(guān)閉電路以及在發(fā)生故障時應采取的措施。上一篇服務發(fā)現(xiàn)下一篇超時和客戶端 斷路器:Hystrix客戶端 Netflix創(chuàng)建了一個名為Hystrix的庫,用于實現(xiàn)斷路器模式,在微服務架構(gòu)中,通常有多層服務調(diào)用,如以下示例所示: 較低級別的服務中的服務故障可能導致級聯(lián)故障一直到...
摘要:傳播安全上下文或使用,通過增加的屬性,來增加相關(guān)的配置來達到執(zhí)行隔離策略,控制線程數(shù)或者控制并發(fā)請求數(shù)來達到熔斷降級的作用。 SpringCloud(第 015 篇)電影Ribbon微服務集成Hystrix增加隔離策略控制線程數(shù)或請求數(shù)來達到熔斷降級的作用 - 一、大致介紹 1、本章節(jié)介紹關(guān)于Hystrix的2種隔離方式(Thread Pool 和 Semaphores); 2、Thr...
摘要:要運行儀表板,請使用注解主類,然后訪問并將儀表板指向客戶端應用程序中的單個實例的端點。連接到使用的端點時,必須信任服務器使用的證書,如果證書不受信任,則必須將證書導入,以便儀表板成功連接到流端點。 Hystrix超時和Ribbon客戶端 使用包裝Ribbon客戶端的Hystrix命令時,要確保將Hystrix超時配置為長于配置的Ribbon超時,包括可能進行的任何可能的重試,例如,如果...
摘要:棧長得到消息,停止開發(fā)了。。。是一個輕量級的容錯組件,其靈感來自于,主要為和函數(shù)式編程設計的看到這里,棧長表示學不動了。。。上面說了,官方推薦替代的開源組件,這個棧長也沒有用過,查了下,資料也比較稀少。 showImg(https://segmentfault.com/img/remote/1460000017201104?w=1600&h=1066); 棧長得到消息,Hystrix ...
閱讀 1623·2023-04-26 01:36
閱讀 2786·2021-10-08 10:05
閱讀 2835·2021-08-05 09:57
閱讀 1589·2019-08-30 15:52
閱讀 1253·2019-08-30 14:12
閱讀 1378·2019-08-30 11:17
閱讀 3185·2019-08-29 13:07
閱讀 2505·2019-08-29 12:35