对没有监控的微服务Say No!

11个月前

用四种与Spring boot无缝集成的监控手段,对微服务做全面的“健康体检”。

转载本文需注明出处:微信公众号EAWorld,违者必究。


目录:

一、监控简介

二、监控策略

三、总结


一、监控简介


微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题?


在这种框架下,微服务的监控显得尤为重要。本文主要从实践出发,结合项目中的实际应用,跟大家一起分享微服务的几种监控手段的作用及用法,并分析其中的优缺点,从而提出微服务监控改进建议。


我们应该监控什么?



  • 对于一个微服务,需要监控的信息很多,每个微服务是一个微型独立的服务,麻雀虽小,五脏俱全,从UI到DB;


  • 而一个复杂的系统可能涉及到上百个服务节点部署,所以掌控一个微服务的健康指标、环境配置、服务配置、请求映射、springbean、请求trace信息、日志信息,Rest Api服务是相当有必要的;


  • 作为应用管理人员,可以通过监控平台查看各个节点实例的运行状态,包括数据库连接信息、服务调用、逻辑流或者页面流的调用情况及执行时长;


  • 作为开发人员,可以查看自己的节点实例在运行期的所有信息,Spring bean是否正常加载、yml配置是否起效,如何修改等;


  • 作为运维人员,可以通过平台查看各个服务节点的日志,而不用从分散各地的服务器拉取日志,查看系统CPU、内存、堆栈等信息


二、监控策略


如何监控微服务呢?主要通过以下四种手段来监控。

  • 基于Actuator

  • 基于JMX

  • 基于Spring admin 

  • 基于Swagger 


  • Actuator监控


Spring Boot使用“习惯优于配置的理念”,采用包扫描和自动化配置的机制来加载依赖jar中的Spring bean,不需要任何Xml配置,就可以实现Spring的所有配置。虽然这样做能让我们的代码变得非常简洁,但是整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上,这使得我们分析整个应用中资源和实例的各种关系变得非常的困难。


Actuator是Spring Boot提供的对应用系统的自省和监控的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans以及一些环境属性等。


Actuator监控分成两类:原生端点和用户自定义端点;自定义端点主要是指扩展性,用户可以根据自己的实际应用,定义一些比较关心的指标,在运行期进行监控。原生端点又可以分成三类:


  • 应用配置类:可以查看应用在运行期的静态信息:例如自动配置信息、加载的springbean信息、yml文件配置信息、环境信息、请求映射信息;

  • 度量指标类:主要是运行期的动态信息,例如堆栈、请求连、一些健康指标、metrics信息等;

  • 操作控制类:主要是指shutdown,用户可以发送一个请求将应用的监控功能关闭。


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技术能让我们管理、监控和配置应用,使用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 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监控微服务服务规格


为了减少与其他团队平时开发期间的频繁沟通成本,可以使用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

Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的,工作原理:定时去目标上抓取 metrics(指标) 数据,经过分析处理,基于Grafana实现数据可视化。


  • 优化Ui展示

整合应用下所有实例节点,将各节点实例的监控信息做横向比较分析,通过Ui进行展示。


  • 告警系统

目前的监控信息的获取都是通过客户触发的,没有一个自动报警机制,如果服务异常时,监控平台检测到异常,产生实施报警,那我们的监控工作真的可以高枕无忧了


参考资料

1、《Spring实战(第4版)》

2、《Spring boot实战》

3、https://www.jianshu.com/p/734519d3c383




关于作者闫林梅,普元SOA&云计算部门高级java工程师,6年软件开发设计经验,曾在华为、溢思得瑞集团开发过网规数据管理平台、运营商体检系统及工控监管平台等项目,现主要从事普元 EOS 8微服务监管平台开发设计工作。


关于EAWorld微服务,DevOps,数据治理,移动架构原创技术分享,长按二维码关注


COMMENTS

需要 后方可回复
如果没有账号可以 一个帐号。