
当我们实现滚动升级之前,务必要实现应用级别的优雅停机,否则滚动升级时,还是会影响到业务。所以,我们希望SpringBoot应用实现优雅停机。此次教程基于SpringBoot 2.5.0。
1. 加入必要依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. 配置SpringBoot应用
默认情况下,SpringBoot是直接关机的,所以,需要将优雅停机配置打开。在applicatoin.yaml中配置:
spring:
application:
name: demo
# 停机过程超时时长设置了20s,超过20s,直接停机
lifecycle:
timeout-per-shutdown-phase: 20s
server:
port: 8080
# 默认为IMMEDIATE,表示立即关机;GRACEFUL表示优雅关机
shutdown: graceful
management:
server:
address: 127.0.0.1
port: 50000
# 开启shutdown endpoint
endpoint:
shutdown:
enabled: true
endpoints:
web:
base-path: /private-url
exposure:
# 暴露shutdown endpoint
include: health,shutdown
这时我们只需要在发送停机请求告诉应用,即可优雅停机。发送指令为:curl -XPOST 127.0.0.1:50000/private-url/shutdown
。
3. 集成到Pod中
生产环境中当然不会直接使用Pod部署应用,而是使用Deployment部署应用。以下只是样例:
apiVersion: v1
kind: Pod
metadata:
name: demopod
spec:
containers:
- image: springboot-demo:v1.10
name: demo-container
ports:
- containerPort: 8080
lifecycle:
preStop:
exec:
command: ["curl", "-XPOST", "127.0.0.1:50000/private-url/shutdown"]
注意:
- 前提是你的应用镜像中必须包含
curl
命令。 - 50000是应用管理端口,不能暴露给公网。
4. 实验效果
在命令行里执行:
% curl -X POST 127.0.0.1:50000/private-url/shutdown
{"message":"Shutting down, bye..."}%
应用日志:
... o.s.b.w.e.tomc1at.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
... o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown complete
... o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
... o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown complete
最后,后台发消息:springboot优雅停机,即可拿到源码。
网友评论