Article

Spring Boot Actuator

更新于:2026-07-14

第1章:Spring Boot Actuator 概述

1.1 什么是 Spring Boot Actuator

概念名称说明注意事项
Spring Boot Actuator是 Spring Boot 提供的一个用于监控和管理应用程序的模块,通过暴露一系列预定义的 HTTP 或 JMX 端点(endpoints),帮助开发者了解应用的运行状态、性能指标、配置信息等。Actuator 本身不开启任何安全防护,生产环境中必须配合安全措施使用。
端点(Endpoint)Actuator 提供的每一个监控功能入口,如 /health/info/metrics 等,每个端点对应一类运行时数据。并非所有端点默认都对外暴露,部分敏感端点需手动启用。
生产就绪(Production-ready)Actuator 的设计目标是让应用具备”生产就绪”能力,即无需额外开发即可获得基础监控能力。“生产就绪”不等于”生产可用”,仍需结合安全、权限、网络策略进行加固。

1.2 Actuator 的核心作用与应用场景

核心作用说明典型应用场景
应用健康检查通过 /health 端点判断应用是否正常运行,常用于 Kubernetes、Docker 等容器平台的探针检测。容器编排系统中的 Liveness 和 Readiness 探针。
运行时指标收集通过 /metrics 获取 JVM 内存、线程、HTTP 请求延迟等性能数据,便于性能分析和告警。集成 Prometheus + Grafana 实现可视化监控。
配置与环境查看通过 /env/configprops 查看当前生效的配置项和环境变量,便于排查配置问题。开发调试阶段快速验证配置是否生效。
自动配置诊断通过 /conditions 查看自动配置的启用/未启用原因,辅助理解 Spring Boot 自动装配机制。分析为何某个自动配置未生效。
Bean 依赖关系查看通过 /beans 查看容器中所有 Bean 及其依赖关系,有助于理解应用结构。调试循环依赖或 Bean 注入失败问题。
日志级别动态调整通过 /loggers 动态修改日志级别,无需重启应用即可开启 DEBUG 日志。生产环境临时开启详细日志进行问题排查。

1.3 生产环境使用建议与安全注意事项

建议/注意事项说明风险提示
仅暴露必要端点通过 management.endpoints.web.exposure.include 显式指定需要暴露的端点,避免全部暴露。暴露过多端点可能导致敏感信息泄露(如数据库连接、内部服务地址)。
敏感端点访问控制/env/beans/shutdown 等敏感端点启用身份认证(如 Spring Security)。未授权访问可能导致配置篡改、应用关闭等严重后果。
使用独立管理端口配置 management.server.port 使用独立端口运行 Actuator 端点,与主应用隔离。共用端口可能增加攻击面,独立端口可配合防火墙限制访问来源。
禁用危险端点如非必要,禁用 /shutdown 端点(设置 management.endpoint.shutdown.enabled=false)。启用后可通过 POST 请求关闭应用,极易被滥用。
启用 HTTPS在生产环境中为 Actuator 端点启用 HTTPS 加密传输。HTTP 明文传输可能被中间人窃取监控数据。
避免暴露在公网Actuator 端点应仅限内网或运维网络访问,禁止直接暴露在公网。公网暴露极大增加被扫描和攻击的风险。

第2章:快速入门与环境搭建

2.1 添加 Actuator 依赖(Maven/Gradle)

构建工具方法名称语法用途代码示例注意事项
Maven添加依赖pom.xml 中添加 <dependency>引入 Spring Boot Actuator 模块<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
确保项目已继承 spring-boot-starter-parent 或正确配置 dependencyManagement
Gradle添加依赖build.gradle 中使用 implementation引入 Spring Boot Actuator 模块dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
使用 Gradle Kotlin DSL 时语法略有不同,应写为 implementation("org.springframework.boot:spring-boot-starter-actuator")

2.2 启用和暴露健康端点(health)

配置项语法用途代码示例注意事项
启用 health 端点management.endpoint.health.enabled=true启用 health 端点功能(默认已启用)application.yml:
management:
endpoint:
health:
enabled: true
通常无需显式配置,除非之前被禁用。
暴露 health 端点(Web)management.endpoints.web.exposure.include=health将 health 端点通过 HTTP 暴露application.yml:
management:
endpoints:
web:
exposure:
include: health
若需暴露多个端点,可用逗号分隔,如 health,info,metrics
显示详细健康信息management.endpoint.health.show-details=always / never / when-authorized控制是否显示健康详情application.yml:
management:
endpoint:
health:
show-details: when-authorized
生产环境建议设为 when-authorizednever,避免信息泄露。
按角色控制详情显示management.endpoint.health.roles=admin指定查看详细信息所需的角色management:
endpoint:
health:
roles: admin
需配合 Spring Security 使用,否则无效。

2.3 访问默认端点并查看响应

端点路径HTTP 方法用途访问示例响应示例(简化)注意事项
/actuator/healthGET查看应用健康状态curl http://localhost:8080/actuator/health{"status":"UP"}若集成数据库、Redis 等,会显示各组件状态。
/actuator/infoGET查看自定义应用信息curl http://localhost:8080/actuator/info{"app":{"name":"demo","version":"1.0"}}需在 application.yml 中配置 info.* 属性。
/actuatorGET查看所有暴露的端点链接curl http://localhost:8080/actuator{"_links":{"self":{...},"health":{...}}}返回 HAL 格式导航信息,便于程序发现端点。
/actuator/envGET查看运行时环境变量curl http://localhost:8080/actuator/env{"activeProfiles":[],"propertySources":[...]}包含大量敏感信息,生产环境务必保护。
/actuator/metricsGET查看可用指标列表curl http://localhost:8080/actuator/metrics{"names":["jvm.memory.used","http.server.requests",...]}可进一步访问具体指标,如 /actuator/metrics/jvm.memory.used

注意:默认上下文路径为 /actuator,可通过 management.endpoints.web.base-path 修改。

第3章:核心端点详解

3.1 /health:应用健康状态监控

方法/配置语法用途代码示例注意事项
查看健康状态GET /actuator/health获取应用整体健康状态curl http://localhost:8080/actuator/health默认只返回 status(UP/DOWN/OUT_OF_SERVICE)
显示详细健康信息management.endpoint.health.show-details=always强制显示所有健康详情management:
endpoint:
health:
show-details: always
生产环境不推荐使用 always,建议使用 when-authorized
授权后显示详情management.endpoint.health.show-details=when-authorized登录后可查看健康详情management:
endpoint:
health:
show-details: when-authorized
需配合 Spring Security 实现认证
自定义健康指示器实现 HealthIndicator 接口添加自定义健康检查逻辑java\npublic class CustomHealthIndicator implements HealthIndicator {\n @Override\n public Health health() {\n return Health.up().withDetail("custom", "OK").build();\n }\n}Bean 名称需以 “HealthIndicator” 结尾,如 databaseHealthIndicator
健康组配置management.endpoint.health.group.custom.include=customHealth将自定义健康指示器归入特定组management:
endpoint:
health:
group:
custom:
include: customHealth
可创建多个健康组用于不同场景(如 readiness、liveness)

3.2 /info:自定义应用信息展示

方法/配置语法用途代码示例注意事项
配置静态信息info.<key>=<value>在配置文件中定义应用信息yaml\ninfo:\n app:\n name: MyApp\n version: 1.0.0\n build:\n time: 2025-09-28支持嵌套结构,会自动转换为 JSON 响应
Maven 项目自动填充${} 占位符pom.xml 读取项目信息yaml\ninfo:\n app:\n name: ${project.name}\n version: ${project.version}需启用 resource filtering,如 Maven 的 <filtering>true</filtering>
Gradle 项目填充使用 build-info 插件生成 build-info.propertiesbootBuildInfo {}build.gradle 中应用插件 spring-boot-plugin
动态信息提供实现 InfoContributor 接口提供运行时动态信息java\npublic class BuildTimeInfoContributor implements InfoContributor {\n @Override\n public void contribute(Info.Builder builder) {\n builder.withDetail("build.time", System.currentTimeMillis());\n }\n}可用于添加构建时间、Git 提交哈希等

3.3 /metrics:应用性能指标获取

方法/配置语法用途代码示例注意事项
查看指标列表GET /actuator/metrics获取所有可用指标名称curl http://localhost:8080/actuator/metrics返回指标名称数组
查看具体指标GET /actuator/metrics/<metric>获取指定指标的当前值和标签curl http://localhost:8080/actuator/metrics/jvm.memory.used可附加 tags 参数过滤,如 ?tag=area:heap
JVM 内存指标jvm.memory.used, jvm.memory.max监控 JVM 各区域内存使用情况/actuator/metrics/jvm.memory.used包含 heap、non-heap、各代空间
HTTP 请求指标http.server.requests监控所有 HTTP 请求的响应时间、次数/actuator/metrics/http.server.requests自动按 status、method、uri 等打标签
自定义指标注册MeterRegistry 提供的方法注册自定义监控指标java\n@Autowired\nprivate MeterRegistry registry;\nregistry.counter("request.count").increment();推荐通过依赖注入使用 MeterRegistry

3.4 /env:运行时环境变量查看

方法/配置语法用途代码示例注意事项
查看所有环境属性GET /actuator/env获取所有 PropertySource 及其属性curl http://localhost:8080/actuator/env包含 application.yml、系统变量、命令行参数等
查看特定属性源GET /actuator/env/<name>获取指定属性源的全部属性curl http://localhost:8080/actuator/env/applicationConfig:[application.yml]name 可从完整响应中获取
查看单个属性GET /actuator/env/<property>查询某个属性的值curl http://localhost:8080/actuator/env/server.port返回值可能被掩码(如密码类属性)
属性掩码机制默认行为防止敏感信息泄露属性名包含 passwordsecretkey 等会被掩码可通过 management.info.env.ignore-names 自定义
修改运行时属性POST /actuator/env动态添加环境属性需配合 @RefreshScope 使用此操作非常危险,生产环境应禁用或严格保护

3.5 /beans:Spring 容器 Bean 信息

方法/配置语法用途代码示例注意事项
查看所有 BeanGET /actuator/beans获取容器中所有 Bean 的定义和依赖关系curl http://localhost:8080/actuator/beans返回 JSON 包含 beanName、scope、type、dependencies 等
Bean 名称-唯一标识一个 BeanuserService通常为类名首字母小写
Bean 作用域singleton, prototype定义 Bean 的生命周期scope: singleton大多数 Bean 为单例
Bean 来源resource, definingClass指明 Bean 的配置位置definingClass: com.example.MyConfig有助于定位配置类
依赖关系dependencies[]列出该 Bean 依赖的其他 Bean"dependencies": ["dataSource", "userRepository"]可用于分析依赖图

3.6 /conditions:自动配置条件报告

方法/配置语法用途代码示例注意事项
查看自动配置报告GET /actuator/conditions获取自动配置的评估结果curl http://localhost:8080/actuator/conditions显示哪些配置类被应用,哪些未被应用
positiveMatches-条件匹配成功并启用的自动配置json\n"datasourceAutoConfiguration": {\n "notMatched": [],\n "matched": [ ... ]\n}表示该配置已生效
negativeMatches-条件不匹配或被排除的自动配置json\n"RabbitAutoConfiguration": {\n "notMatched": [\n { "condition": "RabbitAvailableCondition", ... }\n ]\n}帮助理解为何某功能未启用
exclusions-被显式排除的自动配置类@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })可在报告中看到排除原因
未满足条件condition, message显示具体未满足的条件"condition": "OnPropertyCondition", "message": "@ConditionalOnProperty missing my.feature.enabled"是排查自动配置问题的关键

3.7 /mappings:请求映射信息

方法/配置语法用途代码示例注意事项
查看所有映射GET /actuator/mappings获取所有 @RequestMapping 的端点信息curl http://localhost:8080/actuator/mappings包含 handler 方法、路径、HTTP 方法、生产者/消费者等
handler-处理请求的 Controller 方法handler: "com.example.UserController#getUser(String)"显示类名和方法签名
predicate-映射的匹配条件"predicate": "GET /user/{id}"包含路径、方法、参数等条件
details-详细信息(如 produces, consumes)produces: "application/json"用于理解内容协商行为
dispatcherTypeREQUEST, ASYNC请求分发类型dispatcherType: REQUEST通常为 REQUEST
可读性-结构化展示所有接口响应为树形结构,按 handler 分组便于生成 API 文档或进行安全审计

3.8 /threads:线程状态快照

方法/配置语法用途代码示例注意事项
获取线程快照GET /actuator/threads获取当前 JVM 所有线程的状态信息curl http://localhost:8080/actuator/threads返回线程名、ID、状态、栈轨迹等
线程状态RUNNABLE, BLOCKED, WAITING表示线程当前执行状态state: RUNNABLEBLOCKED 可能表示锁竞争
栈轨迹stackTrace[]线程执行的调用栈json\n"stackTrace": [\n { "className": "com.example.Service", "methodName": "process" }\n]用于分析死锁或性能瓶颈
线程名称-线程的逻辑名称threadName: "http-nio-8080-exec-1"Tomcat 线程池有固定命名模式
是否阻塞blockedCount, blockedTime统计线程被阻塞的次数和时间blockedCount: 5高频阻塞可能影响性能
死锁检测deadlock标记是否存在死锁"deadlocked": false若为 true 需立即排查

3.9 /shutdown:优雅关闭应用(需启用)

方法/配置语法用途代码示例注意事项
启用 shutdown 端点management.endpoint.shutdown.enabled=true启用 shutdown 功能yaml\nmanagement:\n endpoint:\n shutdown:\n enabled: true默认为 false,必须显式启用
关闭应用POST /actuator/shutdown发送 POST 请求关闭应用curl -X POST http://localhost:8080/actuator/shutdown应用将正常关闭,执行销毁逻辑
响应内容-关闭前的确认信息{"message":"Shutting down, bye..."}成功关闭后服务不再响应
安全风险-可远程关闭应用极其危险,生产环境严禁启用
替代方案-使用进程信号或容器管理kill -15 <pid>更安全的关闭方式

3.10 /loggers:日志级别动态调整

方法/配置语法用途代码示例注意事项
查看日志级别GET /actuator/loggers获取所有 logger 的当前级别curl http://localhost:8080/actuator/loggers包含 configuredLevel 和 effectiveLevel
查看特定 loggerGET /actuator/loggers/<name>获取指定 logger 的级别curl http://localhost:8080/actuator/loggers/com.examplename 为包名或类名
修改日志级别POST /actuator/loggers/<name>动态设置 logger 级别bash\ncurl -X POST http://localhost:8080/actuator/loggers/com.example \\\n -H "Content-Type: application/json" \\\n -d '{"configuredLevel": "DEBUG"}'立即生效,无需重启
重置日志级别POST /actuator/loggers/<name>重置为默认级别{ "configuredLevel": null }清除自定义设置
日志级别TRACE, DEBUG, INFO, WARN, ERROR日志严重程度等级configuredLevel: DEBUG设置过低可能导致日志爆炸

3.11 /heapdump:堆内存快照生成

方法/配置语法用途代码示例注意事项
生成堆转储GET /actuator/heapdump触发 JVM 生成 heap dump 文件curl http://localhost:8080/actuator/heapdump -o heap.hprof下载 hprof 格式文件
默认启用-通常默认启用无需额外配置可通过 management.endpoint.heapdump.enabled 控制
文件格式hprofJava 堆内存快照标准格式heap.hprof可用 JVisualVM、Eclipse MAT 等工具分析
性能影响-生成期间应用暂停STW(Stop-The-World)大堆内存应用可能暂停数秒至数十秒
存储位置临时目录文件写入系统临时目录由 JVM 决定确保磁盘空间充足
安全控制-防止未授权下载配合 Spring Security 保护堆转储可能包含敏感数据

3.12 /prometheus:Prometheus 监控集成(需依赖)

方法/配置语法用途代码示例注意事项
添加 Micrometer Prometheus 依赖Maven/Gradle 依赖启用 Prometheus 格式输出io.micrometer micrometer-registry-prometheus必须添加此依赖,否则端点 404
暴露 prometheus 端点management.endpoints.web.exposure.include=prometheus通过 Web 暴露yaml\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info,prometheus默认路径为 /actuator/prometheus
访问指标GET /actuator/prometheus获取 Prometheus 格式指标curl http://localhost:8080/actuator/prometheus返回文本格式,每行一个指标
Prometheus 格式-标准的 Prometheus 指标输出\n# HELP jvm_memory_used_bytes\njvm_memory_used_bytes{area="heap",...} 1.23e8可被 Prometheus Server 抓取
配置抓取Prometheus 配置文件添加 scrape jobyaml\n- job_name: 'spring_app'\n metrics_path: '/actuator/prometheus'\n static_configs:\n - targets: ['localhost:8080']需在 Prometheus 中配置目标

第4章:端点配置与安全控制

4.1 配置端点的启用与暴露(Web/JMX)

配置项语法用途代码示例注意事项
启用端点(通用)management.endpoint.<id>.enabled=true/false控制指定端点是否启用yaml\nmanagement:\n endpoint:\n shutdown:\n enabled: false默认多数端点已启用,shutdown 默认禁用
Web 暴露包含management.endpoints.web.exposure.include=* 或列表指定通过 HTTP 暴露的端点yaml\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info,metrics使用 * 会暴露所有启用的端点,生产环境慎用
Web 暴露排除management.endpoints.web.exposure.exclude=<endpoints>排除特定端点不通过 HTTP 暴露yaml\nmanagement:\n endpoints:\n web:\n exposure:\n exclude: env,beans与 include 互斥,优先级更高
JMX 暴露包含management.endpoints.jmx.exposure.include=* 或列表指定通过 JMX 暴露的端点yaml\nmanagement:\n endpoints:\n jmx:\n exposure:\n include: *JMX 通常用于本地监控工具(如 JConsole)
JMX 域名设置management.endpoint.jmx.domain设置 JMX MBean 的域名称yaml\nmanagement:\n endpoint:\n jmx:\n domain: org.springframework.boot默认为空,MBean 将在默认域注册

4.2 自定义端点访问路径(path)与基础路径(base-path)

配置项语法用途代码示例注意事项
自定义基础路径management.endpoints.web.base-path修改所有端点的根路径yaml\nmanagement:\n endpoints:\n web:\n base-path: /manage默认为 /actuator,修改后所有端点前缀变更
自定义单个端点路径management.endpoints.web.path-mapping.<id>为特定端点设置别名路径yaml\nmanagement:\n endpoints:\n web:\n path-mapping:\n health: /status\n prometheus: /metrics常用于 /prometheus 映射到 /metrics 以兼容 Prometheus 默认配置
禁用基础路径前缀management.server.servlet.context-path将管理端点与主应用共享上下文yaml\nmanagement:\n server:\n servlet:\n context-path: /结合 base-path 设置,可实现扁平路径结构
独立管理端口management.server.port在独立端口运行 Actuatoryaml\nmanagement:\n server:\n port: 8081推荐生产环境使用,便于网络隔离和安全策略配置
上下文路径隔离management.server.servlet.context-path为管理服务设置独立上下文yaml\nmanagement:\n server:\n servlet:\n context-path: /admin需配合独立端口使用,避免冲突

4.3 敏感端点的安全保护(配合 Spring Security)

安全配置方式语法用途代码示例注意事项
基于角色访问控制HttpSecurity 配置限制端点访问所需角色java\n@Configuration\npublic class SecurityConfig {\n @Bean\n public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n http\n .requestMatcher(EndpointRequest.toAnyEndpoint())\n .authorizeRequests()\n .anyRequest().hasRole("ACTUATOR")\n .and()\n .httpBasic();\n return http.build();\n }\n}EndpointRequest.toAnyEndpoint() 匹配所有端点
白名单放行permitAll()允许公开访问某些端点java\nhttp\n .requestMatcher(EndpointRequest.to(HealthEndpoint.class, InfoEndpoint.class))\n .permitAll()\n .and()\n .requestMatcher(EndpointRequest.toAnyEndpoint())\n .hasRole("ACTUATOR")常用于开放 /health/info 供探针调用
按端点类型过滤EndpointRequest.to()精确指定可访问的端点类型EndpointRequest.to(HealthEndpoint.class)接收一个或多个端点类作为参数
按端点 ID 过滤EndpointRequest.toNamed()按端点 ID(如 “beans”, “env”)过滤EndpointRequest.toNamed("health", "info")适用于无法导入具体类的场景
启用 CSRF 保护默认启用防止跨站请求伪造无(默认行为)若使用表单或 POST 操作(如 /shutdown),需处理 CSRF Token
禁用 CSRF(谨慎)csrf().disable()禁用 CSRF(仅 API 场景)http.csrf().disable()仅在纯 API、无状态服务中考虑,否则有安全风险

4.4 生产环境端点暴露最佳实践

最佳实践说明推荐配置示例注意事项
最小化暴露原则仅暴露必要的监控端点yaml\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info,prometheus避免暴露 env, beans, shutdown 等敏感端点
使用独立管理端口将监控端点与业务接口隔离yaml\nmanagement:\n server:\n port: 8081可结合防火墙策略,仅允许运维网络访问该端口
强制身份认证所有敏感端点必须认证配合 Spring Security,使用 HTTPS + Basic Auth 或 OAuth2公网暴露必须启用认证
关闭危险端点禁用可修改应用状态的端点yaml\nmanagement:\n endpoint:\n shutdown:\n enabled: falseshutdown 端点极易被滥用,生产环境应关闭
启用 HTTPS加密传输监控数据配置 SSL 证书,使用 HTTPS 访问管理端口防止监控数据在传输中被窃取
日志审计记录所有对 Actuator 端点的访问使用 AOP 或 WebFilter 记录请求日志便于事后审计和追踪异常访问
定期审查暴露列表随着应用演进重新评估暴露的端点定期检查 exposure.include 列表避免因历史配置导致不必要的暴露

第5章:自定义监控端点

5.1 使用 @Endpoint 创建自定义端点

注解/配置语法用途代码示例注意事项
@Endpoint@Endpoint(id = "custom")定义一个自定义监控端点java\n@Endpoint(id = "custom")\npublic class CustomEndpoint { }id 必须唯一,且只能包含小写字母、数字、连字符
@ComponentSpring Bean 注解将端点注册为 Spring 容器 Beanjava\n@Component\npublic class CustomEndpoint { }必须将端点类声明为 Bean,否则无法被发现
@WebEndpointExtensionWeb 扩展为已有端点添加 Web 操作java\n@WebEndpointExtension(endpoint = HealthEndpoint.class)\npublic class HealthWebExtension { }用于扩展内置端点的 Web 行为
@JmxEndpointExtensionJMX 扩展为已有端点添加 JMX 操作java\n@JmxEndpointExtension(endpoint = HealthEndpoint.class)\npublic class HealthJmxExtension { }用于 JMX 场景的扩展
端点线程模型同步执行操作在请求线程中执行无特殊配置耗时操作应异步处理,避免阻塞
端点可用性默认可用端点在启用后即可访问无需额外配置可通过 @ReadOperation 等注解定义操作

5.2 使用 @ReadOperation 实现读取操作

注解/方法语法用途代码示例注意事项
@ReadOperation标注在方法上定义一个可读操作(对应 HTTP GET)java\n@ReadOperation\npublic Map<String, Object> getStatus() {\n Map<String, Object> result = new HashMap<>();\n result.put("status", "OK");\n result.put("timestamp", System.currentTimeMillis());\n return result;\n}方法返回值将自动序列化为 JSON 响应
返回类型支持 POJO、Map、基本类型定义响应数据结构public CustomStatus getStatus() { ... }推荐使用不可变对象或标准集合
无参数方法-最简单的读取操作public String getName() { return "MyApp"; }适用于获取静态或实时状态
响应状态码默认 200成功时返回 200 OK异常情况下自动返回 500
内容协商自动支持根据 Accept 头返回适当格式通常为 application/jsonActuator 内部处理
性能要求快速响应读取操作应尽量轻量避免在方法中执行耗时计算或远程调用防止影响监控系统稳定性

5.3 使用 @WriteOperation 实现写入操作

注解/方法语法用途代码示例注意事项
@WriteOperation标注在方法上定义一个可写操作(对应 HTTP POST)java\n@WriteOperation\npublic Map<String, Object> updateConfig(@Selector String key, @Value String value) {\n config.put(key, value);\n return Map.of("result", "updated", "key", key);\n}用于修改应用状态,需谨慎使用
方法参数支持多个参数接收请求体或路径参数参数可使用 @Value, @Selector 等注解请求体需为 JSON 对象
HTTP 方法POST触发写入操作bash\ncurl -X POST http://localhost:8080/actuator/custom \\\n -H "Content-Type: application/json" \\\n -d '{"key":"mode","value":"debug"}'必须使用 POST 方法
安全控制必须保护写入操作涉及状态变更配合 Spring Security 强制认证建议仅限管理员角色访问
幂等性建议实现多次执行应产生相同结果设计时考虑幂等性避免重复操作导致状态混乱
响应处理返回操作结果提供成功/失败反馈返回包含状态信息的 JSON便于调用方判断操作结果

5.4 使用 @DeleteOperation 实现删除操作

注解/方法语法用途代码示例注意事项
@DeleteOperation标注在方法上定义一个删除操作(对应 HTTP DELETE)java\n@DeleteOperation\npublic Map<String, Object> clearCache(@Selector String cacheName) {\n cacheManager.getCache(cacheName).clear();\n return Map.of("result", "cleared", "cache", cacheName);\n}用于清除缓存、重置状态等操作
参数绑定@Selector从 URL 路径提取参数java\n@DeleteOperation\npublic void deleteItem(@Selector String id) { ... }类似于 RESTful 的路径变量
HTTP 方法DELETE触发删除操作curl -X DELETE http://localhost:8080/actuator/custom/cache/user必须使用 DELETE 方法
安全性要求极高删除操作不可逆必须启用身份认证和授权建议记录操作日志
响应状态200 或 204成功删除返回 200(有响应体)或 204(无内容)可返回操作结果或直接 voidvoid 方法自动返回 204
使用场景清理、重置适用于缓存清理、计数器重置等避免用于删除持久化数据应限于运行时状态清理

5.5 自定义端点的参数传递与验证

参数方式语法用途代码示例注意事项
@Selector方法参数注解从 URL 路径提取参数java\n@ReadOperation\npublic String getItem(@Selector String name) { ... }对应路径如 /actuator/custom/{name}
@Value方法参数注解从 JSON 请求体提取字段java\n@WriteOperation\npublic void update(@Value String value) { ... }请求体需为 { "value": "new-value" }
复杂对象参数POJO 参数接收完整的 JSON 对象public void updateConfig(ConfigUpdateRequest req) { ... }自动反序列化,支持嵌套结构
参数验证JSR-303 注解对参数进行校验public void update(@NotBlank @Value String value) { ... }需引入 validation 依赖
异常处理抛出 IllegalArgumentException参数无效时抛出异常if (value == null) throw new IllegalArgumentException("Value must not be null");Actuator 会自动转换为 400 响应
多参数组合多个注解参数同时使用路径和请求体参数java\n@WriteOperation\npublic void update(@Selector String id, @Value Map<String, Object> props) { ... }灵活支持复杂操作
默认值处理方法内判断提供参数默认值if (timeout == null) timeout = 5000;适用于可选参数

第6章:指标监控与 Micrometer 集成

6.1 Micrometer 核心概念(Meter、MeterRegistry、Timer、Counter 等)

概念说明注意事项
Meter指标的基本单位,代表一个可测量的量(如计数、时间、值)。包含名称、标签(tags)和一组数据。所有指标类型都实现 Meter 接口,是监控数据的最小单元。
MeterRegistry指标注册中心,负责创建和管理所有 Meter 实例,并将其导出到监控系统(如 Prometheus)。应用中通常只有一个全局的 MeterRegistry Bean,通过 @Autowired 注入使用。
Counter单调递增计数器,用于记录事件发生的总次数(如 HTTP 请求数、错误数)。只能增加,不能减少;适用于累计型指标。
Gauge仪表,用于记录瞬时值(如当前在线用户数、队列长度)。可增可减。通常通过回调函数定期采集值;适用于状态型指标。
Timer计时器,用于记录操作的执行时间分布(如方法调用耗时、HTTP 响应时间)。同时记录调用次数和总耗时,支持统计平均值、百分位等。
DistributionSummary分布摘要,用于记录事件大小的分布情况(如请求体大小、响应字节数)。类似 Timer,但不关注时间,而是关注任意数值的分布。
Tag(标签)键值对,用于对指标进行维度切片(如 method=GET, uri=/api/user)。是实现多维监控的关键,可组合使用进行数据筛选和聚合。
MeterFilter指标过滤器,用于控制哪些 Meter 被注册、重命名、添加标签等。可通过配置实现全局标签添加或指标过滤。

6.2 使用 Counter 记录事件次数

方法语法用途代码示例注意事项
创建 CounterCounter.builder(name).register(registry)构建并注册一个计数器java\n@Autowired\nprivate MeterRegistry registry;\n\nCounter counter = Counter.builder("request.count")\n .tag("method", "GET")\n .description("Total number of GET requests")\n .register(registry);建议将 Counter 实例缓存为成员变量,避免重复创建
增加计数counter.increment()事件发生时增加计数counter.increment();默认增加 1
指定增量counter.increment(double amount)增加指定数值counter.increment(2.5);支持浮点数,但通常用于整数计数
带标签计数registry.counter(name, tags)快速创建带标签的计数器registry.counter("request.count", "status", "success").increment();适用于临时或简单计数场景
自动计数(HTTP)内置自动配置自动记录 Spring MVC 请求无需代码通过 management.metrics.web.server.auto-time-requests=true 控制
性能影响极低原子操作,性能开销小可在高频路径使用避免在极端性能敏感场景滥用

6.3 使用 Gauge 监控实时值

方法语法用途代码示例注意事项
创建 GaugeGauge.builder(name, obj, function).register(registry)创建监控指定对象属性的 Gaugejava\nList<String> queue = new LinkedList<>();\nGauge.builder("queue.size", queue, List::size)\n .register(registry);函数应快速返回,避免阻塞
直接设置值Gauge.builder(name).register(registry, obj, function)通过对象和提取函数创建java\nGauge.builder("cpu.usage", osBean, bean -> bean.getSystemCpuLoad())\n .register(registry);适用于监控第三方库对象
静态值 GaugeGauge.builder(name).register(registry, valueRef)监控固定值或需手动更新的值java\nAtomicDouble value = new AtomicDouble(0);\nGauge.builder("custom.value", value, AtomicDouble::get)\n .register(registry);使用原子类保证线程安全
回调式 Gauge每次采集时执行回调定期获取最新值无(由 MeterRegistry 调用)采集频率由监控系统决定(如 Prometheus scrape interval)
使用场景状态监控队列长度、缓存大小、连接数等避免用于高频变化的瞬时值采集间隔内变化可能丢失
注意事项非线程安全回调函数需保证线程安全使用同步容器或原子类防止并发访问导致异常

6.4 使用 Timer 记录执行时间

方法语法用途代码示例注意事项
创建 TimerTimer.builder(name).register(registry)构建并注册一个计时器java\nTimer timer = Timer.builder("method.duration")\n .tag("method", "process")\n .description("Time spent in processing")\n .register(registry);建议缓存实例
记录耗时timer.record(Duration)手动记录一段耗时timer.record(Duration.ofMillis(100));适用于已知耗时的场景
自动计时(代码块)timer.record(() -> {...})自动记录代码块执行时间java\ntimer.record(() -> {\n // 业务逻辑\n process();\n});最常用的方式,自动处理开始/结束
手动开始/结束Timer.Sample手动控制计时开始和结束java\nTimer.Sample sample = Timer.start(registry);\n// ...\nsample.stop(timer);适用于跨方法或异步场景
获取统计值timer.takeSnapshot()获取当前统计快照java\nSnapshot snap = timer.takeSnapshot();\ndouble mean = snap.mean(TimeUnit.MILLISECONDS);用于内部监控或告警
百分位支持需配置启用百分位统计(如 p95, p99)management.metrics.distribution.percentiles.<name>=0.95,0.99默认关闭,开启有性能开销

6.5 使用 DistributionSummary 记录分布统计

方法语法用途代码示例注意事项
创建 SummaryDistributionSummary.builder(name).register(registry)构建分布摘要java\nDistributionSummary summary = DistributionSummary.builder("request.size")\n .baseUnit("bytes")\n .register(registry);适用于记录非时间类数值分布
记录值summary.record(double value)记录一个数值summary.record(1024); // 1KB 请求体可记录任意浮点数值
统计功能自动计算提供计数、总量、平均值、百分位等无需额外代码类似 Timer,但维度是数值而非时间
适用场景数据大小分布请求/响应大小、消息长度、文件尺寸等不适用于执行时间执行时间应使用 Timer
百分位配置management.metrics.distribution.percentiles配置需要计算的百分位management.metrics.distribution.percentiles.all=0.9,0.95,0.99all 表示全局配置
性能权衡滑动窗口使用滑动窗口计算百分位内部实现高频记录时需评估性能影响

6.6 将指标导出到 Prometheus

配置/方法语法用途代码示例注意事项
添加依赖micrometer-registry-prometheus启用 Prometheus 导出xml\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-prometheus</artifactId>\n</dependency>必须添加,否则 /prometheus 端点 404
暴露端点management.endpoints.web.exposure.include通过 HTTP 暴露yaml\nmanagement:\n endpoints:\n web:\n exposure:\n include: prometheus确保 prometheus 在 include 列表中
访问指标GET /actuator/prometheus获取文本格式指标curl http://localhost:8080/actuator/prometheus响应 Content-Type 为 text/plain; version=0.0.4
全局标签management.metrics.tags添加全局标签yaml\nmanagement:\n metrics:\n tags:\n application: ${spring.application.name}\n region: us-east-1所有指标自动附加这些标签
指标前缀management.metrics.export.prometheus.desired-metric-names过滤导出的指标一般无需配置用于性能优化或数据隔离
Prometheus 配置scrape_configs在 Prometheus 中配置抓取yaml\n- job_name: 'spring-boot-app'\n metrics_path: '/actuator/prometheus'\n static_configs:\n - targets: ['localhost:8080']确保网络可达
安全访问Spring Security保护 /actuator/prometheus配置 HTTP Basic 或 OAuth2建议限制访问 IP 或使用认证

第7章:高级特性与扩展

7.1 远程调试与 @Endpoint 的 JMX 暴露

配置/方法语法用途代码示例注意事项
启用 JMX 支持spring.jmx.enabled=true启用 Spring 的 JMX 支持yaml\nspring:\n jmx:\n enabled: true默认为 true,通常无需配置
自定义 JMX 域名management.endpoint.jmx.domain设置 Actuator 端点的 JMX 域yaml\nmanagement:\n endpoint:\n jmx:\n domain: com.example.actuator避免命名冲突,便于管理
暴露端点到 JMXmanagement.endpoints.jmx.exposure.include指定暴露到 JMX 的端点yaml\nmanagement:\n endpoints:\n jmx:\n exposure:\n include: "*"默认暴露所有启用的端点
查看 MBeanJConsole 或 VisualVM连接 JVM 查看 MBean启动 JConsole → 选择本地进程可查看 org.springframework.boot 域下的端点
自定义端点 JMX 支持@Endpoint + JMX自动注册为 MBeanjava\n@Endpoint(id = "custom")\npublic class CustomEndpoint { ... }无需额外注解,框架自动处理
远程 JMX 连接配置 JVM 参数允许远程连接 JMX\n-Dcom.sun.management.jmxremote\n-Dcom.sun.management.jmxremote.port=9999\n-Dcom.sun.management.jmxremote.authenticate=false生产环境必须启用认证和加密

7.2 使用 HealthIndicator 自定义健康检查

方法/配置语法用途代码示例注意事项
实现 HealthIndicator 接口继承接口并重写 health() 方法创建自定义健康检查逻辑java\n@Component\npublic class DatabaseHealthIndicator implements HealthIndicator {\n @Override\n public Health health() {\n if (isDatabaseUp()) {\n return Health.up().withDetail("version", "12.4").build();\n } else {\n return Health.down().withDetail("error", "Connection failed").build();\n }\n }\n}Bean 名称应以 HealthIndicator 结尾
返回 UP 状态Health.up()表示组件健康return Health.up().build();可附加详细信息
返回 DOWN 状态Health.down()表示组件故障return Health.down().withException(e).build();有助于快速定位问题
添加详细信息withDetail(key, value)提供健康检查的上下文.withDetail("latency", 200)支持任意对象作为值
抛出异常withException(e)记录导致故障的异常.withException(new RuntimeException("Timeout"))异常信息会被掩码处理
异步健康检查CompletableFuture避免阻塞return CompletableFuture.supplyAsync(this::checkAsync);适用于耗时检查(如远程服务调用)

7.3 使用 InfoContributor 扩展 info 信息

方法/配置语法用途代码示例注意事项
实现 InfoContributor 接口重写 contribute() 方法动态添加 /info 端点信息java\n@Component\npublic class BuildInfoContributor implements InfoContributor {\n @Override\n public void contribute(Info.Builder builder) {\n builder.withDetail("build", Map.of(\n "time", Instant.now(),\n "version", "1.0.0"\n ));\n }\n}框架自动发现并调用
添加静态信息builder.withDetail(key, value)添加键值对信息builder.withDetail("app.name", "MyApp");value 可为任意对象,自动序列化
添加嵌套结构Map 或 POJO构建层次化信息builder.withDetail("git", gitInfo);生成 JSON 嵌套对象
覆盖默认信息同名 key后注册的 Contributor 可覆盖前者的值注意加载顺序
运行时信息获取系统状态添加动态数据(如磁盘使用率)builder.withDetail("disk.free", FileStore.getUsableSpace());信息在每次请求时重新计算
多 Contributor 协作多个 Bean多个组件共同构建 info 响应无需特殊配置所有 InfoContributor 都会被调用

7.4 端点响应的数据结构与序列化控制

特性/配置语法用途代码示例注意事项
默认序列化Jackson使用 ObjectMapper 序列化响应自动处理 POJO、Map、集合等
自定义 ObjectMapper@Bean ObjectMapper覆盖默认序列化行为java\n@Bean\npublic ObjectMapper objectMapper() {\n ObjectMapper mapper = new ObjectMapper();\n mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);\n return mapper;\n}影响整个应用的 JSON 序列化
HAL 格式导航management.endpoint.jackson.serialization-inclusion=always启用 HAL 风格链接yaml\nmanagement:\n endpoint:\n jackson:\n serialization-inclusion: always/actuator 响应包含 _links 字段
日期格式控制Jackson 配置统一日期输出格式java\nmapper.findAndRegisterModules();\nmapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);推荐使用 ISO 8601 格式
敏感字段掩码自动机制掩码包含 passwordsecret 的字段info.password=secret"******"基于字段名关键字匹配
自定义序列化器JsonSerializer为特定类型定制序列化逻辑public class CustomSerializer extends JsonSerializer<T> { ... }需注册到 ObjectMapper
响应包装自定义响应结构统一错误或成功格式public class ApiResponse<T> { ... }不推荐修改 Actuator 内部结构

7.5 监控数据可视化(集成 Grafana)

集成方式配置/工具用途示例配置/说明注意事项
Prometheus + Grafana标准组合指标收集与可视化Prometheus 抓取 /actuator/prometheus → Grafana 展示最主流的 Java 应用监控方案
导入 Grafana 仪表板Dashboard ID快速部署可视化面板Grafana 官方提供 Spring Boot 仪表板(ID: 12345)可自定义或导入现有模板
配置数据源Grafana Web UI添加 Prometheus 为数据源URL: http://prometheus-server:9090确保网络可达
常用指标展示Grafana Panel展示关键性能指标- JVM 内存使用率
- HTTP 请求延迟 P95
- 线程数
- Tomcat 请求吞吐量
设置合理告警阈值
多实例监控job + instance 标签区分不同服务实例在 Prometheus 中通过 job 和 instance 标签筛选适用于微服务集群
告警规则Prometheus Alerting设置指标告警up{job="spring-app"} == 0 时触发告警可集成到 Slack、钉钉等

第8章:生产实践与故障排查

8.1 常见端点响应分析(健康检查失败、线程阻塞等)

问题现象可能原因排查方法解决方案注意事项
/health 返回 DOWN数据库连接失败、Redis 不可用、磁盘满查看 details 中具体组件状态检查数据库服务、网络、凭证配置 show-details: when-authorized 避免信息泄露
线程状态 BLOCKED锁竞争、死锁、同步方法阻塞GET /actuator/threads → 查看 blockedCount 和栈轨迹优化同步代码、减少锁粒度使用线程池避免阻塞主线程
堆内存持续增长内存泄漏、缓存未清理、大对象未释放GET /actuator/metrics/jvm.memory.used → 观察趋势生成 heapdump 分析结合 /heapdump 下载文件用 MAT 分析
HTTP 5xx 错误增多业务异常、外部服务超时、资源不足GET /actuator/metrics/http.server.requests → 按 status 过滤增加日志、优化异常处理检查下游服务依赖
应用无响应死锁、Full GC 频繁、CPU 100%结合 /threads/metrics、系统监控重启 + 事后分析 heapdump设置合理的 JVM 参数
端点 404端点未暴露、路径配置错误检查 management.endpoints.web.exposure.include正确配置暴露列表确认依赖已添加(如 prometheus)

8.2 利用 metrics 进行性能瓶颈定位

指标类别关键指标用途分析方法优化建议
JVM 内存jvm.memory.used{area="heap"}监控堆内存使用观察是否接近 max,Full GC 频率调整 -Xmx,优化对象生命周期
GC 时间jvm.gc.pauseGC 停顿时间统计 P99 暂停时间是否过高选择合适 GC 算法(如 G1)
HTTP 延迟http.server.requests{uri="/api/xxx"}接口响应时间查看 P95/P99 延迟分布优化 SQL、添加缓存、异步处理
线程池tomcat.threads.busy, tomcat.threads.currentTomcat 线程使用率busy 接近 current 时可能成为瓶颈增加线程数或优化请求处理速度
数据库hikaricp.connections.active数据库连接占用active 接近 maxPoolSize 时需关注优化慢查询,调整连接池大小
缓存命中率cache.gets.hit, cache.gets.miss缓存效率计算命中率 = hit / (hit + miss)提高缓存策略合理性,预热数据

8.3 日志与监控联动排查问题

场景监控线索日志配合联动方法示例
接口超时http.server.requests 延迟突增查找对应时间点的 DEBUG/ERROR 日志关联 traceId 或请求路径发现某 SQL 执行耗时 5s
内存溢出jvm.memory.used 持续上升查看 OOM 前的日志输出分析 GC 日志和异常堆栈发现大文件上传未流式处理
服务不可用/health DOWN查看启动日志和依赖服务日志检查数据库、Redis 连接日志凭证错误导致数据库连接失败
高 CPU 使用系统监控 CPU 100%结合 /threads 查看栈轨迹定位热点方法发现无限循环或正则回溯
频繁重启容器平台事件 + /metrics 重置查看 shutdown 原因日志分析退出码和信号发现内存超限被 K8s kill
功能异常自定义指标异常根据业务日志定位逻辑分支使用 MDC 记录 requestId发现特定用户数据格式错误

8.4 Actuator 在微服务架构中的集中监控方案

方案组件作用配置要点优势注意事项
Prometheus指标收集中心配置 scrape_configs 抓取所有实例的 /actuator/prometheus强大的查询语言 PromQL,原生支持需维护 Prometheus 高可用
Grafana可视化平台添加 Prometheus 为数据源,创建多实例仪表板统一视图,支持告警可设置按服务、环境分组
Service Discovery自动发现服务实例集成 Consul、Eureka 或 Kubernetes SD无需手动维护目标列表确保服务注册健康
Pushgateway桥接短生命周期任务用于批处理、Job 类应用推送指标补充 scrape 模型的不足避免用于常规应用
Spring Boot Admin专用管理平台Server 端聚合 Client 端(集成 Actuator)提供 UI,支持通知需额外部署 Admin 服务
ELK/EFK日志集中分析Filebeat 收集日志 → Logstash → Elasticsearch → Kibana统一日志查询,关联分析配置 MDC 输出 traceId
告警中心统一告警Prometheus Alertmanager 或集成钉钉/企业微信避免告警风暴,分级通知设置合理的告警规则和静默期