Spring Cloud(五)斷路器監(jiān)控(Hystrix Dashboard)

2019-04-17 13:56 更新

在上兩篇文章中講了,服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者 Feign,服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者(rest + Ribbon),本篇文章結(jié)合,上兩篇文章中代碼進(jìn)行修改加入 斷路器監(jiān)控(Hystrix Dashboard)

在微服務(wù)架構(gòu)中,根據(jù)業(yè)務(wù)來拆分成一個(gè)個(gè)的服務(wù),服務(wù)與服務(wù)之間可以相互調(diào)用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調(diào)用。為了保證其高可用,單個(gè)服務(wù)通常會(huì)集群部署。由于網(wǎng)絡(luò)原因或者自身的原因,服務(wù)并不能保證100%可用,如果單個(gè)服務(wù)出現(xiàn)問題,調(diào)用這個(gè)服務(wù)就會(huì)出現(xiàn)線程阻塞,此時(shí)若有大量的請求涌入,Servlet容器的線程資源會(huì)被消耗完畢,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)之間的依賴性,故障會(huì)傳播,會(huì)對整個(gè)微服務(wù)系統(tǒng)造成災(zāi)難性的嚴(yán)重后果,這就是服務(wù)故障的“雪崩”效應(yīng)。

針對上述問題,在Spring Cloud Hystrix中實(shí)現(xiàn)了線程隔離、斷路器等一系列的服務(wù)保護(hù)功能。它也是基于Netflix的開源框架 Hystrix實(shí)現(xiàn)的,該框架目標(biāo)在于通過控制那些訪問遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫的節(jié)點(diǎn),從而對延遲和故障提供更強(qiáng)大的容錯(cuò)能力。Hystrix具備了服務(wù)降級(jí)、服務(wù)熔斷、線程隔離、請求緩存、請求合并以及服務(wù)監(jiān)控等強(qiáng)大功能。

什么是斷路器

斷路器模式源于Martin Fowler的Circuit Breaker一文?!皵嗦菲鳌北旧硎且环N開關(guān)裝置,用于在電路上保護(hù)線路過載,當(dāng)線路中有電器發(fā)生短路時(shí),“斷路器”能夠及時(shí)的切斷故障電路,防止發(fā)生過載、發(fā)熱、甚至起火等嚴(yán)重后果。

在分布式架構(gòu)中,斷路器模式的作用也是類似的,當(dāng)某個(gè)服務(wù)單元發(fā)生故障(類似用電器發(fā)生短路)之后,通過斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)錯(cuò)誤響應(yīng),而不是長時(shí)間的等待。這樣就不會(huì)使得線程因調(diào)用故障服務(wù)被長時(shí)間占用不釋放,避免了故障在分布式系統(tǒng)中的蔓延。

斷路器示意圖

SpringCloud Netflix實(shí)現(xiàn)了斷路器庫的名字叫Hystrix. 在微服務(wù)架構(gòu)下,通常會(huì)有多個(gè)層次的服務(wù)調(diào)用. 下面是微服架構(gòu)下, 瀏覽器端通過API訪問后臺(tái)微服務(wù)的一個(gè)示意圖:

 hystrix 1

一個(gè)微服務(wù)的超時(shí)失敗可能導(dǎo)致瀑布式連鎖反映,下圖中,Hystrix通過自主反饋實(shí)現(xiàn)的斷路器, 防止了這種情況發(fā)生。

 hystrix 2

圖中的服務(wù)B因?yàn)槟承┰蚴。兊貌豢捎?,所有對服?wù)B的調(diào)用都會(huì)超時(shí)。當(dāng)對B的調(diào)用失敗達(dá)到一個(gè)特定的閥值(5秒之內(nèi)發(fā)生20次失敗是Hystrix定義的缺省值), 鏈路就會(huì)被處于open狀態(tài), 之后所有所有對服務(wù)B的調(diào)用都不會(huì)被執(zhí)行, 取而代之的是由斷路器提供的一個(gè)表示鏈路open的Fallback消息. Hystrix提供了相應(yīng)機(jī)制,可以讓開發(fā)者定義這個(gè)Fallbak消息.

open的鏈路阻斷了瀑布式錯(cuò)誤, 可以讓被淹沒或者錯(cuò)誤的服務(wù)有時(shí)間進(jìn)行修復(fù)。這個(gè)fallback可以是另外一個(gè)Hystrix保護(hù)的調(diào)用, 靜態(tài)數(shù)據(jù),或者合法的空值. Fallbacks可以組成鏈?zhǔn)浇Y(jié)構(gòu),所以,最底層調(diào)用其它業(yè)務(wù)服務(wù)的第一個(gè)Fallback返回靜態(tài)數(shù)據(jù).

準(zhǔn)備工作

在開始加入斷路器之前,我們先拿之前兩篇博客,構(gòu)建的兩個(gè)微服務(wù)代碼為基礎(chǔ),進(jìn)行下面的操作

建議先閱讀以下兩篇文章

Spring Cloud(四) 服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者 Feign
Spring Cloud(三) 服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者(rest + Ribbon)

Eureka Service

導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)注冊中心

spring-cloud-eureka-service

Eureka Provider

導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)的提供者

spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3

Ribbon Hystrix

在 Ribbon中使用斷路器

修改項(xiàng)目

復(fù)制 spring-cloud-ribbon-consumer 項(xiàng)目,修改名稱為spring-cloud-ribbon-consumer-hystrix

添加依賴

在項(xiàng)目pom 加上hystrix的依賴

  1. <!-- hystrix 斷路器 -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-hystrix</artifactId>
  5. </dependency>

服務(wù)注冊

在程序的啟動(dòng)類 RibbonConsumerApplication 通過 @EnableHystrix 開啟 Hystrix 斷路器監(jiān)控

  1. package io.ymq.example.ribbon.consumer.hystrix;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  6. import org.springframework.cloud.netflix.hystrix.EnableHystrix;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.web.client.RestTemplate;
  9. @EnableHystrix
  10. @EnableDiscoveryClient
  11. @SpringBootApplication
  12. public class RibbonConsumerApplication {
  13. @LoadBalanced
  14. @Bean
  15. RestTemplate restTemplate() {
  16. return new RestTemplate();
  17. }
  18. public static void main(String[] args) {
  19. SpringApplication.run(RibbonConsumerApplication.class, args);
  20. }
  21. }

消費(fèi)提供者方法

修改 ConsumerController 類的,hello 方法,加上注解@HystrixCommand(fallbackMethod = "defaultStores") 該注解對該方法創(chuàng)建了熔斷器的功能 ,并指定了defaultStores熔斷方法,熔斷方法直接返回了一個(gè)字符串, "feign + hystrix ,提供者服務(wù)掛了"

@HystrixCommand 表明該方法為hystrix包裹,可以對依賴服務(wù)進(jìn)行隔離、降級(jí)、快速失敗、快速重試等等hystrix相關(guān)功能 該注解屬性較多,下面講解其中幾個(gè)

  • fallbackMethod 降級(jí)方法
  • commandProperties 普通配置屬性,可以配置HystrixCommand對應(yīng)屬性,例如采用線程池還是信號(hào)量隔離、熔斷器熔斷規(guī)則等等
  • ignoreExceptions 忽略的異常,默認(rèn)HystrixBadRequestException不計(jì)入失敗
  • groupKey() 組名稱,默認(rèn)使用類名稱
  • commandKey 命令名稱,默認(rèn)使用方法名

  1. package io.ymq.example.ribbon.consumer.hystrix;
  2. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import org.springframework.web.client.RestTemplate;
  7. /**
  8. * 描述:調(diào)用提供者的 `home` 方法
  9. *
  10. * @author yanpenglei
  11. * @create 2017-12-05 18:53
  12. **/
  13. @RestController
  14. public class ConsumerController {
  15. @Autowired
  16. private RestTemplate restTemplate;
  17. @HystrixCommand(fallbackMethod = "defaultStores")
  18. @GetMapping(value = "/hello")
  19. public String hello() {
  20. return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody();
  21. }
  22. public String defaultStores() {
  23. return "Ribbon + hystrix ,提供者服務(wù)掛了";
  24. }
  25. }

測試斷路器

依次啟動(dòng)項(xiàng)目:

spring-cloud-eureka-service
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-ribbon-consumer-hystrix

啟動(dòng)該工程后,訪問服務(wù)注冊中心,查看服務(wù)是否都已注冊成功:http://localhost:8761/

查看各個(gè)服務(wù)注冊狀態(tài)

在命令窗口curl http://localhost:9000/hello,發(fā)現(xiàn)一切正常

或者瀏覽器get 請求http://localhost:9000/hello F5 刷新

eureka-provider 提供者服務(wù)響應(yīng)

停止 spring-cloud-eureka-provider-1 提供者,端口為:8081服務(wù)

再次訪問命令窗口curl http://localhost:9000/hello ,斷路器已經(jīng)生效,提示:Ribbon + hystrix ,提供者服務(wù)掛了

Ribbon + hystrix ,提供者服務(wù)掛了

Feign Hystrix

在 Feign中使用斷路器

修改項(xiàng)目

復(fù)制spring-cloud-feign-consumer 項(xiàng)目,修改名稱為spring-cloud-feign-consumer-hystrix

添加依賴

Feign是自帶斷路器的,如果在Dalston版本的Spring Cloud中,它沒有默認(rèn)打開。需要需要在配置文件中配置打開它,本項(xiàng)目我們是不需要打開的

  1. feign:
  2. hystrix:
  3. enabled: true

服務(wù)注冊

修改 HomeClient類 ,@FeignClient 注解,加上fallbackFactory指定新建的HystrixClientFallbackFactory 工廠類

在程序的啟動(dòng)類 RibbonConsumerApplication 通過 @EnableHystrix 開啟 Hystrix

  1. package io.ymq.example.feign.consumer.hystrix;
  2. import org.springframework.cloud.netflix.feign.FeignClient;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. /**
  5. * 描述: 指定這個(gè)接口所要調(diào)用的 提供者服務(wù)名稱 "eureka-provider"
  6. *
  7. * @author yanpenglei
  8. * @create 2017-12-06 15:13
  9. **/
  10. @FeignClient(value ="eureka-provider",fallbackFactory = HystrixClientFallbackFactory.class)
  11. public interface HomeClient {
  12. @GetMapping("/")
  13. String consumer();
  14. }

新加的類 HystrixClientFallbackFactory.java

  1. package io.ymq.example.feign.consumer.hystrix;
  2. import feign.hystrix.FallbackFactory;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * 描述:
  6. *
  7. * @author yanpenglei
  8. * @create 2017-12-07 20:37
  9. **/
  10. @Component
  11. public class HystrixClientFallbackFactory implements FallbackFactory<HomeClient> {
  12. @Override
  13. public HomeClient create(Throwable throwable) {
  14. return () -> "feign + hystrix ,提供者服務(wù)掛了";
  15. }
  16. }

測試斷路器

依次啟動(dòng)項(xiàng)目:

spring-cloud-eureka-service
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-feign-consumer-hystrix

啟動(dòng)該工程后,訪問服務(wù)注冊中心,查看服務(wù)是否都已注冊成功:http://localhost:8761/

查看各個(gè)服務(wù)注冊狀態(tài)

在命令窗口curl http://localhost:9000/hello,發(fā)現(xiàn)一切正常

或者瀏覽器get 請求http://localhost:9000/hello F5 刷新

eureka-provider 提供者服務(wù)響應(yīng)

停止 spring-cloud-eureka-provider-1 提供者,端口為:8081服務(wù)

再次訪問命令窗口curl http://localhost:9000/hello ,斷路器已經(jīng)生效,提示:Feign + hystrix ,提供者服務(wù)掛了

Feign + hystrix ,提供者服務(wù)掛了

Hystrix Dashboard

HD 簡介

Hystrix Dashboard在微服務(wù)架構(gòu)中為例保證程序的可用性,防止程序出錯(cuò)導(dǎo)致網(wǎng)絡(luò)阻塞,出現(xiàn)了斷路器模型。斷路器的狀況反應(yīng)了一個(gè)程序的可用性和健壯性,它是一個(gè)重要指標(biāo)。Hystrix Dashboard是作為斷路器狀態(tài)的一個(gè)組件,提供了數(shù)據(jù)監(jiān)控和友好的圖形化界面。

改造項(xiàng)目

復(fù)制項(xiàng)目 spring-cloud-ribbon-consumer-hystrix,修改名稱 spring-cloud-ribbon-consumer-hystrix-dashboard 在它的基礎(chǔ)上進(jìn)行改造。Feign的改造和這一樣。

pom的工程文件引入相應(yīng)的依賴:

添加依賴

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-hystrix</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
  12. </dependency>

開啟 HD

修改 RibbonConsumerApplication.java

在程序的入口RibbonConsumerApplication類,加上@EnableHystrix注解開啟斷路器,這個(gè)是必須的,并且需要在程序中聲明斷路點(diǎn)@HystrixCommand;加上@EnableHystrixDashboard注解,開啟HystrixDashboard

  1. package io.ymq.example.ribbon.consumer.hystrix;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  6. import org.springframework.cloud.netflix.hystrix.EnableHystrix;
  7. import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.web.client.RestTemplate;
  10. @EnableHystrix
  11. @EnableDiscoveryClient
  12. @EnableHystrixDashboard
  13. @SpringBootApplication
  14. public class RibbonConsumerApplication {
  15. @LoadBalanced
  16. @Bean
  17. RestTemplate restTemplate() {
  18. return new RestTemplate();
  19. }
  20. public static void main(String[] args) {
  21. SpringApplication.run(RibbonConsumerApplication.class, args);
  22. }
  23. }

聲明斷路點(diǎn)

聲明斷路點(diǎn) @HystrixCommand(fallbackMethod = "defaultStores")

  1. package io.ymq.example.ribbon.consumer.hystrix;
  2. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import org.springframework.web.client.RestTemplate;
  8. /**
  9. * 描述:調(diào)用提供者的 `home` 方法
  10. *
  11. * @author yanpenglei
  12. * @create 2017-12-05 18:53
  13. **/
  14. @RestController
  15. public class ConsumerController {
  16. @Autowired
  17. private RestTemplate restTemplate;
  18. @HystrixCommand(fallbackMethod = "defaultStores")
  19. @GetMapping(value = "/hello")
  20. public String hello() {
  21. return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody();
  22. }
  23. public String defaultStores() {
  24. return "feign + hystrix Dashboard ,提供者服務(wù)掛了";
  25. }
  26. }

@HystrixCommand 表明該方法為hystrix包裹,可以對依賴服務(wù)進(jìn)行隔離、降級(jí)、快速失敗、快速重試等等hystrix相關(guān)功能 該注解屬性較多,下面講解其中幾個(gè)

  • fallbackMethod 降級(jí)方法
  • commandProperties 普通配置屬性,可以配置HystrixCommand對應(yīng)屬性,例如采用線程池還是信號(hào)量隔離、熔斷器熔斷規(guī)則等等
  • ignoreExceptions 忽略的異常,默認(rèn)HystrixBadRequestException不計(jì)入失敗
  • groupKey() 組名稱,默認(rèn)使用類名稱
  • commandKey 命令名稱,默認(rèn)使用方法名

測試服務(wù)

依次啟動(dòng)項(xiàng)目:

spring-cloud-eureka-service
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-ribbon-consumer-hystrix-dashboard

啟動(dòng)該工程后,訪問服務(wù)注冊中心,查看服務(wù)是否都已注冊成功:http://localhost:8761/

查看各個(gè)服務(wù)注冊狀態(tài)

Hystrix Dashboard 監(jiān)控

可以訪問 http://127.0.0.1:9090/hystrix ,獲取Hystrix Dashboard信息,默認(rèn)最大打開5個(gè)終端獲取監(jiān)控信息,可以增加delay參數(shù)指定獲取監(jiān)控?cái)?shù)據(jù)間隔時(shí)間

在界面依次輸入:http://127.0.0.1:9000/hystrix.stream 、2000hello 點(diǎn)確定。可以訪問以下,圖形化監(jiān)控頁面

 Hystrix Dashboard

Hystrix Monitor 圖形化監(jiān)控頁面

 Hystrix  Monitor 圖形化監(jiān)控頁面

源碼下載

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-hystrix-dashboard

碼云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-hystrix-dashboard

Contact

  • 作者:鵬磊
  • 出處:http://www.souyunku.com
  • Email:admin@souyunku.com
  • 版權(quán)歸作者所有,轉(zhuǎn)載請注明出處
  • Wechat:關(guān)注公眾號(hào),搜云庫技術(shù)團(tuán)隊(duì),專注于開發(fā)技術(shù)的研究與知識(shí)分享

    關(guān)注公眾號(hào)-搜云庫

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)