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

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依赖
在这里插入图片描述
然后去配置下application.properties 或者 application.yml :

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

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

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

在这里插入图片描述

端点端点描述是否开启
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暴露的JMXbeansYes
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 结果如下:
    在这里插入图片描述

    这样我们就看到各项数据的汇总了,那么下面使用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 看到下面的界面说明成功:
    在这里插入图片描述
    上面的选项卡分别是警告、图表展示、状态以及帮助,默认看到的就是图表,在下拉框中选择要查看的参数,点击 Execute 按钮,即可看到相关数据:

    在这里插入图片描述
    这样就实现了数据的可视化。

    总结

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

    源码地址

    github

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐