使用微服务框架开发应用程序,其特点是分模块、跨进程、分布式部署。这就增加了对整个服务的监控难度,由于分布式服务的“雪崩式效应”,当一个微服务发生故障时,会连带着对整个服务造成不可估量的影响。因此如何快速定位问题,以及查询系统健康程度等就显得尤为必要。系统内及系统间的监控,也是微服务治理的重要组成部分。本文从系统级别和系统间的级别角度,通过笔者在实际生产环境中的应用经验,总结了对Spring Boot应用程序的监控整体多维度解决方案。本文适合Spring Boot开发人员阅读,也适合运维相关的同学阅读,如果你对程序本身的监控感兴趣,也可以尝试去阅读。
1. 系统级别监控
系统级别的监控,是应用程序本身的健康程度的直接体现,常用包括JVM、GC、Environment、IO、System Load、Property、ClassLoading等信息。Spring Boot提供了Actuator组件,对应用程序的监控做了集成功能,第三方工具就可以读取Actuator暴露的接口来收集数据。
1.1 Spring Boot Admin
Spring Boot Admin是一款监控和管理Spring Boot应用程序的开源软件。Spring Boot Admin读取Actuator的接口数据,并通过Spring Boot Admin UI将实时数据展示在前端。了解Spring Boot Admin的配置方法,可以参考我之前的博文《Spring Boot(四)之程序性能监控》
Actuator提供的监控数据多而全,基本能覆盖日常的监控需求。
1.2 JVM工具及付费JVM工具
JDK一般都自带了一些JVM分析工具,像JConsole、JMap、VisualVM等,可以在本地直接读取进程信息并展示。
还有一些第三方的JVM分析工具,比如阿里开源的Arthas,可以对你的Java程序进行诊断。还有诸如OneAPM等公司,提供了整体的端到端性能诊断解决方案。
JVM工具,更多的是用来分析JVM Heap信息、内存快照等,可以用来做基本的内存溢出和性能优化的诊断。
1.3 日志分析
log日志,也是我们监控系统、排查问题的主要信息来源。在微服务架构体系下,一个痛点就是日志的聚合和链路追踪:即在分布式部署下,一个工程通常需要部署在几十个甚至上百个节点中,这时候,如何收集各个服务器的日志并快速定位是哪台机器出的问题,这是目前Spring Boot应用程序分布式部署的难点。
Spring Cloud提供了Sleuth组件,可以解决上面的这个问题,具体的实现步骤,可以参考我的博文《Spring Cloud之分布式链路跟踪服务Sleuth》
2. 系统间链路监控
由于我们的微服务都是分布式部署的,这就产生了对调用链的监控需求。什么是分布式服务调用链呢,假设用户访问一个资源,请求首先到网关(Nginx或Zuul)A这里,A转发请求到服务B,B又通过HTTP或RPC调用服务C,则此时就产生了一个简单的分布式调用链:A->B->C。分布式调用链的监控,主要关注服务调用层级关系、调用链出错比例、调用链吞吐、请求响应时间等信息。
2.1 HTTP调用
对于服务间采用HTTP治理的分布式系统来说,调用链可以参考之前的博文《Spring Cloud之分布式链路跟踪服务Sleuth》 和第二篇《Spring Cloud之基于Zipkin的链路数据持久化》
2.2 RPC服务调用
通用的RPC框架,都会提供自己的监控组件,你可以根据你选择的RPC框架选择对应的RPC监控。例如我们目前的服务采用Spring Boot + Dubbo的方式开发,使用的RPC监控组件就是Dubbo Admin。Dubbo Admin目前提供了如下的服务监控页面:
提供了服务提供者、消费者、调用关系、响应时间等指标信息。
3. 监控数据存储及展示
使用Spring Boot Admin做监控,有一个痛点是其只展示了实时的metrics信息,并不具备存储监控数据的功能,如果我们需要做数据的时间序列分析,就需要借助其他组件。接下来,我提供了一种基于Actuator+Prometheus+Grafana的监控数据展示方案。
3.1 Prometheus
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。Prometheus具有如下几个特点:
- 多维度数据模型。
- 通过HTTP的Pull方式采集时序数据。
- 可以配置服务发现来发现监控对象。
- 支持多种数据查询,可以对接Grafana。
Prometheus的整体架构可参考下图:
Prometheus+Grafana的工作流程大约是这样:
- 应用程序暴露metrics接口。
- Prometheus定时抓取metrics指标信息。
- Prometheus存储、整理、清洗指标数据。
- Grafana读取Prometheus的API,数据展示。
Prometheus的安装过程可直接在官网查找,本文不再赘述。
3.2 应用程序修改
增加依赖:
1 | compile('io.micrometer:micrometer-registry-prometheus:1.0.9') |
增加metrics配置类:
1 | import io.micrometer.core.instrument.MeterRegistry; |
然后打开 http://程序host:port/prometheus ,即可查看相关metrics指标数据。
3.3 Grafana
Grafana是一个跨平台的开源度量分析和可视化工具,通过将采集的数据查询然后做可视化的展示,并具备一定的报警功能。Grafana具备如下特点:
- 比较灵活的图标展示方式。
- 支持Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch等多数据源。
- 可配置的报警功能。
- 支持多数据源联合查询。
Grafana的安装可参考这里。
Grafana中添加Prometheus数据源的步骤可参考这里。
Grafana有两种方式创建监控的Dashboard,第一种是自定义Dashboard,第二种是直接使用Dashboard模版。
Grafana中展示到的Spring Boot应用程序的时序数据如下图:
4. 总结
本文,介绍了对应用程序监控的解决方案,也算是笔者实际应用的一个总结,也欢迎业余时间有兴趣做服务监控的小伙伴多多交流。
以上内容就是关于Spring Cloud之应用程序多维度监控解决方案的全部内容了,谢谢你阅读到了这里!
Author:zhaoyh