SpringBoot应用优雅的退出

本文探讨了在SpringBoot应用滚动升级时如何实现用户无感的优雅退出,特别是处理耗时请求和定时任务。SpringBoot 2.3及以上版本支持Graceful shutdown,可通过配置`server.shutdown=graceful`和`spring.lifecycle.timeout-per-shutdown-phase`实现。对于旧版本或自定义关闭处理,需要确保所有任务执行完毕后再关闭,例如处理Quartz定时任务。在优雅退出过程中,可能出现的线程未停止警告可能与某些库冲突,但不影响实际效果。
摘要由CSDN通过智能技术生成

本来计划做一次应用的部署升级,由单机模式,改为集群模式。但是在考虑方案时,遇到一个问题,如何在滚动升级时实现用户无感。

按照普通的逻辑,在滚动升级时,肯定是一台一台的进行升级部署,然后通过LB进行流量控制。这样用户时无感的,不会受升级的影响。

但是有一个问题就是,对于一台服务器进行升级时的“原子”操作,如何保证用户无感呢?应用关闭后,LB能够配置策略,自动感知并切换流量路径。

问题就出在应用关闭的那一瞬间,如果存在正在连接的用户(尤其是X系统,部分任务都是比较长时间的,比如执行费用清算,一个请求可能要跑几十个产品,如果此时直接停掉服务,则请求会被中断),如何保证已连接不被中断。

所以问题的核心就变成了应用如何优雅的进行退出。

这里我们需要分两种情况,一种是,如果SpringBoot的版本比较新(2.3及以上),则会比较简单,SpringBoot已经支持了Graceful shutdown的能力。

另一个情况,则是SpringBoot还使用的是老版本,或者没有使用SpringBoot,此时就需要自行进行处理了。

无论是哪种情况,在考虑如何进行优雅退出的时候,都需要面临几种场景:

1、用户连接都是耗时较小的,且都没有用到多线程来执行任务

此时,比较简单,参考此文章里面的方式进行shutdown即可。(不需要依赖SpringBoot的graceful shutdown能力)

https://www.cnblogs.com/huangqingshi/p/11370291.htmlicon-default.png?t=N5K3https://www.cnblogs.com/huangqingshi/p/11370291.html

通过文中的几种方式进行shutdown,基本上都能够正常的关闭请求中的连接。

但是,如果出现某个连接执行的时间比较长,且后续逻辑会用到spring container的功能,此时会报错。

因为,在Sp

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金融码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值