news 2026/10/2 15:00:50

SpringBoot优雅停机与健康检查,生产必备

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot优雅停机与健康检查,生产必备

优雅停机:让请求体面地结束

默认情况下,SpringBoot收到停止信号会立即关闭容器,正在处理的请求直接被中断。用户看到的是502或连接重置。优雅停机的思路是:收到停止信号后,先拒绝新请求,给正在处理的请求留出完成时间,再关闭应用。

配置只需两行。在application.yml中:

yaml
复制
下载
server: shutdown: graceful spring: lifecycle: timeout-per-shutdown-phase: 30s

server.shutdown: graceful开启优雅停机。timeout-per-shutdown-phase设定最大等待时间,超时则强制关闭。当应用收到SIGTERM,Web服务器会停止接受新连接,等待活跃请求结束。如果30秒内没处理完,才会强制退出。

这个机制在Kubernetes里尤其重要。Pod被删除时,K8s先发送SIGTERM,等待terminationGracePeriodSeconds后发送SIGKILL。如果SpringBoot的优雅停机超时时间小于K8s的宽限期,就能保证请求完整处理。否则,K8s会在请求处理到一半时杀掉进程。建议将timeout-per-shutdown-phase设为25秒,K8s的terminationGracePeriodSeconds设为30秒,留出缓冲。

健康检查:让编排系统准确判断状态

SpringBoot Actuator提供了开箱即用的健康检查端点。引入依赖:

xml
复制
下载
运行
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

默认暴露/actuator/health,返回{"status":"UP"}。但生产环境需要更细粒度的探针。Kubernetes区分liveness和readiness:liveness判断容器是否活着,失败则重启;readiness判断容器是否准备好接收流量,失败则从Service端点摘除。

SpringBoot 2.3+支持探针分组。配置:

yaml
复制
下载
management: endpoint: health: probes: enabled: true show-details: always health: livenessstate: enabled: true readinessstate: enabled: true

这样会暴露/actuator/health/liveness和/actuator/health/readiness。liveness检查应用内部状态,比如是否死锁;readiness检查依赖的外部资源,比如数据库、Redis是否可用。如果数据库暂时不可用,readiness应返回DOWN,K8s会停止向该Pod发流量,但不会重启它,等依赖恢复后自动重新加入。

自定义健康指示器

内置检查覆盖了数据库、磁盘、消息队列等常见依赖。如果有自定义组件,实现HealthIndicator接口即可:

java
复制
下载
@Component public class CustomHealthIndicator implements HealthIndicator { @Override public Health health() { if (isHealthy()) { return Health.up().withDetail("custom", "ok").build(); } return Health.down().withDetail("custom", "failed").build(); } }

这样/actuator/health会包含你的自定义状态。注意,liveness探针不应包含外部依赖,否则数据库抖动会导致Pod被反复重启,反而放大故障。liveness只检查应用自身,readiness才检查外部依赖。

生产实践建议

优雅停机和健康检查要配合使用。K8s的preStop钩子可以加一个短暂sleep,等待Service端点更新完成,再发送SIGTERM。否则,Pod从端点摘除和收到停止信号几乎同时发生,可能有少量请求仍被路由过来。加5秒preStop延迟,能消除这个窗口。

另外,健康检查端点不要暴露敏感信息。show-details: always方便调试,但生产环境建议设为when-authorized,只对内部网络或特定角色开放。Actuator端点也应通过management.server.port独立端口暴露,避免和业务端口混用。

优雅停机和健康检查不是银弹,但它们是生产环境的底线。配置得当,发版时用户无感知,故障时编排系统能准确判断,避免雪崩。花十分钟配好这两项,比事后半夜爬起来处理告警划算得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 14:59:52

Windows 11 原生 DoH 与自定义 DoH 服务配置指南

很多人第一次听说 Windows 11 自带 DoH&#xff08;DNS over HTTPS&#xff09;都是在一个很尴尬的场景里&#xff1a;网页打开速度还行&#xff0c;但首页偶尔会跳到莫名其妙的推广页&#xff0c;或者某个域名解析出来的 IP 一会儿在这、一会儿在那&#xff0c;换个网络环境就…

作者头像 李华
网站建设 2026/10/2 14:59:49

ReentrantReadWriteLock从原理到实战:锁降级、饥饿与坑位全解析

写这系列教程的时候&#xff0c;我一直想找一种"看起来简单、用起来顺手、但深挖全是坑"的Java并发工具来细讲。ReentrantReadWriteLock恰好就是这样的存在&#xff1a;很多初级开发第一次看到它&#xff0c;觉得不就是把锁分成了读和写两种吗&#xff1f;等真正在项…

作者头像 李华
网站建设 2026/10/2 14:59:28

AI Native架构设计实战:从分层蓝图到落地避坑指南

最近在做一个从零开始的AI客服和决策辅助系统&#xff0c;团队里反复出现同一个问题&#xff1a;技术方案到底怎么画&#xff1f;是先把模型接进来&#xff0c;还是先把数据理清楚&#xff1f;哪些模块该做成微服务&#xff0c;哪些根本不用拆&#xff1f;这些问题凑在一起&…

作者头像 李华
网站建设 2026/10/2 14:59:26

SpringBoot整合3D可视化:从零构建元宇宙整车生产线管理系统

1. 课题拆解&#xff1a;这个题目到底在做什么带毕业设计这么多年&#xff0c;SpringBoot 管理系统的组合见得实在太多了&#xff0c;什么图书管理、宿舍管理、教务管理&#xff0c;基本都是一个套路换一层皮。但“基于SpringBoot的元宇宙平台的整车生产线管理系统”这个课题&…

作者头像 李华
网站建设 2026/10/2 14:58:51

dsPIC33EP+DRV8818步进驱动板开发实战与经验分享

最近给一台小型机器人关节测试台做驱动板&#xff0c;电机端选的是双极步进电机&#xff0c;控制器用了 Microchip 的 dsPIC33EP512MU810&#xff0c;功率级交给 TI 的 DRV8818PWPR。整套系统从打样到跑通大概用了一个多星期&#xff0c;中间踩了几个比较典型的坑&#xff0c;过…

作者头像 李华
网站建设 2026/10/2 14:57:53

VirtualBox 装 Win11 虚拟机:TPM 2.0、增强功能与避坑

1. 先搞明白&#xff1a;为什么要在 VirtualBox 里装 Win11我平时干活的主力机是 Linux&#xff0c;但手头总有一些绕不开的 Windows 场景&#xff1a;帮朋友验证一个只在 Win11 上出问题的软件、跑某个银行客户端、测试一份文档在 Edge 下的排版、或者干脆想看看某个新版本系统…

作者头像 李华