Hystrix仪表盘

在断路器原理介绍那篇文章中,我们学习了许多关于请求命令的度量指标的判断。这些度量指标都是HystrixCommand和HystrixObservableCommand实例在执行过程中记录的重要信息,它们除了在Hystrix断路器中使用之外,对于系统运维也是有极大的帮助。

这些指标信息会以“滚动时间窗”与“桶”结合的方式进行汇总,并在内存中驻留一段时间,以供内部或外部进行查询使用,Hystrix仪表盘可以显示这些指标信息,通过可视化的显示,可以让我们更加清楚知道系统的健康状况。Spring Cloud不仅整合了Hystrix,还整合了Hystrix的仪表盘组件Hystrix Dashboard,它主要用于实时监控Hystrix的各项指标信息。通过Hystrix Dashboard反馈的实时信息,可以帮助我们快递发现系统中存在的问题,从而及时地采取应对措施。

Hystrix仪表盘实例演示

学习使用Hystrix仪表盘对于开发和运维显得非常重要,因此本篇将从链各个方面来学习Hystrix仪表盘的使用,一是监控单体应用,二是整合Turbine实现对集群的监控。

Hystrix仪表盘监控单体应用

接下来将通过目前现有的例子,来构建一个Hystrix Dashboard,用于对ribbon-consumer项目(即服务消费者)实施监控,该例子的架构图如下所示:

监控环境搭建

首先明确Hystrix仪表盘无论是监控单体应用,还是整合Turbine监控集群,都需要一个Hystrix Dashboard。为了更加清楚的学习Hystrix仪表盘监控,这里就不在之前创建的待监控单体应用上引入Hystrix Dashboard依赖,使之具备仪表盘的功能,而是单独建立一个新的工程专门用于提供Hystrix Dashboard服务,这也非常符合微服务的思想。

第一步,新建一个普通的SpringBoot工程,名称为hystrix-dashboard,注意使用默认的依赖。

第二步,添加项目依赖。Spring Boot工程创建完成后,修改pom.xml文件,添加如下依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR7</spring-cloud.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

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

<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
</dependency>

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

第三步,在入口类上添加启动注解。接下来在项目的入口类上添加@EnableHystrixDashboard注解,用于开启仪表盘功能,如下所示:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardApplication.class, args);
}
}

第四步,设置一些属性。打开application.yml配置文件,在里面按照自己的要求来设置一些信息,如端口号、应用名称等:

1
2
3
4
5
spring:
application:
name: hystrix-dashboard
server:
port: 2001

这样我们就完成了基本的配置,接下来就可以启动该应用,来进行访问。在浏览器地址栏中输入http://localhost:2001/hystrix,结果如下所示:

上面就是Hystrix Dashboard的监控首页,可以看到该页面中没有具体的监控信息,且从页面的文字内容可以知道Hystrix Dashboard支持三种不同的监控方式,分别如下所示:

  • 默认的集群监控:可以通过如下URL:https://turbine-hostname:port/turbine.stream来开启,实现对默认集群的监控。

  • 指定的集群监控:可以通过如下URL:https://turbine-hostname:port/turbine.stream?cluster=[clusterName]来开启,实现对clusterName集群的监控。

  • 单体应用的监控:可以通过如下URL:https://hystrix-app:port/actuator/hystrix.stream来开启,实现对具体某个服务实例的监控。

由于前面两个监控方式是针对集群的,需要整合Turbine才能实现,因此这一部分的内容将在文章后半部分进行介绍,这里主要实现对单个服务实例的监控。

同时发现该页面还有两个填空和一个按钮,其中一个填空Delay表示控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗;另一个填空Title表示展示时使用的标题,默认使用的是具体监控实例的URL,可以通过配置该信息来展示更合适的标题;而之后一个按钮Monitor Stream则表示监控流。

通过前面的分析可知,Hystrix Dashboard监控单实例节点需要通过访问https://hystrix-app:port/actuator/hystrix.stream链接,即实例的/hystrix.stream接口来实现,因此我们需要为服务实例添加这个端点,而添加该功能只需要两步就能完成:添加actuator和Hystrix依赖以及开启断路器。

这里选择以之前的服务消费者(即RIBBON-CONSUMER服务)为例,来演示Hystrix Dashboard的单体应用监控功能。

第一步,在RIBBON-CONSUMER服务(服务消费者)的pom.xml配置文件中添加断路器依赖,以及actuator模块,相应的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependencies>
......
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
......
</dependencies>

第二步,在RIBBON-CONSUMER服务(服务消费者)的项目入口类上添加@EnableCircuitBreaker注解,用于开启断路器功能。

第三步,注意这一步是Spring Boot2.X版本需要添加的,需要暴露端点和配置访问的上下文。在RIBBON-CONSUMER服务(服务消费者)的application.yml配置文件中添加如下信息:

1
2
3
4
5
6
7
8
9
10
11
##用来暴露endpoints的,由于endpoints中会包含很多敏感信息,
##除了health和info两个支持直接访问外,其他的默认不能直接访问,
##所以我们让他们都能访问(*),或者指定springboot的监控端点访问权限,
##*表示所有的端点都允许访问,如果只写hystrix.stream,他会把默认的info,health端点关闭
management:
endpoints:
web:
exposure:
include: ["info","health","hystrix.stream"]
## 修改默认的监控端点地址,添加上下文路径actuator,注意默认也是actuator
base-path: "/actuator"

第四步,重新启动RIBBON-CONSUMER服务(服务消费者),可以看到在控制台输出大量的监控端点信息,而/actuator/hystrix.stream就是用于Hystrix Dashboard来展示监控信息的接口,如下所示:

**特别注意,当运行项目后,不能立即在浏览器窗口中访问/actuator/hystrix.stream接口,此时会出现一连串的Ping……**,如下所示:

而是需要先访问RIBBON-CONSUMER服务(即服务消费者)中任意一个带有熔断器的接口,然后再去访问它,此时的页面如下:

可以知道返回结果是一段JSON数据,而这些数据就是监控信息,但是这么看起来不方便也不直观,因此可以借助于Hystrix仪表盘来查看该JSON信息,只需在Hystrix仪表盘(地址为http://localhost:2001/hystrix)中输入监控地址(地址为http://localhost:9000/actuator/hystrix.stream),如下所示:

之后点击Monitor Stream按钮,发现页面变成如下所示的界面:

且hystrix-dashboard项目(Hystrix仪表盘)控制台输出以下信息:

1
WARN 19888 --- [nio-2001-exec-3] ashboardConfiguration$ProxyStreamServlet : Origin parameter: http://localhost:9000/actuator/hystrix.stream is not in the allowed list of proxy host names.  If it should be allowed add it to hystrix.dashboard.proxyStreamAllowList

针对出现的情况,笔者这里提供一种解决办法,操作如下:

第一步,配置监控模块。在hystrix-dashboard项目(Hystrix仪表盘)的application.yml配置文件中新增如下配置:

1
2
3
hystrix:
dashboard:
proxy-stream-allow-list: "*"

第二步,配置被监控模块。在ribbon-consumer项目(服务消费者)的入口类中定义一个Bean,相应的代码为:

1
2
3
4
5
6
7
8
9
10
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet hystrixMetricsStreamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(hystrixMetricsStreamServlet);

servletRegistrationBean.setLoadOnStartup(1);
servletRegistrationBean.setUrlMappings(Arrays.asList("/actuator/hystrix.stream"));
servletRegistrationBean.setName("HystrixMetricsStreamServlet");
return servletRegistrationBean;
}

完成这两步以后,在Hystrix仪表盘(地址为http://localhost:2001/hystrix)中输入监控地址(地址为http://localhost:9000/actuator/hystrix.stream),如下所示:

之后点击Monitor Stream按钮,发现页面变成如下所示的界面:

参数介绍

监控图已经有了,但是监控图中各种元素代表的含义目前尚不得知,所以接下来尝试学习该图中的一些参数的含义:

序号1这个实心圆,它有两种含义。通过颜色的变化代表了实例的健康程度,健康程度从绿色、黄色、橙色、红色递减。该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,我们可以在大量的实例中快速发现故障实例(通过颜色)和高压力实例(通过大小)。

序号2这条曲线,它用于记录2分钟内流量的相对变化,我们可以通过它来观察流量的上升和下降趋势。

当然还有一些其他的数量指标,这里就直接在图中进行说明,如下图所示:

通过以上的学习,我们就能够使用Hystrix Dashboard来对单个实例做信息监控,但是在分布式系统中,往往有非常多的实例需要去维护和监控。尽管我们可以通过开启多个窗口来达到监控多个实例的目的,但是显然这种做法是不明智的,最好的做法是批量监控,因此接下来学习如何使用Turbine配合Hystrix Dashboard来实现对集群的监控。

注意,当使用Hystrix Board来监控Spring Cloud Zuul构建的API网关时,ThreadPool信息会一直处于Loading状态,这是因为Zuul默认会使用信号量来实现隔离,因此只有通过Hystrix配置把隔离机制修改为线程池的方式才能够得以显示,这一点需要格外引起注意。