SpringCloud 整合 Hystrix Dashboard 实现服务熔断可视化监控,实战讲解!
一、背景介绍
在上一篇文章中,我们介绍了 Spring Cloud 技术体系中最核心的组件之一 Hystrix,它主要作用是处理那些可能会失败并且需要被隔离的远程服务调用,以避免导致整个系统崩溃。
尽管 Hystrix 能很好的避免服务之间的调用失败出现全面崩溃,但是对于系统的运维工作依然有不小的挑战。例如哪些服务中的方法触发了熔断机制,如果有一个可视化的界面来监控这些信息,会让微服务的运维工作变得更加简单、高效。
今天通过这篇文章,结合之前的知识,我们一起来了解一下 Spring Cloud 技术体系中 Hystrix 组件相关的几款服务熔断监控工具。
二、Hystrix Dashboard 简介
Hystrix dashboard 是一个用于采集 Hystrix 组件数据的可视化工具。通过 Hystrix Dashboard 我们可以直观的看到各 Hystrix Command 的请求响应时间、错误率、并发数量等关键指标,让开发人员和运维人员可以即时了解系统的健康状况。
下面我们通过具体的例子,看看如何使用 Hystrix Dashboard 来实现服务熔断监控。
2.1、创建服务消费者
根据eureka-consumer-feign-hystrix
复制一个服务消费者工程,命名为eureka-consumer-hystrix-dashboard
,并在pom.xml
中引入 Hystrix Dashboard 依赖包,示例如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.2、开启 Hystrix dashboard 功能
然后,在服务启动类添加@EnableHystrixDashboard
和@EnableCircuitBreaker
注解,表示开启 Hystrix Dashboard 监控服务,示例如下:
@EnableHystrixDashboard
@EnableCircuitBreaker
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
2.3、添加配置文件
最后,在application.properties
配置文件中,开启 Feign 的熔断服务。
spring.application.name=eureka-consumer-hystrix-dashboard
server.port=9006
# 设置与Eureka Server交互的地址,多个地址可使用【,】分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
# 在Feign中开启 hystrix熔断
feign.hystrix.enabled=true
2.4、服务测试
完成以上工程之后,依次将eureka-server
、eureka-consumer-hystrix-dashboard
服务启动起来。
然后在浏览器上访问当前服务路径http://ip:port/hystrix
,例如http://localhost:9006/hystrix
,将会看到如下界面。

这是 Hystrix Dashboard 的监控首页,页面中并没有具体的监控信息。
不过,从页面的文字内容中我们可以知道,Hystrix Dashboard 共支持三种不同的监控方式,依次为:
- 默认的集群监控:通过
http://turbine-hostname:port/turbine.stream
开启,实现对默认集群的监控。 - 指定的集群监控:通过
http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
开启,实现对clusterName
集群的监控。 - 单体应用的监控:通过
http://hystrix-app:port/hystrix.stream
开启,实现对具体某个服务实例的监控。
前两者都是对集群的监控,需要整合 Turbine 才能实现,这部分内容我们会在下文中介绍;后者一个是针对单体应用的监控。
例如将http://localhost:9006/hystrix.stream
地址输入到URL
栏,即可实现对当前单个服务的熔断监控。点击monitor stream
,可以看到类似如下界面。

从监控面板上可以看到有两个重要的图形信息:一个实心圆和一条曲线。
- 实心圆:用于表示实例的健康程度。如上图所示,它的健康度从绿色、黄色、橙色、红色递减。该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,我们就可以在大量的实例中快速的发现故障实例和高压力实例
- 曲线:用来记录 2 分钟内流量的相对变化,我们可以通过它来观察到流量的上升和下降趋势。
其他一些数量指标含义,如下图所示:

更多的指标作用,可以参阅 Hystrix Dashboard 文档。
三、整合 Turbine
在上文中,我们介绍了使用 Hystrix Dashboard 来展示单个服务实例发生熔断时的各项度量指标。
实际上,为了保障服务高可用,在生产环境通常相同的服务会部署上十个节点。这个时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。为此,Netflix 提供了一个开源项目 Turbine,通过它可以把多个节点的hystrix.stream
内容聚合为一个数据源供 Hystrix Dashboard 展示。
下面我们通过具体的例子,看看如何使用 Turbine 来实现服务集群熔断监控。
3.1、创建服务消费者
根据eureka-consumer
复制一个服务消费者工程,命名为eureka-consumer-hystrix-turbine
,并在pom.xml
中引入 Turbine 依赖包,示例如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2、开启 Turbine 功能
然后,在服务启动类添加@EnableTurbine
和@EnableHystrixDashboard
注解,表示开启 Turbine 监控服务,示例如下:
@EnableTurbine
@EnableHystrixDashboard
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
3.3、添加配置文件
最后,在application.properties
配置文件中添加turbine
相关的信息,示例如下:
spring.application.name=eureka-consumer-hystrix-turbine
server.port=9007
# 设置与Eureka Server交互的地址,多个地址可使用【,】分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
# 指定需要收集监控信息的服务名,多个服务名称可使用【,】分隔
turbine.app-config=eureka-consumer-hystrix-dashboard
# 指定turbine集群名称
turbine.cluster-name-expression="default"
# 该参数可以让同一主机上的服务通过主机名与端口号的组合来进行区分,便于调试
turbine.combine-host-port=true
参数说明:
turbine.app-config
:用于指定需要收集监控信息的服务名,多个服务名称可使用英文逗号分隔;turbine.cluster-name-expression
:用于指定 Turbine 集群名称,默认为 default。当我们服务数量非常多的时候,可以启动多个 Turbine 服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在 Hystrix 仪表盘中用来定位不同的聚合集群,只需要在Hystrix Stream
的 URL 中通过cluster
参数来指定;turbine.combine-host-port
:参数设置为true
时,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以 host 来区分不同的服务;
3.4、服务测试
完成以上工程之后,依次将eureka-server
、eureka-consumer-hystrix-dashboard
、eureka-consumer-hystrix-turbine
服务启动起来。
然后在浏览器上访问http://localhost:9007/hystrix
,输入http://localhost:9007/turbine.stream
,将会看到如下界面。

可以将eureka-consumer-hystrix-dashboard
服务部署在不同的端口上,使用 turbine 进行监控会更加直观。
四、小结
最后再总结一下,Hystrix dashboard 是一个用于采集 Hystrix 组件数据的可视化工具。通过 Hystrix Dashboard 我们可以直观的看到各 Hystrix Command 的请求响应时间、错误率、并发数量等关键指标。借助 Turbine 工具,可以让更加直观的了解微服务集群中的服务熔断情况,以便于快速定位服务中的问题。
尽管之后 Netflix 宣布对其停止维护,但是 Hystrix Dashboard 仍然是一个值得学习和了解的重要微服务监控工具。
五、参考
1.https://www.didispace.com/spring-cloud/spring-cloud-starter-dalston-5-2.html
作者:潘志的技术笔记
出处:https://pzblog.cn/
版权归作者所有,转载请注明出处
