1.前言
近日就系统重启引发了一些思考,在系统重启过程中,正在进行的请求会如何被处理?正在消费的消息会不会丢失?异步执行的任务会不会被中断?既然存在这些问题,那我们的应用程序是不是就不能重启?但是,我们的应用程序随着版本迭代也在不断重启为什么这些问题没有出现呢?还是应用做了额外处理?带着这些疑问,结合场景模拟,看看实际情况怎么处理。
2. 场景
2.1 http请求
2.1.1 创建请求
@RestController
public class ShutDownController {
@RequestMapping("shut/down")
public String shutDown() throws InterruptedException {
TimeUnit.SECONDS.sleep(20);
return "hello";
}
}
复制代码
2.1.2 调用请求
http://localhost:8080/shut/down
2.1.3 模拟重启
kill -2 应用pid
复制代码
2.1.4 现象
2.1.5 结论
请求执行过程中,关闭应用程序出现无法访问提示
2.1.6 开启优雅关机
如上出现的现象对用户来说很不友好,会造成用户一脸懵逼,那么有没有什么措施可以避免这种现象的出现呢?是否可以在应用关闭前执行完已经接受的请求,拒绝新的请求呢?答案可以的,只需要在配置文件中新增优雅关机
配置
server:
shutdown: graceful # 设置优雅关闭,该功能在Spring Boot2.3版本中才有。注意:需要使用Kill -2 触发来关闭应用,该命令会触发shutdownHook
spring:
lifecycle:
timeout-per-shutdown-phase: 30s # 设置缓冲时间,注意需要带上时间单位(该时间用于等待任务执行完成)
复制代码
添加完配置后,再次执行2.1.2
和2.1.3
流程,就会看到如下效果