Spring Boot Actuator:打造高效监控系统
🌟 一、核心目标:让应用“可被监控”和“可被管理”
Spring Boot Actuator 提供了一系列 预定义的“端点(Endpoints)”,比如:
/actuator/health→ 查看健康状态/actuator/info→ 查看应用信息/actuator/metrics→ 查看性能指标/actuator/env→ 查看环境变量/actuator/loggers→ 动态调整日志级别
这些端点默认通过 HTTP 暴露,供运维、监控系统或开发者访问。
🚪 二、默认 HTTP 路由规则
✅ 默认路径格式:
/actuator/{id}
| 端点 ID | 默认 URL |
|---|---|
| health | /actuator/health |
| info | /actuator/info |
| metrics | /actuator/metrics |
| beans | /actuator/beans |
🔹 这个
/actuator是一个安全前缀,防止和其他业务接口冲突。
🔹 如果你的应用是微服务,这个路径就是外部系统(如 Prometheus、Zabbix)采集数据的入口。
🛠️ 三、6.3.1 自定义管理端点路径(base-path 和 path-mapping)
有时候你不想用 /actuator,比如:
- 已经被其他功能占用了
- 想要更简洁的路径(如
/health而不是/actuator/health) - 想统一管理入口为
/manage
1. 修改基础路径:management.endpoints.web.base-path
management.endpoints.web.base-path=/manage
✅ 效果:
- 原来的
/actuator/health→ 变成/manage/health - 所有端点都从
/actuator→/manage
📌 注意:这个路径是相对于
server.servlet.context-path的。
比如你设置了server.servlet.context-path=/api,那么最终路径是/api/manage/health
2. 单独映射某个端点:management.endpoints.web.path-mapping
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck
✅ 效果:
/actuator/health→ 映射到/healthcheck- 其他端点还是
/info,/metrics等
🎯 用途:你想让健康检查路径更语义化,比如
/healthcheck更符合运维习惯。
🔄 四、6.3.2 使用独立的管理端口(management.server.port)
默认行为:
所有 Actuator 端点和业务接口共用同一个端口(如 8080)。
问题:
- 安全风险:所有端点暴露在公网
- 路由混乱:业务和管理接口混在一起
解决方案:用独立端口
management.server.port=8081
✅ 效果:
- 业务接口:
http://localhost:8080/ - 管理接口:
http://localhost:8081/actuator/health
🔐 好处:
- 可以只对内网开放 8081 端口
- 主应用用 HTTPS,管理端用 HTTP(或反过来)
- 避免管理流量影响业务性能
⚠️ 注意:在 Cloud Foundry 等 PaaS 平台上,默认只转发 8080 端口,你需要手动配置路由才能访问自定义管理端口。
🔐 五、6.3.3 为管理端配置独立的 SSL(HTTPS)
你可以让:
- 主应用走 HTTPS(443)
- 管理端走 HTTP(8081),或
- 主应用走 HTTP,管理端走 HTTPS
示例:主应用 HTTPS,管理端 HTTP
# 主应用 HTTPS
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret# 管理端 HTTP
management.server.port=8080
management.server.ssl.enabled=false
示例:两者都用 HTTPS,但证书不同
# 主应用
server.port=8443
server.ssl.key-store=classpath:main.jks# 管理端
management.server.port=8081
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
🎯 用途:管理端使用内部 CA 签发的证书,主应用使用公网证书。
🧱 六、6.3.4 绑定管理端到特定地址(management.server.address)
你想让管理端只能从本机访问,防止外部攻击。
management.server.port=8081
management.server.address=127.0.0.1
✅ 效果:
- 只有
localhost能访问http://127.0.0.1:8081/actuator/... - 外部 IP 访问会被拒绝
🔐 安全最佳实践:在生产环境中,管理端只绑定到内网或本地回环地址。
⚠️ 注意:只有当
management.server.port ≠ server.port时,才能设置management.server.address。
🔒 七、6.3.5 关闭 HTTP 端点(完全禁用)
如果你不想通过 HTTP 暴露任何管理接口,有两种方式:
方法一:关闭管理端口
management.server.port=-1
✅ 效果:所有 HTTP 管理端点完全不可访问
适合:你只通过 JMX 或其他方式监控
方法二:排除所有暴露的端点
management.endpoints.web.exposure.exclude=*
或者:
management.endpoints.web.exposure.include= # 留空
🔁 区别:
port=-1是彻底关闭 HTTP 服务exclude=*是保留端口,但不暴露任何端点(未来可以动态开启)
📊 总结:一张表看懂关键配置
| 配置项 | 作用 | 示例值 | 说明 |
|---|---|---|---|
management.endpoints.web.base-path | 修改管理端基础路径 | /manage | 所有端点前缀 |
management.endpoints.web.path-mapping.health | 单独映射某个端点 | healthcheck | /health → /healthcheck |
management.server.port | 独立管理端口 | 8081 | 推荐用于生产 |
management.server.ssl.* | 管理端独立 SSL | key-store=... | 可与主应用不同 |
management.server.address | 绑定管理端 IP | 127.0.0.1 | 提高安全性 |
management.server.port=-1 | 完全关闭 HTTP 管理 | -1 | 最彻底 |
management.endpoints.web.exposure.exclude=* | 不暴露任何端点 | * | 保留端口,关闭暴露 |
💡 实际建议(生产环境最佳实践)
# 1. 使用独立管理端口
management.server.port=8081# 2. 只允许本地访问管理端
management.server.address=127.0.0.1# 3. 使用简洁路径(可选)
management.endpoints.web.base-path=/# 4. 映射健康检查为 /health
management.endpoints.web.path-mapping.health=health# 5. 按需暴露端点(安全!)
management.endpoints.web.exposure.include=health,info,metrics,loggers# 6. 关闭敏感端点(如 env、beans)
management.endpoints.web.exposure.exclude=env,beans
🧩 为什么这些配置很重要?
| 场景 | 如何受益 |
|---|---|
| 安全审计 | 管理端只对内网开放,降低攻击面 |
| 微服务监控 | Prometheus 抓取 /actuator/metrics |
| 故障排查 | 运维通过 /actuator/env 查看配置 |
| 动态调优 | 通过 /actuator/loggers 调整日志级别 |
| CI/CD 发布 | 健康检查 /actuator/health 决定是否上线 |
这套机制让你的应用不再是“黑盒”,而是具备了 可观测性(Observability) 的现代云原生服务。
如果你需要,我可以给你一个完整的 application-prod.yml 示例,展示生产环境下的安全配置。
