Spring Boot Actuator 健康指标端点实战

Spring Boot Actuator 是每个 Java 后端工程师都应该掌握的生产观测利器。它用一套标准化端点(endpoint)把应用的健康检查、运行时指标、线程与内存状态直接暴露出来,让你不用登录服务器就能掌握生产应用的健康状况。本文从依赖接入讲起,带你把 Actuator 的健康端点与指标端点真正用在生产环境。

一、为什么生产环境离不开 Actuator

没有可观测性,线上出问题只能靠猜。传统做法是在服务器上敲 top、翻日志、连 JVM 做 thread dump,效率低且需登录生产机。Actuator 把这些信息变成 HTTP 端点:探针能问 /actuator/health 判断应用是否就绪,监控能定时抓取 /actuator/prometheus 拉走指标,排障能直接拿到 /actuator/threaddump。K8s 的 readiness/liveness 探针、Prometheus、Grafana 都依赖它,是云原生可观测链路的入口。

二、三步接入 Actuator

只需引入 starter 并显式暴露你需要的端点。默认只开 health 与 info,其余按需开启。

1. 引入依赖

<!-- Maven -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

# Gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'

2. 暴露端点配置

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  endpoint:
    health:
      show-details: when_authorized
      probes:
        enabled: true
  info:
    env:
      enabled: true

三、核心端点速查

端点默认暴露作用
/actuator/health是应用与下游依赖健康状态
/actuator/info是构建版本、Git、环境信息
/actuator/metrics否JVM/HTTP/Tomcat 等运行时指标
/actuator/prometheus否Prometheus 拉取格式指标
/actuator/threaddump否线程快照,定位阻塞/死锁
/actuator/loggers否运行时动态调整日志级别

四、自定义健康检查 health 端点

默认 health 只查磁盘与数据库。当订单服务、第三方 API 等下游挂掉时,你希望探针立刻变红,这就需自定义 HealthIndicator。

@Component
public class OrderServiceHealthIndicator implements HealthIndicator {
    private final OrderClient orderClient;

    public OrderServiceHealthIndicator(OrderClient orderClient) {
        this.orderClient = orderClient;
    }

    @Override
    public Health health() {
        try {
            orderClient.ping();
            return Health.up()
                    .withDetail("orderService", "reachable")
                    .build();
        } catch (Exception e) {
            return Health.down()
                    .withDetail("error", e.getMessage())
                    .build();
        }
    }
}

更进一步,用分组把探针拆成 readiness(依赖就绪)与 liveness(进程存活),让 K8s 在依赖故障时重启流量而非杀容器:

management:
  endpoint:
    health:
      group:
        readiness:
          include: db,redis,orderService
        liveness:
          include: diskSpace

五、指标端点 metrics 与 Micrometer

Actuator 的指标底层是 Micrometer。系统指标(JVM 内存、GC、HTTP 请求量)开箱即用;业务指标则需用 MeterRegistry 注册。关于把指标接进监控面板,可参考站内 Prometheus + Grafana 监控面板实战。

@Autowired
private MeterRegistry registry;

private final Counter orderCounter = Counter.builder("orders.created")
        .tag("channel", "web")
        .register(registry);

public void createOrder(Order o) {
    orderCounter.increment();   // 每笔订单 +1,Grafana 里画 QPS
    // ...业务逻辑
}

六、把指标喂给 Prometheus + Grafana

引入 Prometheus 注册表后,/actuator/prometheus 会输出符合抓取协议的文本,Prometheus 定时 pull 即可。

<!-- Maven -->
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

# prometheus.yml
scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['app:8080']

配合 Prometheus + Grafana 监控面板实战 即可搭建 JVM、HTTP 延迟、订单 QPS 的实时看板,告警也能直接落到指标上。

七、生产安全:别把端点裸奔

Actuator 端点一旦公网暴露,/actuator/env、/shutdown 会成重大隐患。务必放在内网、加鉴权、按需暴露。鉴权方案可复用站内 Spring Security 认证授权与 JWT 实战。

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  endpoint:
    health:
      probes:
        enabled: true
  server:
    port: 9091   # 独立管理端口,不对外

# Spring Security 放行策略
@Bean
SecurityFilterChain actuatorChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests(a -> a
        .requestMatchers("/actuator/health/**").permitAll()
        .requestMatchers("/actuator/**").hasRole("ACTUATOR")
        .anyRequest().authenticated());
    return http.build();
}

八、优雅停机与探针协作

发布重启时,先让 readiness 探针变红摘流量,再停进程,可做到用户零感知。具体停机姿势见站内 Graceful Shutdown 优雅停机与无损下线;Actuator 的 readiness 分组正是 K8s 滚动发布时摘流量的信号源。

九、高频排坑清单

现象原因解法
端点访问 404未加入 exposure.include在 include 中追加端点名
health 一直 UP 但下游已挂未实现自定义 Indicator实现 HealthIndicator 并注册 bean
看不到自定义指标指标没绑定 MeterRegistry用注入的 registry 注册 Counter/Timer
Prometheus 拉不到数据缺 micrometer-registry-prometheus加依赖并暴露 prometheus 端点
show-details 不显示未授权访问show-details 设为 when_authorized 并带凭证

十、小结

Spring Boot Actuator 是生产可观测的基石:health 端点对接 K8s 探针、metrics 端点喂给 Prometheus、自定义 Indicator 与 Meter 让业务可见。记住三件事——按需暴露、内网鉴权、指标接入监控大盘,你就能在故障发生前看见苗头,在发布时做到无损。与它搭配的线程池调优可看 Spring Boot 异步线程池 @Async 配置与避坑,链路追踪见 OpenTelemetry 链路追踪实战。

十、/actuator/info 暴露构建与 Git 信息

运维排障时常需要确认线上跑的是哪个版本、哪次提交。/actuator/info 能聚合构建信息:接入 spring-boot-starter-actuator 后,再引入 info-maven 或 git-commit-id-plugin,启动后即可看到 artifact 版本、构建时间,以及 Git 分支与 commitId。把它接入内部发布系统,故障时一眼就能核对“生产到底部署了哪份代码”,避免多人各执一词。

management:
  info:
    git:
      mode: full
    build:
      enabled: true

# 效果:/actuator/info 返回
# {"git":{"branch":"main","commit":{"id":"a1b2c3d"}},
#  "build":{"version":"1.4.2","timestamp":"2026-09-20"} }

十一、用 Timer 统计接口延迟分布

Counter 只能计数,要衡量性能必须看分布。Timer 记录每次调用的耗时,并自动产出分位数(p50/p95/p99),是接口 SLA 的硬指标。把它包在业务方法外层,Prometheus 抓取后就能在 Grafana 画出延迟热力。

private final Timer orderTimer = Timer.builder("orders.latency")
        .tag("api", "create").register(registry);

public Order createOrder(Order o) {
    return orderTimer.recordCallable(() -> orderService.save(o));
}

十二、排坑之外:把观测做成习惯

Actuator 不是“接上就完事”的开关,而是可观测文化的入口。建议把 health 探针纳入 CI 冒烟(部署后自动 curl 校验 200)、把核心指标纳入值班大盘与告警,并把自定义 Indicator 当作新增外部依赖的标配。当每一次发布都能用数据说话,线上事故的平均修复时间(MTTR)会显著下降——这正是可观测性投入最值得的回报。

上一篇 Nginx 重定向循环 Too many redirects
下一篇 CSS 嵌套实战:用原生嵌套语法重构你的样式表
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]