Actuator 端点与健康检查怎么用?优雅停机是如何实现的?

结论先行:Actuator 把应用内部状态(健康、指标、环境、日志级别等)以 HTTP/JMX 端点暴露,默认只开放 health。生产常用 health 做存活/就绪探针、用 metrics 接监控。优雅停机靠 server.shutdown=graceful + 超时时间,让容器停止接收新请求并等存量请求处理完再退出。

一、Actuator 基本用法

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus  # 默认仅 health
  endpoint:
    health:
      show-details: when-authorized
  • 依赖 spring-boot-starter-actuator;Boot 2.0+ 起默认 HTTP 只暴露 health,info 等需在 include 中显式开启;
  • 端点按能力分组:health 聚合多个 HealthIndicator(db、redis、diskSpace 等),返回 UP/DOWN;
  • 常用端点:health、info、metrics、loggers、beans、conditions、mappings、shutdown(默认禁用且需 POST)。

二、K8s 探针与健康分组

management:
  endpoint:
    health:
      probes:
        enabled: true   # 暴露 /actuator/health/liveness 与 /readiness
  • liveness(存活)失败 → K8s 重启容器;readiness(就绪)失败 → 摘流量;
  • 自定义健康检查:实现 HealthIndicator,或把业务探活注册为组(如“db”组)。

三、优雅停机(Graceful Shutdown)

server:
  shutdown: graceful                 # 默认 immediate
spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s  # 每阶段最多等 30s
  • 流程:收到停机信号 → 停止接收新连接 → 等待在途请求/任务完成 → 超时强制关闭;
  • 适用容器:内嵌 Tomcat/Jetty/Reactor Netty 等;Undertow 视版本支持;
  • 需要配合:注册中心下线(摘除流量)→ 等待几秒 → 再停机,避免停机瞬间仍有新请求;
  • 停机阶段顺序与 SmartLifecycle 的 phase 有关,Bean 按依赖顺序关闭(先依赖后使用方)。

常见追问 / 记忆点

  • 追问:health 显示 DOWN 但应用还能跑?答:说明某个组件探针失败,通常应视为不健康并摘流量排查。
  • 追问:优雅停机与 kill -9 的区别?答:kill -9 直接强杀无法善后;优雅停机给在途请求留处理窗口,避免数据不一致。
  • 记忆点:探针分存活/就绪;优雅停机 = graceful + timeout + 先摘流量再停。
笔记加载中…