什么是优雅停机

先来一段简单的代码,如下:

@RestController
public class DemoController {@GetMapping("/demo")public String demo() throws InterruptedException {// 模拟业务耗时处理流程Thread.sleep(20 * 1000L);return "hello";}
}

当我们流量请求到此接口执行业务逻辑的时候,若服务端此时执行关机 (kill),spring boot 默认情况会直接关闭容器(tomcat 等),导致此业务逻辑执行失败。在一些业务场景下:会出现数据不一致的情况,事务逻辑不会回滚。

graceful shutdown

在最新的 spring boot 2.3 版本,内置此功能,不需要再自行扩展容器线程池来处理, 目前 spring boot 嵌入式支持的 web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。我们来看下如何使用:

当使用server.shutdown=graceful启用时,在 web 容器关闭时,web 服务器将不再接收新请求,并将等待活动请求完成的缓冲期。

配置体验

此处支持的 shutdown 行为,我们看下 源码枚举如下:

/*** Configuration for shutting down a {@link WebServer}.** @author Andy Wilkinson* @since 2.3.0*/
public enum Shutdown {/*** 优雅停机 (限期停机)**/GRACEFUL,/*** 立即停机*/IMMEDIATE;}

缓冲期 timeout-per-shutdown-phase 配置

默认时间为 30S, 意味着最大等待 30S,超时候无论线程任务是否执行完毕都会停机处理,一定要合理合理设置。

效果体验

1、请求服务端接口

2、执行关闭应用

3、服务端接到关闭指令

2020-05-17 18:28:28.940  INFO 60341 --- [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown        : Commencing graceful shutdown. Waiting for active requests to complete
2020-05-17 18:28:45.923  INFO 60341 --- [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown        : Graceful shutdown complete

4、接口请求执行完成

相关知识

1. 关于此处执行kill -2 而不是 kill -9

kill -2 相当于快捷键 Ctrl + C 会触发 Java 的 ShutdownHook 事件处理(优雅停机或者一些后置处理可参考以下源码)

//ApplicationContext
@Override
public void registerShutdownHook() {if (this.shutdownHook == null) {// No shutdown hook registered yet.this.shutdownHook = new Thread(SHUTDOWN_HOOK_THREAD_NAME) {@Overridepublic void run() {synchronized (startupShutdownMonitor) {doClose();}}};Runtime.getRuntime().addShutdownHook(this.shutdownHook);}
}

kill -9,暴力美学强制杀死进程,不会执行 ShutdownHook

2.  通过 actuate 端点实现优雅停机

POST 请求 /actuator/shutdown 即可执行优雅关机。

源码解析

@Endpoint(id = "shutdown", enableByDefault = false)
public class ShutdownEndpoint implements ApplicationContextAware {@WriteOperationpublic Map<String, String> shutdown() {Thread thread = new Thread(this::performShutdown);thread.setContextClassLoader(getClass().getClassLoader());thread.start();}private void performShutdown() {try {Thread.sleep(500L);}catch (InterruptedException ex) {Thread.currentThread().interrupt();}// 此处close 逻辑和上边 shutdownhook 的处理一样this.context.close();}
}

3.  不同 web 容器优雅停机行为区别

容器停机行为取决于具体的 web 容器行为

关注微信公众号:互联网架构师,在后台回复:2T,可以获取架构全套教程,都是干货。

作者:pig_冷冷

blog.csdn.net/qq_16063307/article/details/106185532

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

Spring Boot 2.3 优雅停机来了,新特性真香!!相关推荐

  1. 聊聊Spring Boot中的优雅停机

    大家好,我是推干货的DD! 今早在社区(spring4all.com)看到一个不错的问题: 感兴趣的小伙伴可以先自己思考一下,或者看一下源码. 关于优雅停机,网上的文章讲的比较透的不多,好多都是复制黏 ...

  2. Spring boot 2.3优雅下线,距离生产还有多远?

    简介: 对于任何一个线上应用,如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求,这使得无损下线成为应用生命周期中必不可少的一个环 ...

  3. 使用Spring boot,Thymeleaf,AngularJS从零开始构建新的Web应用程序–第3部分

    在之前的博客中,我们使用Thymeleaf,Bower和Bootstrap构建了登录页面,并将其部署到了Heroku. 在此博客中,我们将介绍用于前端的AngularJS和在后端的Spring Boo ...

  4. Spring Framework 5.2 正式发布,14项新特性一览

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | xplanet 来源 | http://oschina.net/news/1103 ...

  5. java day60【 Spring 中的 JdbcTemplate[会用] 、Spring 中的事务控制 、Spring5 的新特性[了解] 】...

    第1章 Spring 中的 JdbcTemplate[会用] 1.1JdbcTemplate 概述 1.2JdbcTemplate 对象的创建 1.3spring 中配置数据源 1.3.1 环境搭建 ...

  6. Spring Boot如何以优雅的姿势校验参数

    1.美图 2. 参考 参考:添加链接描述

  7. 使用Spring boot,Thymeleaf,AngularJS从零开始构建新的Web应用程序-第2部分

    在本系列博客中,我们将使用Springboot,Angular等构建完整的Web应用程序. 在上一个博客中,我们与Thymeleaf建立了基本的登录页面. 在此博客中,我们将介绍bower ,它用于管 ...

  8. java 优雅停机_spring boot2.0实现优雅停机的方法

    前期踩的坑 (spring boot 1.x) 1. 添加mavne依赖 org.springframework.boot spring-boot-starter-actuator 2. 启用shut ...

  9. Spring Boot 1.5.x新特性:动态修改日志级别

    前天Spring Boot 1.5终于迎来了第一个RELEASE版本:1.5.0,但是由于一个编译依赖问题在第二天直接连击到了1.5.1.该版本的发布包含了超过320位贡献者的奉献.10000多次的代 ...

  10. Spring Boot 2.3.0 新特性:优雅停机!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 前言:关于Spring Boot.Spring Cloud应用的优 ...

最新文章

  1. 基于PyTorch的Seq2Seq翻译模型详细注释介绍(一)
  2. 技术图文:进一步完善自动化交易系统 - 04
  3. SylixOS DSP upgrade命令解析
  4. php 复制文件夹并压缩到最小_php在线压缩并下载压缩文件的方法
  5. 终于开通了园子里的博客!
  6. hurricane中文_hurricane是什么意思
  7. Vim winmanager文件浏览自动更新
  8. iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样
  9. 2017.10.19 大陆争霸 思考记录
  10. 2017.3.13 木棍分割 思考记录
  11. python连接redis集群如何释放内存_python 连接redis集群
  12. python词云图片在哪儿打开_如何用python创建词云图片
  13. 做移动视频直播应用的思路
  14. China Mobile”、“China Unicom”,请修改为中国移动、中国联通
  15. python--文件的导入与导出
  16. python代理池_进击:用Python搭建高匿代理池
  17. MySQL错误:Value ‘0000-00-00 00:00:00‘ can not be represented as java.sql.Timestamp
  18. 【现代信号处理】17 - 基于滤波器组的谱估计
  19. dq坐标系下无功功率表达式_基于瞬时电流分解的谐波电流检测方法研究
  20. 服务器sata硬盘安装系统,#####SATA、RAID、SCSI硬盘用U盘安装原版XP、2003系统######支持服务器硬盘!...

热门文章

  1. JAVA虚拟机——利用javap反编译class文件分析代码执行过程
  2. 程序员的一种境界【转的】
  3. Ps 初学者教程,如何添加选择、减去选择和进行交叉选择?
  4. Mac 选项列如何设置控制中心?
  5. 数据库管理软件SQLPro for SQLite for Mac 2022.30
  6. 如何打开苹果Mac触控板的三指拖移功能?
  7. Mac自带的实用功能
  8. 入门:Mac终端常用知识
  9. 格式化Mac硬盘---DoYourData Super Eraser安全、快速
  10. OA系统中的HRM的发展和存在的误区,值得每一个HR学习