Spring Boot Actuator监控运维详解
定位:第 06 篇,讲透 Actuator 端点体系、健康检查与探针、指标(Micrometer)、日志管理与端点安全纪律
适用版本:Spring Boot 3.x(JDK 17+)
目录
一、端点体系
1.1 定位
Actuator 提供生产级监控与运维能力 :查看应用健康、指标、配置、容器状态,并执行部分操作(调日志、停机)。引入 spring-boot-starter-actuator 即开启。
1.2 传输与路径
HTTP:/actuator/{endpointId} ← 主流
JMX:管理 Bean 形式
1.3 常用端点
| 端点 | 用途 |
|---|---|
health |
应用与依赖健康状态 |
info |
应用元信息(版本/构建) |
metrics |
指标(配合 Prometheus) |
env / configprops |
环境/配置属性快照 |
beans / conditions |
容器 Bean / 自动配置条件快照 |
loggers |
查看/修改日志级别 |
threaddump / heapdump |
线程/堆转储(诊断) |
shutdown |
优雅停机(默认关闭,危险) |
1.4 暴露控制
默认:Web 只暴露 health
management.endpoints.web.exposure.include=health,info,metrics,prometheus
management.endpoints.web.exposure.exclude=...
单个端点开关:management.endpoint.{id}.enabled
纪律:最小暴露原则------默认关、按需开,敏感端点严格保护(见第四节)。
二、健康检查
2.1 HealthIndicator
/actuator/health 聚合各 HealthIndicator 的结果:
内置:数据库、Redis、磁盘、ping、Mail 等(按依赖自动装配)
自定义:
@Component
public class DownstreamHealth implements HealthIndicator {
public Health health() {
boolean ok = checkDownstream();
return ok ? Health.up().build() : Health.down().withDetail("reason", "...").build();
}
}
状态:UP / DOWN / OUT_OF_SERVICE;聚合取最差状态。
2.2 探针(K8s 集成)
management.endpoint.health.probes.enabled=true
/actuator/health/liveness ← 存活:进程是否健康,失败则重启
/actuator/health/readiness ← 就绪:能否接流量,失败则摘流
区分意义:启动慢的应用"活着但未就绪"------liveness 通过避免被误杀,readiness 未通过则不接流量(无损上线,呼应 06 篇无损上下线)。
2.3 细节展示控制
management.endpoint.health.show-details=never/when-authorized/always
生产建议 when-authorized(鉴权后可见)或 never,不向公网暴露依赖细节。
三、指标
3.1 Micrometer
Boot 用 Micrometer 作指标门面,内置大量自动指标:
JVM:内存、GC、线程
HTTP:server.http.server.requests(含 uri/method/status 标签)
数据源、线程池、任务调度等
3.2 自定义指标
java
@Component
class OrderMetrics {
private final Counter orderCounter;
OrderMetrics(MeterRegistry registry) {
orderCounter = registry.counter("orders.created");
}
void onCreate() { orderCounter.increment(); }
}
类型:Counter(计数)、Gauge(瞬时值)、Timer(耗时)。
3.3 对接监控系统
引入 micrometer-registry-prometheus
→ /actuator/prometheus 输出 Prometheus 格式
→ Prometheus 抓取 + Grafana 展示
核心告警三件套(呼应可观测篇):成功率下跌、P99 延迟突增、线程池/连接池积压------都可由内置指标推导。
四、日志与安全
4.1 loggers 端点(排障利器)
GET /actuator/loggers/com.demo 查看级别
POST /actuator/loggers/com.demo {"configuredLevel":"DEBUG"}
→ 运行期临时开 DEBUG 排障,排完改回,无需重启
4.2 端点安全纪律
| 风险 | 措施 |
|---|---|
| 敏感信息泄露(env 含配置、heapdump 含内存) | 最小暴露 + 鉴权(Spring Security 保护)或仅内网 |
| 危险操作(shutdown) | 默认不启用;确需则强鉴权 |
| 与业务端口混用 | 独立管理端口 management.server.port=8081,防火墙隔离 |
management.server.port=8081 ← 管理端口与业务分离
生产基线:独立端口 + 最小暴露 + 敏感端点鉴权/内网 + 探针只开 health。
五、总结
- 端点体系 :HTTP
/actuator/{id}提供健康/指标/配置/容器快照/运维操作;默认只暴露 health,按需 include,最小暴露。 - 健康检查:HealthIndicator 聚合(内置 + 自定义);K8s 探针分 liveness/readiness,支撑无损上下线;细节按需展示。
- 指标:Micrometer 门面 + 内置自动指标 + 自定义 Counter/Timer;Prometheus 对接,成功率/延迟/积压三件套告警。
- 运维与安全:loggers 运行期调级排障;敏感/危险端点鉴权或内网;管理端口与业务端口分离。
六、常见高频面试题
1. Actuator 是什么?有哪些常用端点?
要点:Spring Boot 提供的生产级监控与运维模块,通过 HTTP(/actuator/)或 JMX 暴露端点。常用:health(健康)、info(元信息)、metrics(指标)、env/configprops(配置)、beans/conditions(容器快照)、loggers(日志级别管理)、threaddump/heapdump(诊断)、shutdown(停机,默认关)。引入 actuator starter 后按需暴露,默认只开 health。
2. /actuator/health 是怎么工作的?如何自定义?
要点:聚合各 HealthIndicator 的结果,状态取最差(UP/DOWN/OUT_OF_SERVICE)。Boot 按依赖自动装配内置检查(数据库、Redis、磁盘等);实现 HealthIndicator 接口注册自定义检查(如探下游服务),返回 Health.up()/down() 及详情。可分组、可控制详情展示(show-details)。它是容器编排健康探针与告警的基础。
3. liveness 和 readiness 探针的区别?为什么都要有?
要点:liveness 表示进程是否存活------失败则重启容器;readiness 表示是否准备好接流量------失败则暂时摘流但不重启。启动慢或临时繁忙的应用"活着但未就绪",只有 liveness 会被误杀或接到流量被打垮。区分二者实现:启动期不接流量(无损上线)、临时过载摘流自愈而不重启。Boot 通过 health.probes.enabled 提供 /health/liveness 与 /health/readiness。
4. Boot 怎么对接 Prometheus 监控?
要点:引入 micrometer-registry-prometheus,Actuator 自动暴露 /actuator/prometheus 端点输出 Prometheus 文本格式;Prometheus 定时抓取该端点,存入时序库,Grafana 展示。内置指标覆盖 JVM、HTTP 请求、数据源等;业务指标用 Micrometer 的 Counter/Timer/Gauge 自定义。告警关注成功率、延迟分位数、资源积压。
5. 如何在运行期临时调整日志级别排查问题?
要点:用 loggers 端点:POST /actuator/loggers/{logger名},body 传 {"configuredLevel":"DEBUG"},即时生效无需重启;排障完改回原级别(或设 null 恢复继承)。这是线上排障利器------动态打开特定包的 DEBUG 看细节。注意该端点敏感,应鉴权/内网保护,且临时提级后及时恢复,避免日志风暴。
6. Actuator 端点有哪些安全风险?如何防护?
要点:风险:env/heapdump 泄露配置与内存敏感数据,shutdown 可远程停机,threaddump 暴露内部。防护:最小暴露(默认只 health,按需 include);敏感端点用 Spring Security 鉴权或限制内网访问;管理端口独立(management.server.port)并用防火墙隔离;show-details 不对外。生产基线是"独立端口 + 最小暴露 + 强鉴权"。
7. 如何自定义业务指标?
要点:注入 Micrometer 的 MeterRegistry,创建合适类型:Counter 计数(如订单创建数)、Timer 耗时(如接口延迟)、Gauge 瞬时值(如队列长度)。业务关键路径埋点(如下单成功/失败、外部调用耗时),配合标签维度(业务类型)便于聚合。这些业务指标 + 内置指标构成完整的可观测面,接入 Prometheus 后可告警。
8. management.server.port 有什么作用?
要点:把 Actuator 管理端点与业务端口分离到独立端口。好处:防火墙可只对内网/运维网开放管理端口,业务端口对外,敏感端点天然隔离;监控抓取、探针、运维操作走管理端口,不影响业务流量与安全策略。是生产部署的推荐做法。
9. @Endpoint 如何自定义一个新端点?
要点:用 @Endpoint(id="xxx") 标注类,方法上用 @ReadOperation(GET)、@WriteOperation(POST)、@DeleteOperation 声明操作,参数可绑定路径/请求体。注册为 Bean 后即可通过 /actuator/xxx 访问。适合暴露自定义运维能力(如手动触发缓存刷新、查看内部状态)。自定义端点同样要遵守暴露与鉴权纪律。
10. 生产环境推荐的 Actuator 配置基线?
要点:① 独立管理端口(management.server.port)防火墙隔离;② 最小暴露:health、info、prometheus 为主,敏感端点(env/heapdump/shutdown)不开或强鉴权;③ 开启探针(health.probes)支撑 K8s 无损上下线;④ health 详情 when-authorized;⑤ 接入 Prometheus+Grafana,围绕成功率/延迟/积压设告警。原则:监控能力全开,暴露面最小。
