java容器无损重启关键在于用startup probe区分“未启动完成”与“真故障”,配合readiness probe控制流量接入、liveness probe仅干预僵死状态,结合spring boot启动特征配置合理探测参数。

Java 容器化部署中实现无损重启,关键不在于“一重启就恢复”,而在于让健康检查精准区分“还没好”和“真坏了”,从而避免误杀、跳过流量、平滑过渡。核心是配合 Startup Probe、Readiness Probe 和 Liveness Probe 三类探针,并结合 Java 应用的实际启动特征来配置。
用 Startup Probe 给 Spring Boot 留足热身时间
Java 应用(尤其是 Spring Boot)冷启动常需 20–60 秒加载上下文、连接数据库、预热缓存。若此时直接执行 Liveness 检查,极易因超时失败触发重启,形成“刚启就杀”的恶性循环。
- 务必启用 Startup Probe,替代过早的 Liveness 判断
- Kubernetes 示例配置:
startupProbe:
httpGet:
path: /actuator/health/startup
port: 8080
failureThreshold: 30
periodSeconds: 2
timeoutSeconds: 1
含义:每 2 秒探测一次 startup 端点,最多容忍 30 次失败(即最长等待 60 秒),期间 Liveness 和 Readiness 不生效。只有 startupProbe 成功后,才开始后续探针。
Readiness Probe 控制流量接入时机
即使应用已启动,也未必准备好处理请求——比如数据库连接池未填满、Redis 缓存未预热、下游服务尚未就绪。此时应拒绝流量,而非强行转发导致 5xx。
- 推荐使用
/actuator/health/readiness(Spring Boot 3+)或/actuator/health(含 readinessGroup) - 该端点应校验关键依赖(DB、Cache、Config Server),任一不可用则返回 503
- 配置示例:
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 2
效果:容器启动 10 秒后开始探测,连续 2 次失败即从 Service Endpoint 中剔除,新请求不再打进来;恢复后自动加回,实现无感上线。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
Liveness Probe 只在真正崩溃时干预
Liveness 是最后防线,目标是识别僵死(如 GC 停顿卡死、线程全部阻塞、OOM 后假死)。它不应被启动慢、短暂抖动干扰。
- 路径建议用轻量级端点,如
/actuator/health/liveness或自定义/healthz,仅检查 JVM 是否响应、主线程是否存活 - 避免调用依赖外部资源的逻辑(如查 DB),否则会把依赖故障误判为自身死亡
- 合理放宽参数:
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 90
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 3
说明:启动 90 秒后再开始检测,每 30 秒一次,超时 5 秒即失败,连续 3 次失败才重启——既能捕获真实僵死,又避开慢启动和瞬时 GC 尖峰。
Dockerfile 中 HEALTHCHECK 要与编排层协同
若只用 Docker 原生命令(非 Kubernetes),仍需对齐语义:
- HEALTHCHECK 指令本身不触发重启,必须搭配
--restart unless-stopped或always - 命令应调用 readiness 类端点(如
curl -f http://localhost:8080/actuator/health/readiness),而非简单 ping 或 ps - 设置
--start-period=60s等同于 Kubernetes 的 startupProbe 缓冲期
示例:
HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8080/actuator/health/readiness || exit 1
这样在 Docker Compose 或 Swarm 场景下,也能在标记 unhealthy 后由 restart 策略拉起新实例,旧实例停止前已完成 graceful shutdown,达到无损效果。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










