Spring Cloud Hystrix(斷路器)

Hystrix:熔斷器朝刊,容錯(cuò)管理工具耀里,旨在通過熔斷機(jī)制控制服務(wù)和第三方庫(kù)的節(jié)點(diǎn),從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。

github地址:https://github.com/Netflix/hystrix

微服務(wù)存在的問題

在微服務(wù)架構(gòu)中拾氓,我們將系統(tǒng)拆分為很多個(gè)服務(wù)冯挎,各個(gè)服務(wù)之間通過注冊(cè)與訂閱的方式相互依賴,由于各個(gè)服務(wù)都是在各自的進(jìn)程中運(yùn)行咙鞍,就有可能由于網(wǎng)絡(luò)原因或者服務(wù)自身的問題導(dǎo)致調(diào)用故障或延遲房官,隨著服務(wù)的積壓,可能會(huì)導(dǎo)致服務(wù)崩潰续滋。為了解決這一系列的問題易阳,斷路器等一系列服務(wù)保護(hù)機(jī)制出現(xiàn)了。

斷路器本身是一種開關(guān)保護(hù)機(jī)制吃粒,類似于保險(xiǎn)絲潦俺,用于在電路上保護(hù)線路過載,當(dāng)線路中有電器發(fā)生短路時(shí),斷路器能夠及時(shí)切斷故障電路事示,防止發(fā)生過載早像、發(fā)熱甚至起火等嚴(yán)重后果。
  在分布式架構(gòu)中肖爵,斷路器模式的作用也是類似的卢鹦。
  針對(duì)上述問題,Spring Cloud Hystrix 實(shí)現(xiàn)了斷路器劝堪、線路隔離等一系列服務(wù)保護(hù)功能冀自。它也是基于 Netflix 的開源框架 Hystrix 實(shí)現(xiàn)的,該框架的目標(biāo)在于通過控制那些訪問遠(yuǎn)程系統(tǒng)秒啦、服務(wù)和第三方庫(kù)的節(jié)點(diǎn)熬粗,從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。Hystrix 具備服務(wù)降級(jí)余境、服務(wù)熔斷驻呐、線程和信號(hào)隔離、請(qǐng)求緩存芳来、請(qǐng)求合并以及服務(wù)監(jiān)控等強(qiáng)大功能含末。
官方完整文檔,操作詳細(xì)信息和其他信息:https://github.com/Netflix/Hystrix/wiki
API文檔:https://netflix.github.io/Hystrix/javadoc/

場(chǎng)景展現(xiàn)

在上一篇文章Ribbon(消費(fèi)者)的基礎(chǔ)下測(cè)試
訪問http://localhost:9999/consumer
關(guān)閉掉8082的實(shí)例即舌,再刷新服務(wù)的時(shí)候可以看到

image.png

端口為8082服務(wù)掛掉了并顯示出錯(cuò)誤信息
這樣的顯示對(duì)于用戶來說是十分不好的佣盒,這樣就需要引入斷路器

實(shí)現(xiàn)斷路器Hystrix

本次是在上一篇Ribbon(消費(fèi)者)的工程上搭建的
http://www.reibang.com/p/ede7aae5d78e

引入Spring Cloud Hystrix的依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

使用 @EnableCircuitBreaker 注解開啟斷路器功能

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class SpringcloudConsumerRibbonApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudConsumerRibbonApplication.class, args);
    }
}

Controller調(diào)用方法的method加上@HystrixCommand注解,聲明依賴服務(wù)調(diào)用延遲或失敗時(shí)調(diào)用的方法

@RestController
public class RibbonController {
    @Autowired
    RestTemplate restTemplate;
    @GetMapping("/consumer")
    @HystrixCommand(fallbackMethod ="Failback")
    public String getMsg() {

        return restTemplate.getForObject("http://springcloud-eureka-client/client", String.class);
    }
    public String Failback(){
        return "服務(wù)中斷連接顽聂,請(qǐng)聯(lián)系管理員";
    }
}

配置文件可以不用改(有需要設(shè)置參數(shù)的可以參考文章下方的推薦文章)

整體項(xiàng)目結(jié)構(gòu)(基本上可Ribbon的一樣)

Eureka服務(wù)端 端口號(hào)是9090
兩個(gè)Eureka客戶端 端口號(hào)分別是8081和8082 相同的服務(wù)名springcloud-eureka-client
Ribbon消費(fèi)者客戶端 端口號(hào)是9999

啟動(dòng)服務(wù)進(jìn)行測(cè)試

先啟動(dòng)服務(wù)端再啟動(dòng)客戶端肥惭,客戶端啟動(dòng)順序沒要求
啟動(dòng)完后我們?cè)L問http://localhost:9999/consumer
關(guān)閉掉8082的實(shí)例,再刷新服務(wù)的時(shí)候可以看到

image.png

設(shè)置的服務(wù)中斷回調(diào)方法使用了芜飘,說明斷路器生效了

使用Hystrix-Dashboard實(shí)現(xiàn)hystrix服務(wù)監(jiān)控功能

github地址:https://github.com/Netflix-Skunkworks/hystrix-dashboard
hystrix還提供了服務(wù)監(jiān)控功能务豺,可以監(jiān)控服務(wù)消費(fèi)者的接口調(diào)用狀態(tài)磨总,但返回的監(jiān)控?cái)?shù)據(jù)為json數(shù)據(jù)嗦明,不適合我們查看,因此需要我們搭建hystrix-dashboard服務(wù)蚪燕,把json數(shù)據(jù)整理為圖形化數(shù)據(jù)

1.引入hystrix-dashboard依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

2.在主類中添加@EnableHystrixDashboard注解開啟Hystrix儀表盤

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableHystrixDashboard
public class SpringcloudConsumerRibbonApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudConsumerRibbonApplication.class, args);
    }
}

3.配置hystrix-metrics-event-stream
在整個(gè)監(jiān)控統(tǒng)計(jì)過程中娶牌,最主要的是用到hystrix-metrics-event-stream
hystrix-metrics-event-stream:只要客戶端連接還連著,hystrix-metrics-event-stream就會(huì)不斷的向客戶端以text/event-stream的形式推送計(jì)數(shù)結(jié)果(metrics)

使用hystrix-metrics-event-stream需要寫個(gè)配置類

@Configuration
public class HystrixMetricsStreamConfig {
    @Bean
    public HystrixMetricsStreamServlet hystrixMetricsStreamServlet(){
        return new HystrixMetricsStreamServlet();
    }

    @Bean
    public ServletRegistrationBean registration(HystrixMetricsStreamServlet servlet){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean();
        registrationBean.setServlet(servlet);
        registrationBean.setEnabled(true);
        registrationBean.addUrlMappings("/hystrix.stream");
        return registrationBean;
    }
}

加上@Configuration注解聲明為配置類
配置類中默認(rèn)的監(jiān)控路徑是/hystrix.stream

如果不寫的話是監(jiān)控不了的


image.png

完成上述配置后馆纳,訪問http://localhost:9999/hystrix可以看到小熊界面說明配置成功

image.png

輸入監(jiān)控的streamtitle诗良,點(diǎn)擊Monitor Stream,便會(huì)出現(xiàn)圖形化的監(jiān)控頁(yè)面鲁驶。
一般只需要填入監(jiān)控地址就可以了鉴裹,例如需要監(jiān)控端口號(hào)為9999的服務(wù)
就填入http://localhost:9999/hystrix.stream

image.png

點(diǎn)擊Monitor Stream,進(jìn)去都看到Loading...,因?yàn)槎丝?999的服務(wù)還沒調(diào)用
image.png

下面來訪問下http://localhost:9999/consumer
image.png

便會(huì)出現(xiàn)圖形化的監(jiān)控頁(yè)面径荔,這樣就實(shí)現(xiàn)了監(jiān)控的效果了督禽。

推薦文章:
關(guān)于Hystrix和Hystrix-Dashboard各種配置參數(shù)可以參考:https://blog.csdn.net/tongtong_use/article/details/78611225
關(guān)于hystrix-metrics-event-stream源碼解析的可以參考https://www.cnblogs.com/zhangwanhua/p/7904625.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市总处,隨后出現(xiàn)的幾起案子狈惫,更是在濱河造成了極大的恐慌,老刑警劉巖鹦马,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胧谈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荸频,警方通過查閱死者的電腦和手機(jī)菱肖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來试溯,“玉大人蔑滓,你說我怎么就攤上這事∮鼋剩” “怎么了键袱?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摹闽。 經(jīng)常有香客問我蹄咖,道長(zhǎng),這世上最難降的妖魔是什么付鹿? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任澜汤,我火速辦了婚禮躏筏,結(jié)果婚禮上廊敌,老公的妹妹穿的比我還像新娘。我一直安慰自己钠导,他們只是感情好坐梯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布徽诲。 她就那樣靜靜地躺著,像睡著了一般吵血。 火紅的嫁衣襯著肌膚如雪谎替。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天蹋辅,我揣著相機(jī)與錄音钱贯,去河邊找鬼。 笑死侦另,一個(gè)胖子當(dāng)著我的面吹牛秩命,可吹牛的內(nèi)容都是我干的尉共。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼弃锐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼爸邢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拿愧,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤杠河,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浇辜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體券敌,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年柳洋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了待诅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熊镣,死狀恐怖卑雁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绪囱,我是刑警寧澤测蹲,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站鬼吵,受9級(jí)特大地震影響扣甲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜齿椅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一琉挖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涣脚,春花似錦示辈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至妙同,卻和暖如春射富,著一層夾襖步出監(jiān)牢的瞬間膝迎,已是汗流浹背粥帚。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留限次,地道東北人芒涡。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓柴灯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親费尽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赠群,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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