目录:
一、监控简介
二、监控策略
三、总结
一、监控简介
微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题?
在这种框架下,微服务的监控显得尤为重要。本文主要从实践出发,结合项目中的实际应用,跟大家一起分享微服务的几种监控手段的作用及用法,并分析其中的优缺点,从而提出微服务监控改进建议。
我们应该监控什么?
二、监控策略
如何监控微服务呢?主要通过以下四种手段来监控。
Spring Boot使用“习惯优于配置的理念”,采用包扫描和自动化配置的机制来加载依赖jar中的Spring bean,不需要任何Xml配置,就可以实现Spring的所有配置。虽然这样做能让我们的代码变得非常简洁,但是整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上,这使得我们分析整个应用中资源和实例的各种关系变得非常的困难。
Actuator是Spring Boot提供的对应用系统的自省和监控的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans以及一些环境属性等。
Actuator监控分成两类:原生端点和用户自定义端点;自定义端点主要是指扩展性,用户可以根据自己的实际应用,定义一些比较关心的指标,在运行期进行监控。原生端点又可以分成三类:
Actuator监控只需要添加以下依赖就可以完成
为了保证actuator暴露的监控接口的安全性,需要添加安全控制的依赖spring-boot-start-security依赖,访问应用监控端点时,都需要输入验证信息。Security依赖,可以选择不加,不进行安全管理,但不建议这么做。
对于一个微服务项目,application.yml配置的访问端口和context-path如下:
server:
port: 8281
context-path: /BillingService
Actuator监控访问路径(以http://localhost:8281为根目录)如下
应用配置类:
查看自动化配置信息:/BillingService/autoconfig
查看所有的spring beans:/BillingService/beans
查看配置属性:/BillingService/configprops
查看系统环境信息/BillingService/env
查看请求映射信息:/BillingService/mappings
查看应用自定义的信息:/BillingService/info
度量指标类:
内存、CPU等信息:/BillingService/metrics
健康指标:/BillingService/health
线程信息:/BillingService/dump
请求调用链:/BillingService/trace
操作控制类:
关闭监控端点:/BillingService/shutdown
修改日志级别:/BillingService/loggers
JMX技术能让我们管理、监控和配置应用,使用JMX的核心是托管bean,即MBean,就是暴露特定方法的JavaBean,这些方法定义了管理接口,我们可以调用这些接口来监控和配置运行期的微服务项目。
Spring 提供了对JMX监控的支持,Spring的MBeanExporter可以把一个或者多个Spring bean导出为Mbean服务器内的模型MBean,MBean服务器是MBean的生存容器,对MBean的访问也是通过MBean服务器来实现的。
将Spring bean导出为JMX MBean之后,可以使用基于JMX的管理工具JConsole查看正在运行的应用程序。
附图:
除了通过JMX获取信息,也提供了对应的HTTP接口访问Mbean
Spring admin主要是在Spring Boot Actuator的基础上提供简洁的WEB UI展示,Actuator是对单个微服务本身的监控,Spring admin是对微服务集群中每个节点的监控。
Spring admin 通过两种方式实现监控端Server和被监控端client之间联系。第一种通过Eureka,监控端和被监控端都将自己注册到Eureka中,监控端Server通过Eureka提供的api接口获取监控client的访问地址。第二种是在被监控端client引入spring-boot-admin-starter-client jar依赖,并在yml文件中配置向监控端注册自己。两种方式都可以,这里推荐使用Eureka的方式,Eureka方式只需要两步:
第一步:在监控端引入jar依赖,如下所示:
第二步:在监控端和被监控端的application.yml中添加注册Eureka的配置
启动Server和client,Server的Spring admin监控界面如下:
为了减少与其他团队平时开发期间的频繁沟通成本,可以使用Swagger创建一份实时更新的RESTful API文档来记录所有接口细节。Swagger的工作原理:在Spring中集成Swagger,即Springfox,在项目启动的过种中,spring上下文在初始化的过程,框架自动跟据配置加载一些Swagger相关的bean到当前的上下文中,并自动扫描swaggerconfig中配置需要生成api文档的包,并生成相应的Json格式的信息缓存起来。然后在集成Swagger-ui,将Json信息可视化展示出来。
Swagger支持Spring 原生的注解,加入一些简单的依赖和配置,Controller层代码就可以自动生成api json数据。 Swagger还提供相应的测试界面,自动显示json格式的响应信息,类似于PostMan的接口测试过程。
微服务集成Swagger只需要进行如下操作:
集成Swagger,启动项目后,微服务中服务规格显示界面如下:
Swagger中接口测试界面如下:
三、总结
以上四种监控手段都与Spring boot无缝集成,使用方便快捷,并且可以对微服务有一个全面的健康体检,包括动态和静态信息,但是在纵向上没有时间序列上的监控数据,只是对孤立节点的监控数据快照;在横向上同一节点下不同实例(水平扩展)没有得到聚合,没有对不同节点实例进行比较分析的过程。所以,下一步的微服务监控应该怎么做?
Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的,工作原理:定时去目标上抓取 metrics(指标) 数据,经过分析处理,基于Grafana实现数据可视化。
整合应用下所有实例节点,将各节点实例的监控信息做横向比较分析,通过Ui进行展示。
目前的监控信息的获取都是通过客户触发的,没有一个自动报警机制,如果服务异常时,监控平台检测到异常,产生实施报警,那我们的监控工作真的可以高枕无忧了
参考资料:
1、《Spring实战(第4版)》
2、《Spring boot实战》
3、https://www.jianshu.com/p/734519d3c383
关于作者:闫林梅,普元SOA&云计算部门高级java工程师,6年软件开发设计经验,曾在华为、溢思得瑞集团开发过网规数据管理平台、运营商体检系统及工控监管平台等项目,现主要从事普元 EOS 8微服务监管平台开发设计工作。