微服务之服务监控,一文秒懂

一、引言

在现今的软件架构中,微服务架构因其高度的模块化、可扩展性和灵活性而备受青睐。然而,随着服务数量的增多和复杂性的增加,如何确保这些微服务能够稳定、高效地运行,成为了摆在每一个开发人员和运维人员面前的难题。服务监控,作为保障微服务稳定运行的重要手段,其重要性不言而喻。

二、 解释(什么是服务监控)

微服务监控是指对微服务架构]中的各个服务进行实时、全面的性能、状态和安全等方面的监测与管理。在微服务架构中,由于服务众多且相互依赖,任何一个服务的故障都可能引发连锁反应,导致整个系统的崩溃。因此,微服务监控显得尤为重要。

三、微服务监控关注的方面

  • 实时掌握系统中各个服务的运行状态和性能指标,包括服务的响应时间、吞吐量、错误率等,以便及时发现并处理异常情况,避免故障扩散和升级。

  • 监控服务间的依赖关系,确保服务之间的调用正常进行,及时发现并解决服务调用中的问题。

  • 监控服务的并发量和负载情况,以便根据实际需求调整服务的资源配置,保证服务的稳定性和高可用性。

  • 监控服务的日志和错误信息,以便及时记录并进行监控和分析,快速定位并解决问题。

本文我们将用springboot,spring boot actuator,docker,Prometheus,Grafana,alertManager 实现服务的监控告警组件介绍:

Spring Actuator是Spring Boot提供的一个功能强大的管理和监控工具,用于监控和管理Spring Boot应用程序。它提供了一系列的端点endpoints),通过这些端点,我们可以轻松地获取应用程序的运行时信息、健康状况、性能指标、日志等。Prometheus一个开源系统监控和告警工具包,提供了高效的时间序列数据库、简单的安装和配置、多样的数据模型及查询语言。

Grafana一个跨平台的开源分析和监控解决方案,与Prometheus通常搭配使用,提供了丰富的仪表盘和图表,用于数据的可视化展示。

Alertmanager是Prometheus生态中非常重要的一个核心模块,主要用于接收Prometheus发送的告警信息,并对其进行统一处理。它支持丰富的告警通知渠道,如电子邮件、待命通知系统和聊天平台等,且很容易实现告警信息的分组、静默、抑制等功能。

架构图:

图片

  • 这个图就是本文要实现的架构图,如果看不懂没关系,接下来我们会一给我一个实现哦。

另外:
推荐一个程序员免费学习的编程网站:我爱编程网(www.love-coding.com
涵盖 Java几乎覆盖了所有主流技术面试题,还有市面上最全的技术精品系列教程,免费提供。
在这里插入图片描述

四、springboot项目搭建

spring boot项目搭建就不过多赘述
  • 项目结构

    图片

  • controller:

图片

  • 添加依赖:
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

  <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-prometheus</artifactId>
  </dependency>
  • 在application.yml 中配置spring boot autuator
management:
endpoints:
  web:
    exposure:
      include: "*"
      exclude: configprops
    base-path: /actuator
  enabled-by-default: true
endpoint:
  health:
    show-details: always
metrics:
  tags:
    application: "demo"
management.endpoints.web.exposure.include 和 exclude
  • include: “”:这个配置表示所有Actuator的web端点都将被包含(即对外暴露)。星号()是一个通配符,代表所有端点。

  • exclude: configprops:尽管include设置了星号,但exclude会覆盖它,并明确排除configprops端点。configprops端点用于显示所有@ConfigurationProperties的配置属性。

management.endpoints.web.base-path
  • 这个配置设置了Actuator web端点的基路径为/actuator。例如,如果你想要访问健康检查端点,你通常会访问/actuator/health(除非另有其他配置)。
management.endpoints.enabled-by-default
  • 这个配置决定了默认情况下是否启用Actuator的端点。在这里,它被设置为true,意味着所有的端点默认情况下都是启用的(通过其他配置进行覆盖)。
management.endpoint.health.show-details
  • 这个配置是关于健康检查端点的。它控制了在健康检查响应中应包含多少详细信息。always意味着无论应用程序的响应状态如何,都将显示详细信息。其他可能的值包括when-authorized(仅当授权用户请求时才显示)和never(从不显示)。
management.metrics.tags.application

这个配置用于为所有度量(metrics)添加一个标签(tag)。在这里,所有的度量都将有一个名为- application的标签,其值为demo。这对于在监控系统中区分不同的应用程序或实例非常有用。

通过这些配置,您可以自定义Spring Boot Actuator的行为,以便更好地满足您的监控和管理需求。不过,请注意,暴露某些端点(特别是包含敏感信息的端点)可能会带来安全风险,因此请确保您已经采取了适当的安全措施来保护这些端点。

接下来我们把项目运行起来:并访问localhost:8080/user:

图片

访问localhost:8080/actuator:

图片

  • actuator成功将数据暴露出来
  • 当然你也可以访问这个链接看看,所有的链接都在暴露的数据里面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 看到这里证明spring boot 整合spring boot actuator 项目已经完成。接下来我将带大家用docker 安装监控组件

五、Prometheus安装

介绍:

Prometheus是一个开源的服务监控系统和 时序数据库 ,它提供了通用的数据模型和快捷数据采集、存储和查询接口。

Prometheus的特点包括
  • 易管理性:Prometheus的核心部分由一个单独的二进制文件构成,这使得它容易部署和管理。它可以在本地运行,不依赖于分布式存储系统。
  • 高效性:Prometheus设计上能够处理大量的监控指标,即使是单个Prometheus实例也能够每秒处理数百万的数据点。
  • 灵活性:Prometheus支持通过配置文件定义监控目标,用户可以根据自己的需求灵活配置监控项。

强大的查询语言:Prometheus提供了一个功能强大的查询语言PromQL(Prometheus Query Language),用户可以使用这个语言对收集到的时序数据进行查询和分析。

Prometheus的主要功能包括:
  • 收集和存储时间序列数据:Prometheus能够从各种来源收集和存储时间序列数据,包括应用程序、服务、操作系统和网络设备等。
  • 实时监控和警报:Prometheus可以实时监控各种指标,并根据预定义的规则进行警报和通知。它提供了一个灵活的警报管理系统,可以定义警报规则、接收警报通知,并对警报进行静音或处理。
  • 多维数据模型:Prometheus使用时间序列数据模型,可以对多种维度的数据进行监控和分析。
  • 高效的数据存储:Prometheus使用本地存储方式,可以高效地存储监控数据,而且支持数据压缩和数据刷写等功能。
docker安装prometheus
docker run --name prometheus -d -p 9090:9090 -v
/opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
prom/prometheus --config.file=/etc/prometheus/prometheus.yml

这里就不讲解安装docker的教程了,在安装promethes之前,需要安装docker。
复制的时候请注意:这里是一条命令,小心换行符哦

命令执行完成后访问:http://your path:9090/你会看到

图片

恭喜你Prometheus安装成功

图片

这时你点击targets发现没有任何数据,当然没有啦,有才怪呢,因为我们没有配置让Prometheus去哪里拿数据。接下来我们配置让Prometheus去springboot项目里拿数据还记的这条命令吗?

docker run --name prometheus -d -p 9090:9090 -v
/opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
prom/prometheus --config.file=/etc/prometheus/prometheus.yml

启动prometheus时我们在将它的配置文件prometheus.yml 挂到了 /opt/prometheus/这个目录下

图片

首先停止启动 Prometheus docker 容器

查找启动的docker 容器
docker ps
docker stop CONTAINER ID

接下来我们开始配置这个文件(注意:这是一个yml文件,遵循严格的缩进

global:
scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is 1 minute.
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
  - targets:
    # - alertmanager:9093 # Uncomment and set to your Alertmanager instance address

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs: # 注意修正拼写错误为 scrape_configs
- job_name: 'prometheus'
  # metrics_path defaults to '/metrics'
  # scheme defaults to 'http'.
  static_configs:
  - targets: ['localhost:9090']

# 示例:其他 job 配置可以添加在这里
- job_name: 'springboot'
  metrics_path: '/actuator/prometheus'
  scheme: 'http'
  static_configs:
  - targets: ['yourIP:8080']
现在我们主要配置的就是这个片段:
# 示例:其他 job 配置可以添加在这里
- job_name: 'springboot'
  metrics_path: '/actuator/prometheus'
  scheme: 'http'
  static_configs:
  - targets: ['yourIP:8080']

配置完成后,重启Prometheus docker 容器

docker ps -a
docker start CONTAINER ID

重启成功后你去看:http://your path:9090/ 你会神奇的发现targets里依然没有任何数据

注意: 我们的spring boot 项目启动在本地,只能在局域网里访问,当然可能有一些技术能结局(内网穿透等技术),但我们是Java程序员,可能对这方面不太了解,那怎么办呢?那就用程序员的方式解决直接用docker把我们的Java项目打包部署到服务器上,开始喽~~

  1. 首先用maven打包spring boot项目

图片

2.把 jar 文件上传到服务器把 jar 文件改名 demo.jar (当然可以改你喜欢的文件名) —>2、在服务器你喜欢的位置创建一个文件目录(上传文件我用的是可视化工具,就不过多解释了)接下来重点来了。

3.编写Dockerfile在demo.jar的同级目录下创建Dockerfile 文件

touch Dockerfile
vim Dockerfile

粘贴下面的命令

FROM java:8-alpine

COPY demo.jar app.jar

RUN /bin/sh -c "touch /app.jar"

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

这段代码其实很简单,我就不过多赘述了

3.打包镜像

  • 打包
docker build -t demo .
  • 查看镜像
docker images
  • 启动镜像
docker run -d -p 8080:8080 demo

然后访问http://yourPath:8080/actuator/

图片

看到这里,spring boot项目部署完毕,又学了个新技术哦,docker 部署Java项目

接下来记得改prometheus 拿取数据的ip地址哦(修改为你服务器地址,怎么修改可以参考上文的Prometheus.yml讲解)

打开prometheus的Targets你会神奇的发现多了一个 Endpoint 并且 state 为 up

图片

去首页查询你会发现有很多数据:

图片

六 、Grafana安装

介绍

Grafana是一个开源的数据可视化工具,主要用于将数据源中的数据以图形化的形式展示并进行实时监控

数据源支持:-Grafana支持多种数据源,包括Graphite、Elasticsearch、InfluxDB、Prometheus等,这使得用户能够整合来自不同来源的数据,并在一个统一的界面中进行展示和分析。**数据可视化:**Grafana提供了丰富的可视化图表类型,如折线图、直方图、热力图等,以满足各种数据可视化需求。用户可以通过简单的配置和自定义设置,将数据转化为易于理解的图表和仪表盘,并在一个界面中集中展示多个数据源的数据。**实时监控:**Grafana支持实时监控功能,可以实时反映系统状态、性能等指标的变化情况。这使得用户能够及时发现潜在问题,并采取相应措施进行解决。**告警与通知:**Grafana可以设置告警规则,当某些指标达到预设的阈值时,系统会自动发送通知,提醒用户关注和处理。这种功能可以帮助用户保持对关键指标的持续监控,确保系统的稳定运行。**灵活的布局:**Grafana允许用户通过拖拽和配置的方式,自由调整图表的位置和大小,实现个性化的界面布局。这使得用户能够根据自己的需求定制仪表板,提高工作效率。**数据采集与清洗:**Grafana支持从各种数据源采集数据,并进行聚合、清洗和存储。这样可以确保数据的准确性和完整性,为后续的分析和展示提供可靠的数据支持。**插件和扩展:**Grafana支持多种插件和扩展,可以定制用户的监控和数据可视化体验。这些插件和扩展可以帮助用户扩展Grafana的功能,满足特定的业务需求。

  • 总之,Grafana是一个功能强大、易于使用的数据可视化工具,可以帮助用户更好地理解和分析数据,提高工作效率。
安装
  • 拉取Grafana Docker镜像:
docker pull grafana/grafana
  • 运行Grafana容器:
docker run -d -p 3000:3000 --name=grafana grafana/grafana

访问 http://yourPath:3000 你会看到一下界面

图片

到这里grafana安装就完毕了,接下来我们配置

配置
  • 添加数据源

图片

选择数据源

图片

Prometheus地址配置

图片

导入视图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择 import 搜索 4701

图片

选择Prometheus,然后导入(解释,我已经导入过模板了,所以有提示)

图片

导入成功后你会看到以下界面(很多的指标都图形化显示了)

图片

  • 到这里 grafana 安装完毕。

七、linux node-exporter安装

介绍:
  • node-exporter是一个Prometheus的exporter,它主要用于监控Linux系统的节点信息。这个工具可以采集Linux服务器的多种资源数据,包括但不限于服务器的进程数、CPU、内存消耗、磁盘空间、IOPS(输入/输出操作每秒)、TCP连接数等。
  • node-exporter的工作方式是暴露主机的指标,如CPU、内存、磁盘等信息。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。然而,与传统的指标数据收集组件不同的是,node-exporter只负责收集数据,并不直接向Server端发送数据,而是等待Prometheus Server主动抓取。默认的抓取URL地址是http://ip:9100/metrics。
安装:

同样的方式,用docker 安装

docker run -d -p 9100:9100 --restart=always -m 5G --memory-swap=5G \
-v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" \
--name node_exporter quay.io/prometheus/node-exporter --path.procfs \
/host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points\
"^/(sys|proc|dev|host|etc)($|/)"

访问:http://yourIp:9100/metrics

node-exporter安装成功

然后去grafana import 8919 (数据源继续选择promtheus)你会看到如下页面,服务器已经开始监控

图片

八、Altermanager安装

1、介绍
  1. 当Prometheus服务器根据报警规则发现异常时,它会将警报发送到Alertmanager。Alertmanager负责处理这些警报,包括进行去重、分组,并通过路由发送到正确的接收器,如电子邮件、Slack、HipChat等。
  2. Alertmanager还支持多种告警方式,如邮件告警、微信告警、短信告警、Slack告警、电话告警和PagerDuty告警等。通过配置,用户可以根据自己的需求选择适合的告警方式,以便及时采取行动来处理问题。
  3. 总的来说,Alertmanager是Prometheus生态系统中的一个重要组件,它负责处理Prometheus生成的警报,并通过各种方式通知用户,以便用户能够及时发现和处理潜在问题。
2、安装
  • 创建数据挂载目录

/opt/alertmanager/config目录,准备用来放置alertmanager的配置文件/opt/alertmanager/template目录,准备用来挂载放置alertmanager的模板文件

mkdir -p /opt/alertmanager/{config,template}```
## 授权权限
​```linux
chmod -R 777 /opt/alertmanager/config
chmod -R 777 /opt/alertmanager/template
  • 创建Altermanager配置文件alertmanager.yml
cat > /opt/alertmanager/config/alertmanager.yml << \EOF
global:
resolve_timeout: 5m
# 发件人
smtp_from: 1229495577@qq.com'
# 邮箱服务器的 POP3/SMTP 主机配置 smtp.qq.com 端口为 465 或 587
smtp_smarthost: 'smtp.qq.com:465'
# 用户名
smtp_auth_username: 1229495577@qq.com'
# 授权码 或 密码
smtp_auth_password: '你的qq授权码'
smtp_require_tls: false
smtp_hello: 'qq.com'
templates:
# 指定预警内容模板
- '/etc/alertmanager/template/email.tmpl'
route:
# 指定通过什么字段进行告警分组(如:alertname=A和alertname=B的将会被分导两个组里面)
group_by: ['alertname']
# 在组内等待所配置的时间,如果同组内,5 秒内出现相同报警,在一个组内出现
group_wait: 5s
# 如果组内内容不变化,合并为一条警报信息,5 分钟后发送
group_interval: 5m
# 发送告警间隔时间 s/m/h,如果指定时间内没有修复,则重新发送告警
repeat_interval: 5m
# 默认的receiver。如果一个报警没有被任何一个route匹配,则发送给默认的接收器
receiver: 'justrydeng163email'
#子路由(上面所有的route属性都由所有子路由继承,并且可以在每个子路由上进行覆盖)
routes:
# 当触发当前预警的prometheus规则满足:标签alarmClassify的为normal时(标签名、标签值可以自定义,只要和编写的prometheus的rule里面设置的标签呼应上即可),往justrydeng163email发送邮件
- receiver: justrydeng163email
  match_re:
    alarmClassify: normal
# 当触发当前预警的prometheus规则满足:标签alarmClassify的值为special时(标签名、标签值可以自定义,只要和编写的prometheus的rule里面设置的标签呼应上即可),往justrydengQQemail发送邮件
- receiver: justrydengQQemail
  match_re:
    alarmClassify: special
receivers:
- name: 'justrydeng163email'
email_configs:
# 如果想发送多个人就以 ',' 做分割
- to: burger2325@163.com'
  send_resolved: true
  # 接收邮件的标题
  headers: {Subject: "alertmanager报警邮件"}
- name: 'justrydengQQemail'
email_configs:
# 如果想发送多个人就以 ',' 做分割
- to: 1229495577@qq.com'
  send_resolved: true
  # 接收邮件的标题
  headers: {Subject: "alertmanager报警邮件"}
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'dev', 'instance']
EOF
  • 告警内容模板文件创建
cat > /opt/alertmanager/template/email.tmpl << \EOF
{{ define "email.html" }}
<table border="1">
  <tr>
      <td>报警项</td>
      <td>实例</td>
      <td>报警阀值</td>
      <td>开始时间</td>
      <td>告警信息</td>
  </tr>
  {{ range $i, $alert := .Alerts }}
  <tr>
        <td>{{ index $alert.Labels "alertname" }}</td>
        <td>{{ index $alert.Labels "instance" }}</td>
        <td>{{ index $alert.Annotations "value" }}</td>
        <td>{{ $alert.StartsAt }}</td>
        <td>{{ index $alert.Annotations "description" }}</td>
    </tr>
  {{ end }}
</table>
{{ end }}   EOF
  • docker 部署Alertmanager
docker run -d --name=alertmanager -p 9093:9093 -v /etc/localtime:/etc/localtime:ro
-v /opt/alertmanager/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml
-v /opt/alertmanager/template:/etc/alertmanager/template prom/alertmanager

访问 http://yourIp:9093,看到以下界面,部署成功

图片

配置
  • Prometheus.yml文件配置

图片

添加Alertmanager 的地址和Prometheus 的告警规则文件地址

  • 告警规则文件配置创建文件夹/opt/prometheus/rules
  mkdir -p /opt/prometheus/rules

/opt/prometheus/rules下创建 springboot-service-rule.yml

cd /opt/prometheus/rules
touch springboot-service-rule.yml

粘贴以下内容

groups:
- name: springboot-service-alerts
rules:
- alert: SpringBootServiceDown
# 这个地方是 PromQL 不能随写哦,是否宕机
  expr: up{job="springboot"} == 0
  # 持续时间
  for: 10s
  labels:
  # 告警级别
    severity: critical
  annotations:
    summary: "Spring Boot服务宕机"
    # {{ $labels.instance }} 其实就是ip,在prometheus 里可以看到
    description: "Spring Boot服务 {{ $labels.instance }} 已经在过去5秒内不可用了,请立即检查!"
#cpu使用率过高
- alert: SpringBootHighCPUUsage
  expr: (1 - avg by(instance) (irate(process_cpu_seconds_total{job="springboot"}[5m]))) * 100 > 80
  for: 10s
  labels:
    severity: warning
  annotations:
    summary: "Spring Boot服务CPU使用率过高"
    description: "实例 {{ $labels.instance }} 的CPU使用率超过80%已经持续了10分钟,请检查服务负载或进行性能调优!"
#内存使用过高
- alert: SpringBootHighMemoryUsage
  expr: (container_memory_usage_bytes{job="springboot"} / container_spec_memory_limit_bytes{job="springboot"}) * 100 > 80
  for: 10m
  labels:
    severity: warning
  annotations:
    summary: "Spring Boot服务内存使用率过高"
    description: "实例 {{ $labels.instance }} 的内存使用率超过80%已经持续了10分钟,请检查内存泄露或进行资源调整!"

# 这里可以添加更多针对Spring Boot服务的告警规则

这个时候我们停掉以前的Prometheus,然后挂在这个规则文件重新创建容器并运行

#停止
docker stop CONTAINER ID
重建新创建容器并启动
docker run -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
-v /opt/prometheus/rules/rule.yml:/etc/prometheus/rules/rule.yml --name prometheus3 prom/prometheus

然后停掉你的 springboot 项目

docker stop CONTAINER ID

在Prometheus你会看到:

图片

  • 在Alertmanager你会看到

图片

到这里,我们还有最后一步啦,配置邮件告警,我们的微服务之服务告警就完结散花啦

九、配置告警

首先带大家看一下alertmanagr的配置文件

global:
resolve_timeout: 5m
# 发件人
smtp_from: 1229495@qq.com'
# 邮箱服务器的 POP3/SMTP 主机配置 smtp.qq.com 端口为 465 或 587
smtp_smarthost: 'smtp.qq.com:465'
# 用户名
smtp_auth_username: 122945577@qq.com'
# 授权码 或 密码
smtp_auth_password: '你的qq授权码'
smtp_require_tls: false
smtp_hello: 'qq.com'
templates:
# 指定预警内容模板
- '/etc/alertmanager/template/email.tmpl'
route:
# 指定通过什么字段进行告警分组(如:alertname=A和alertname=B的将会被分导两个组里面)
group_by: ['alertname']
# 在组内等待所配置的时间,如果同组内,5 秒内出现相同报警,在一个组内出现
group_wait: 5s
# 如果组内内容不变化,合并为一条警报信息,5 分钟后发送
group_interval: 5m
# 发送告警间隔时间 s/m/h,如果指定时间内没有修复,则重新发送告警
repeat_interval: 5m
# 默认的receiver。如果一个报警没有被任何一个route匹配,则发送给默认的接收器
receiver: 'justrydeng163email'
#子路由(上面所有的route属性都由所有子路由继承,并且可以在每个子路由上进行覆盖)
routes:
# 当触发当前预警的prometheus规则满足:标签alarmClassify的为normal时(标签名、标签值可以自定义,只要和编写的prometheus的rule里面设置的标签呼应上即可),往justrydeng163email发送邮件
- receiver: justrydeng163email
  match_re:
    alarmClassify: normal
@

配置文件里给大家解释的很详细,这里就不过都赘述,相信大家看完注释因该知道该怎么配置了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首席架构师专栏

喜欢请点赞,么么哒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值