Hystrix仪表盘
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 | <properties> |
第三步,在入口类上添加启动注解。接下来在项目的入口类上添加@EnableHystrixDashboard
注解,用于开启仪表盘功能,如下所示:
1 | @SpringBootApplication |
第四步,设置一些属性。打开application.yml配置文件,在里面按照自己的要求来设置一些信息,如端口号、应用名称等:
1 | spring: |
这样我们就完成了基本的配置,接下来就可以启动该应用,来进行访问。在浏览器地址栏中输入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 | <dependencies> |
第二步,在RIBBON-CONSUMER服务(服务消费者)的项目入口类上添加@EnableCircuitBreaker
注解,用于开启断路器功能。
第三步,注意这一步是Spring Boot2.X版本需要添加的,需要暴露端点和配置访问的上下文。在RIBBON-CONSUMER服务(服务消费者)的application.yml配置文件中添加如下信息:
1 | ##用来暴露endpoints的,由于endpoints中会包含很多敏感信息, |
第四步,重新启动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 | hystrix: |
第二步,配置被监控模块。在ribbon-consumer项目(服务消费者)的入口类中定义一个Bean,相应的代码为:
1 | @Bean |
完成这两步以后,在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配置把隔离机制修改为线程池的方式才能够得以显示,这一点需要格外引起注意。