Spring Cloud Hystrix(斷路器)

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

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

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

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

斷路器本身是一種開(kāi)關(guān)保護(hù)機(jī)制,類似于保險(xiǎn)絲,用于在電路上保護(hù)線路過(guò)載,當(dāng)線路中有電器發(fā)生短路時(shí),斷路器能夠及時(shí)切斷故障電路,防止發(fā)生過(guò)載、發(fā)熱甚至起火等嚴(yán)重后果。
  在分布式架構(gòu)中,斷路器模式的作用也是類似的。
  針對(duì)上述問(wèn)題,Spring Cloud Hystrix 實(shí)現(xiàn)了斷路器、線路隔離等一系列服務(wù)保護(hù)功能。它也是基于 Netflix 的開(kāi)源框架 Hystrix 實(shí)現(xiàn)的,該框架的目標(biāo)在于通過(guò)控制那些訪問(wèn)遠(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è)試
訪問(wèn)http://localhost:9999/consumer
關(guān)閉掉8082的實(shí)例,再刷新服務(wù)的時(shí)候可以看到

image.png

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

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

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

引入Spring Cloud Hystrix的依賴

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

使用 @EnableCircuitBreaker 注解開(kāi)啟斷路器功能

@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)順序沒(méi)要求
啟動(dòng)完后我們?cè)L問(wèn)http://localhost:9999/consumer
關(guān)閉掉8082的實(shí)例,再刷新服務(wù)的時(shí)候可以看到

image.png

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

使用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注解開(kāi)啟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ì)過(guò)程中,最主要的是用到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

完成上述配置后,訪問(wèn)http://localhost:9999/hystrix可以看到小熊界面說(shuō)明配置成功

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ù)還沒(méi)調(diào)用
image.png

下面來(lái)訪問(wèn)下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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容