不同于单体架构的应用,微服务架构由于服务数量众多,出故障的概率更大,这个在前两篇文章中已经和读者分享过了。这种时候不能单纯依靠“人肉”运维,否则当服务数量越来越多时成本将变得不可控。一个好的解决方案是我们需要对服务进行监控,监控服务运行的数据。当有异常情况出现时,服务能够自动报警,方便运维工程师去处理。

Spring Cloud 中对于服务监控这一个话题也是在不断地变化中。早期的版本( Greenwich 版之前)服务监控主要使用 Hystrix Dashboard 仪表盘,集群数据监控使用 Turbine,这一技术组合在最新的 Greenwich 版中被建议使用 Micrometer 来替换掉。相对于前者, Micrometer 的使用确实要方便很多,而且容易结合配套工具 Prometheus 以及 Grafana 一起使用,具备自动报警功能,数据展示也更加多样化,方便运维工程师去查看,因此本专栏将不再向读者介绍古老的服务监控的用法,主要向读者介绍 Micrometer 的用法。考虑到很多读者也是第一次使用 Micrometer ,因此本文将分为两部分,首先向读者介绍在 Spring Boot 中 Micrometer 要如何使用,然后再向读者介绍微服务中 Micrometer 的用法。

什么是Micrometer

Micrometer 为数据测量仪表提供了一个简单的外观,它几乎适用于大部分目前最流行的监控系统,允许开发者检测基于 JVM 的应用程序代码, Micrometer 有点类似于 SLF4J ,只不过是针对测量数据的。Micrometer 主要有如下三方面的功能:

  1. Micrometer 提供了度量指标类,例如 timers、gauges 以及 counters等
  2. 一揽子开箱即用的解决方案,例如缓存、类加载器、垃圾收集、处理器利用率以及线程池等
  3. 从 Spring Boot 2.0 开始, 在 Spring Boot Actuator 中使用了 Micrometer 。在早期的 Spring Boot 版本中,也支持通过附加依赖的方式来使用 Micrometer

Micrometer 支持流行的监控系统,作为一个门面,Micrometer 允许开发者检测代码,并决定是否监控系统。Micrometer 支持 AppOptics、Azure Monitor、Netflix Atlas、CloudWatch、 Datadog、Dynatrace、Elastic、Ganglia、 Graphite、Humio、Influx/Telegraf、 JMX、KairosDB、New Relic、Prometheus、SignalFx、Google Stackdriver、StatsD 以及 Wavefront。

Micrometer 基本用法

实现监控,那么我们首先要创建一个SpringBoot项目,然后加入web和actuator依赖

arms监控服务属于微服务架构的哪一层 微服务性能监控工具_springboot


然后去配置下application.properties 或者 application.yml :

management:
  endpoints:
    web:
      exposure:
        include: "*"
      endpoint:
        metrics:
          enabled: true

注意这里的*号 代表的是所有的端点 在yml 中 需要加 双引号。

然后我们在浏览器上输入http://localhost:8080/actuator/health

arms监控服务属于微服务架构的哪一层 微服务性能监控工具_micrometer_02

端点

端点描述

是否开启

auditevents

展示当前应用程序的审计事件信息

Yes

beans

展示所有SpringBeans信息

Yes

conditions

展示一个自动配置类的使用报告,该报告展示所有自动配置类及它们被使用或未被使用的原因

Yes

configprops

展示所有@ConfigurationProperties的列表

Yes

env

展示系统运行环境信息

Yes

flyway

展示数据库迁移路径

Yes

health

展示应用程序的健康信息

Yes

httptrace

展示trace信息(默认为最新的100条HTTP请求)

Yes

info

展示应用的定制信息,这些定制信息以info开头

Yes

loggers

展示并修改应用的日志配置

Yes

liquibase

展示任何Liquibase数据库迁移路径

Yes

metrics

展示应用程序度量信息

Yes

mappings

展示所有@RequestMapping路径的集合列表

Yes

scheduledtasks

展示应用的所有定时任务

Yes

shutdown

远程关闭应用接口

No

sessions

展示并操作SpringSession会话

Yes

threaddump

展示线程活动的快照

Yes

heapdump

返回一个GZip压缩的hprof堆转储文件

Yes

jolokia

展示通过HTTP暴露的JMXbeans

Yes

logfile

返回日志文件内容

Yes

prometheus

展示一个可以被Prometheus服务器抓取的metrics数据

Yes

那么我们如何结合 Prometheus 将数据更直观的展现出来?

什么是Prometheus

Prometheus 是一个最初在 SoundCloud 上构建的开源系统监视和警报工具包 。自2012年成立以来,许多公司和组织都采用了 Prometheus ,该项目拥有一个非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,可以独立于任何公司进行维护。

Prometheus 主要有如下特点:

  • 具有由度量名称和 key/value 标识的时间序列数据的多维数据模型
  • PromQL,一种灵活的查询语言
  • 不依赖分布式存储,单个服务器节点是自治的
  • 使用 HTTP 协议,自动拉取数据
  • 通过服务发现或静态配置发现目标
  • 多种图形和仪表盘支持,数据展示友好
  • 可以非常方便地实现扩展
  • Prometheus 采用的架构
    这张图片是在网上找的,我们可以看一下Prometheus的工作原理:

    从这张图我们可以看到Prometheus 的工作流程:
  1. 首先 Prometheus Server 定期从 targets 或者服务注册中心拉取数据
  2. exporters 负责向 Prometheus Server 做数据汇总。不同的数据汇总由不同的 exporters 实现,例如监控主机有 node-exporters,MySQL 有 MySQL Server exporter
  3. 由于 Prometheus 采用数据拉取的模式,实际生产环境可能由于各个服务不在一个子网或者防火墙的原因,导致 Prometheus 无法直接拉取各个 target 数据,此时可以通过 Pushgateway 来推送 metrics 到 Prometheus Server
  4. Alertmanager 则可以通过提前配置好的邮件地址,对收到的警告信息发出报警
  5. Grafana 则可以通过 PromQL 查询监控数据,进行更丰富的展示

如何使用Prometheus
首先我们创建一个Prometheus的SpringBoot工程,并且加入以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
 
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

注意之前的actuator 依赖不要忘记加了。

添加完成后我们修改application.yml 或者 application.properties

management:
  metrics:
    export:
      prometheus:
        enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    prometheus:
      enabled: true
    metrics:
      enabled: true

上面的这些配置之前都讲过,不清楚的小伙伴可以看之前的文章。

配置好了之后我们去访问 http://localhost:8080/actuator/prometheus 结果如下:

arms监控服务属于微服务架构的哪一层 微服务性能监控工具_arms监控服务属于微服务架构的哪一层_03

这样我们就看到各项数据的汇总了,那么下面使用Prometheus 进行可视化。

首先得下载Prometheus

Prometheus 下载地址

下载完成后,将下载文件解压,在解压目录中可以看到 prometheus.yml 配置文件,在 prometheus.yml 文件中配置要查看的数据接口,如下:

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: ['localhost:8080']

这里需要配置的就三个地方:

  1. scrape_interval 表示每隔 5 秒抓取一次数据
  2. metrics_path 表示数据路径
  3. targets 中配置的则是服务地址

配置完成后,Windows 环境下,直接双击 prometheus.exe 启动 Prometheus ,如果是 Linux 环境,则执行 ./prometheus --config.file=prometheus.yml 命令启动 Prometheus 。

启动成功后,在浏览器中输入 http://localhost:9090 看到下面的界面说明成功:

arms监控服务属于微服务架构的哪一层 微服务性能监控工具_springboot_04


上面的选项卡分别是警告、图表展示、状态以及帮助,默认看到的就是图表,在下拉框中选择要查看的参数,点击 Execute 按钮,即可看到相关数据:

arms监控服务属于微服务架构的哪一层 微服务性能监控工具_springcloud_05


这样就实现了数据的可视化。

总结

微服务的监控对于我们来说十分的重要,本文主要讲老使用Micrometer和Prometheus实现微服务的监控以及可视化。

源码地址

github