前面咱们把 Spring Boot 项目的性能、安全、异步能力都拉满了,但项目上线后你可能会慌:“接口调用成功率多少?JVM 内存用了多少?数据库连接池满了吗?”—— 就像奶茶店开业后,不知道客流量、原料库存、设备状态,遇到问题只能等用户投诉,被动又狼狈。
Spring Boot 生态早就备好了解决方案:Actuator(暴露系统指标)+ Prometheus(采集指标)+ Grafana(可视化监控) ,三者组合就是系统的 “运营监控中心”,像奶茶店的 “实时数据看板”:能看到 “接口调用量(客流量)”“JVM 内存占用(原料库存)”“接口响应时间(出餐速度)”,甚至能设置告警(原料不足自动提醒),让你主动掌握系统状态,提前排查问题。
今天全程聚焦 Spring Boot 生态,以图书管理系统为案例,手把手实现 “指标暴露 + 数据采集 + 可视化监控 + 告警配置”,新手也能跟着搭建,搞定企业级运维监控!
一、先搞懂:监控三件套是什么?(奶茶店类比)
1. 核心组件分工(监控 = 奶茶店运营中心)
| 组件 | 类比奶茶店 | 作用说明(Spring Boot 中) |
|---|---|---|
| Spring Boot Actuator | 数据采集器(统计客流量、原料库存) | 暴露系统核心指标(CPU、内存、接口调用量、数据库连接数),是监控的 “数据来源” |
| Prometheus | 数据存储 + 分析(记录历史运营数据) | 定时采集 Actuator 暴露的指标,存储在时序数据库中,支持多维度查询 |
| Grafana | 可视化看板(运营数据大屏) | 将 Prometheus 的指标转换成图表(折线图、饼图),支持自定义仪表盘,直观展示系统状态 |
2. 为什么要做监控?(企业 3 大核心需求)
实时掌握状态:不用登录服务器,就能看到 JVM 内存、接口响应时间、数据库连接池等核心数据;提前预警问题:设置阈值(如 “CPU 使用率超 80% 告警”“接口响应时间超 500ms 告警”),提前发现隐患;快速定位故障:接口报错、系统卡顿时,通过监控数据快速定位瓶颈(是 JVM 内存泄漏,还是数据库慢查询)。
3. Spring Boot 生态优势
开箱即用:Actuator 是 Spring Boot 官方依赖,配置简单,不用写复杂采集代码;无缝整合:Prometheus 和 Grafana 有成熟的 Spring Boot 适配方案,几分钟就能打通数据链路;自定义灵活:支持新增业务指标(如 “图书借阅次数”“接口调用成功率”),贴合业务需求。
二、实操 1:Spring Boot 整合 Actuator(暴露系统指标)
Actuator 是监控的基础,负责暴露系统原生指标(JVM、Tomcat、数据库连接池)和自定义指标,配置超简单,两步就能搞定。
步骤 1:加依赖(Spring Boot 官方监控依赖)
xml
<!-- Spring Boot Actuator核心依赖(暴露指标) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.7.10</version>
</dependency>
<!-- Prometheus适配依赖(Actuator指标格式转换,供Prometheus采集) -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.10.6</version>
</dependency>
步骤 2:配置 Actuator(application-dev.yml)
默认情况下,Actuator 只暴露少量指标,需要配置开启全部核心指标,并开放访问端口(避免被拦截):
yaml
spring:
application:
name: book-manage-system # 应用名称(Prometheus采集时标识)
# Actuator配置(核心)
management:
endpoints:
web:
exposure:
include: '*' # 暴露所有监控端点(生产环境可按需开放,如health,prometheus,metrics)
base-path: /actuator # 监控端点前缀(访问路径:http://localhost:8080/actuator/xxx)
endpoint:
health:
show-details: always # 健康检查端点显示详细信息(如数据库、Redis连接状态)
metrics:
tags:
application: ${spring.application.name} # 给所有指标加应用标签(多应用监控时区分)
# 适配Prometheus(指定指标采集器)
prometheus:
metrics:
export:
enabled: true # 启用Prometheus指标导出
步骤 3:测试 Actuator 指标暴露
启动 Spring Boot 项目,访问以下端点,验证指标是否正常暴露:
健康检查:,返回系统健康状态(数据库、Redis 等组件是否正常):
http://localhost:8080/actuator/health
json
{
"status": "UP",
"components": {
"db": {"status": "UP", "details": {"database": "MySQL", "hello": "Hello"}},
"redis": {"status": "UP", "details": {"version": "6.2.6"}},
"diskSpace": {"status": "UP", "details": {"free": 102400000000, "total": 512000000000}}
}
}
Prometheus 格式指标:,返回大量时序指标(如
http://localhost:8080/actuator/prometheus(JVM 已用内存)、
jvm_memory_used_bytes(接口调用次数)),这些指标会被 Prometheus 采集。
http_server_requests_seconds_count
三、实操 2:部署 Prometheus(采集监控指标)
Prometheus 的核心作用是 “定时拉取 Actuator 暴露的指标,存储起来”,相当于奶茶店的 “数据记录员”,按固定频率统计运营数据。
步骤 1:安装 Prometheus(本地测试 / 服务器部署)
本地测试(Windows):
官网下载 Prometheus 安装包(https://prometheus.io/download/);解压后修改配置文件(核心是配置 Spring Boot 项目的指标地址);双击
prometheus.yml启动,访问
prometheus.exe进入 Prometheus 界面。 服务器部署(Linux):用 Docker 一键启动:
http://localhost:9090
bash
docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus
步骤 2:配置 Prometheus(采集 Spring Boot 指标)
修改,添加 Spring Boot 项目的采集配置:
prometheus.yml
yaml
global:
scrape_interval: 15s # 采集频率:每15秒拉取一次指标(生产环境可设30s)
scrape_configs:
# 采集Spring Boot项目指标(自定义任务名)
- job_name: "book-manage-system"
metrics_path: "/actuator/prometheus" # Actuator暴露的Prometheus指标路径
static_configs:
# 配置Spring Boot项目的地址(多个实例可添加多个targets)
- targets: ["192.168.1.100:8080"] # 本地测试填"localhost:8080",服务器填项目IP+端口
步骤 3:验证 Prometheus 采集成功
启动 Prometheus 后,访问;点击 “Status”→“Targets”,查看
http://localhost:9090任务的 “State” 是否为 “UP”(UP 表示采集成功);点击 “Graph”,输入指标名(如
book-manage-system),点击 “Execute”,能看到指标的时序数据(折线图),说明采集成功。
jvm_memory_used_bytes
四、实操 3:部署 Grafana(可视化监控大屏)
Prometheus 的图表功能简陋,Grafana 能把指标转换成 “高颜值、自定义” 的监控大屏,像奶茶店的 “运营数据看板”,直观展示所有核心指标。
步骤 1:安装 Grafana(本地 / 服务器部署)
本地测试(Windows):
官网下载 Grafana 安装包(https://grafana.com/grafana/download);双击安装,启动后访问,默认账号密码
http://localhost:3000(首次登录需修改密码)。 服务器部署(Linux):Docker 一键启动:
admin/admin
bash
docker run -d -p 3000:3000 --name grafana grafana/grafana
步骤 2:Grafana 连接 Prometheus(添加数据源)
登录 Grafana 后,点击左侧 “齿轮图标(Configuration)”→“Data Sources”→“Add data source”;选择 “Prometheus”,配置 Prometheus 地址:
URL:(本地测试填
http://192.168.1.100:9090,服务器填 Prometheus 的 IP + 端口);其他默认,点击 “Save & test”,显示 “Data source is working” 表示连接成功。
http://localhost:9090
步骤 3:导入 Spring Boot 监控仪表盘(开箱即用)
Grafana 有大量现成的 Spring Boot 监控仪表盘模板,不用手动配置图表,直接导入即可:
点击左侧 “+”→“Import”,输入仪表盘 ID:(Spring Boot 2.x 监控模板,官方推荐);选择数据源为之前配置的 Prometheus,点击 “Import”;导入成功后,就能看到完整的 Spring Boot 监控大屏,包含:
12856
系统指标:CPU 使用率、内存使用、磁盘空间;JVM 指标:堆内存、非堆内存、GC 次数、STW 时间;应用指标:接口调用次数、响应时间、错误率;数据库指标:连接池活跃数、空闲数、查询耗时。
步骤 4:自定义业务指标(贴合图书管理系统)
默认指标满足系统监控,但企业还需要业务指标(如 “图书借阅次数”“新增图书数”),用 Micrometer 自定义指标:
步骤 1:添加自定义指标配置
java
运行
package com.example.springbootdemo.config;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 自定义业务指标配置
*/
@Configuration
public class MetricsConfig {
/**
* 图书借阅次数计数器(累计指标)
*/
@Bean
public Counter borrowBookCounter(MeterRegistry registry) {
return Counter.builder("book.borrow.count") // 指标名(自定义,规范:业务.操作.类型)
.tag("application", "book-manage-system") // 标签(用于区分维度)
.description("图书借阅总次数") // 指标描述
.register(registry);
}
/**
* 图书新增次数计数器
*/
@Bean
public Counter addBookCounter(MeterRegistry registry) {
return Counter.builder("book.add.count")
.tag("application", "book-manage-system")
.description("图书新增总次数")
.register(registry);
}
}
步骤 2:在业务代码中使用自定义指标
修改和
BookService,在核心业务中调用计数器:
BorrowService
java
运行
@Service
public class BorrowService {
// 注入自定义借阅次数计数器
private final Counter borrowBookCounter;
// 构造注入(避免@Autowired)
public BorrowService(Counter borrowBookCounter) {
this.borrowBookCounter = borrowBookCounter;
}
public boolean borrowBook(Long bookId, Long userId) {
// 核心业务逻辑(略)
boolean success = true;
// 借阅成功后,计数器+1
if (success) {
borrowBookCounter.increment(); // 指标累加
}
return success;
}
}
@Service
public class BookService extends ServiceImpl<BookMapper, Book> implements IService<Book> {
private final Counter addBookCounter;
public BookService(Counter addBookCounter) {
this.addBookCounter = addBookCounter;
}
@Override
public boolean save(Book book) {
boolean success = super.save(book);
if (success) {
addBookCounter.increment(); // 新增图书成功,计数器+1
}
return success;
}
}
步骤 3:在 Grafana 中添加自定义指标图表
进入之前导入的仪表盘,点击 “Add panel”→“Add visualization”;数据源选择 Prometheus,指标名输入(Counter 指标自动加
book_borrow_count_total后缀);图表类型选择 “Stat”(统计总数)或 “Graph”(趋势图),点击 “Apply”;保存仪表盘后,就能看到 “图书借阅次数”“新增图书数” 的实时数据,贴合业务场景。
_total
五、实操 4:配置告警(提前预警问题)
监控的核心价值之一是 “提前预警”,比如 “CPU 使用率超 80%”“接口错误率超 5%” 时,自动发送告警通知(邮件、钉钉、短信)。
步骤 1:Grafana 配置告警规则
进入监控仪表盘,点击某图表→“Edit”→“Alert”→“Create alert rule”;配置告警条件(以 “接口错误率超 5%” 为例):
指标:(5xx 错误接口数) /
sum(http_server_requests_seconds_count{status=~"5.."}(总接口数) > 0.05(5%);评估时间:For 1m(连续 1 分钟满足条件触发告警); 配置通知渠道:点击左侧 “Alerting”→“Contact points”→“Add contact point”,选择通知方式(如钉钉机器人、邮件),填写配置信息(如钉钉机器人 WebHook);关联通知渠道:在告警规则中选择创建的通知渠道,点击 “Save”。
sum(http_server_requests_seconds_count)
步骤 2:测试告警效果
模拟接口报错(如故意抛出异常),当错误率连续 1 分钟超 5% 时,Grafana 会触发告警,通知渠道会收到消息(如钉钉机器人发送 “【告警】接口错误率超 5%,请及时排查”)。
六、避坑总结:监控三件套的 6 个新手坑
Actuator 端点未开放,Prometheus 采集失败:
坑:只配置了
management.endpoints.web.exposure.include,没开放
health,导致 Prometheus 采集不到指标;解决:生产环境按需开放(
prometheus),测试环境可设
health,prometheus,metrics。
*
Prometheus 配置的 targets 地址错误:
坑:填了但 Prometheus 部署在另一台服务器,导致采集失败(State 为 DOWN);解决:targets 填 Spring Boot 项目的 “外网可访问 IP + 端口”,确保 Prometheus 能 ping 通项目。
localhost:8080
Grafana 数据源 URL 配置错误:
坑:Prometheus 部署在服务器,Grafana 填了,导致连接失败;解决:URL 填 Prometheus 的服务器 IP + 端口(如
localhost:9090)。
http://192.168.1.101:9090
自定义指标名不规范,难以维护:
坑:指标名乱取(“add_book”),多指标时混淆;解决:遵循 “业务。操作。类型” 规范(如
jieshu_count“book.add.count”),加标签区分维度。
book.borrow.count
采集频率设太低 / 太高,影响性能:
坑:Prometheus设 1 秒(太高,占用项目资源)或 10 分钟(太低,监控不实时);解决:生产环境设 30 秒 – 1 分钟,平衡实时性和性能。
scrape_interval
告警阈值设置不合理,频繁误告警:
坑:CPU 使用率超 50% 就告警,高峰期频繁触发,导致告警疲劳;解决:根据系统实际负载调整阈值(如 CPU 超 80%、接口响应时间超 500ms),设置 “连续触发时间”(如 1 分钟)。
总结:监控是项目上线的 “安全网”
Spring Boot Actuator+Prometheus+Grafana 的组合,让你从 “项目上线后两眼一抹黑” 变成 “实时掌握系统状态”:Actuator 负责暴露指标,Prometheus 负责采集存储,Grafana 负责可视化和告警,三者各司其职,构成企业级监控闭环。
就像奶茶店的运营监控中心,能提前发现 “原料不足”“设备故障”,避免影响生意;系统监控能提前预警 “内存泄漏”“接口报错”,避免故障扩大。配合之前的性能优化、安全防护、异步处理,你的 Spring Boot 项目不仅能 “跑起来”,还能 “稳定跑、可监控、易运维”,完全满足企业上线标准。
