1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

SpringBoot停服实践

SpringBoot优雅停服实践

作为本际云服务器推荐网的小编小本本,我们知道当外部流量请求到服务端接口执行业务逻辑的时候,若服务端此时执行关机(kill),springboot默认情况会直接关闭容器(tomcat等),导致此业务逻辑执行失败。在一些业务场景下会出现数据不一致的情况,事务逻辑不会回滚。在最新的springboot2.3版本已内置此功能,不需要再自行扩展容器线程池来处理,目前springboot嵌入式支持的web服务器(Jetty、ReactorNetty、Tomcat和Undertow)以及反应式和基于Servlet的web应用程序都支持优雅停机功能。此处支持的shutdown行为,我们看下源码枚举如下:

SpringBoot停服实践

1. 使用方式

在application.properties中添加以下配置当server.shutdown=graceful启用后,在web容器关闭时,web服务器将不再接收新请求,并将在缓冲期内等待活动请求完成。缓冲期timeout-per-shutdown-phase配置:默认时间为30S,意味着最大等待30S,超时后无论线程任务是否执行完毕都会停机处理,需要根据项目实际需要合理设置。以上配置完毕,重新发布以后,服务端就支持优雅停服了。

2. 触发优雅停服

有两种方式实现优雅停机,分别是:

1、对进程PID执行kill-2而不是kill-9。kill-9,暴力美学强制杀死进程,不会执行ShutdownHook;但是kill-2相当于快捷键Ctrl+C会触发Java的ShutdownHook事件处理,进行优雅停机或者一些后置处理。

2、通过actuator端点实现优雅停机,前提为项目已加入actuator依赖,以及application.properties加入相关配置。此时,POST请求/actuator/shutdown即可执行优雅关机。

3. 例子

我们通过一个demo来验证下是否实现了优雅停服,下面是一个http测试接口,请求后返回一个json串。

  • 启动项目,正常访问结果如下:
  • 未配置优雅停服前,停机结果如下。使用Ctrl+C模拟在请求执行过程中停机,此时请求中断,后端日志抛出异常。
  • 配置好优雅停服后,再模拟上述情况。由下图可以看到服务停止后,停服前的请求能正常返回,日志中也未抛出异常。

4. 不同springboot嵌入式web容器优雅停机行为区别

在不同的springboot嵌入式web容器中,优雅停机的行为是有所区别的,需要注意:

  • Jetty、Reactor Netty和Tomcat支持优雅停机
  • Undertow目前还不支持优雅停机

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5906.html