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 + 先摘流量再停。