Spring Boot 2.5 新特性 之 优雅停机

什么是优雅停机

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

@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}. * @www.fhadmin.org * @since 2.3.0 */public enum Shutdown {

/** * 优雅停机 (限期停机) * */GRACEFUL,

/** * 立即停机 */IMMEDIATE;

}

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

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

  • 效果体验

    1. 请求服务端接口

    2. 执行关闭应用

    1. 服务端接到关闭指令

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
  • 接口请求执行完成

相关知识

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

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

//ApplicationContext    //www.fhadmin.org@Overridepublic 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

  1. 通过 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();}}
  1. 不同 web 容器优雅停机行为区别

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

web 容器名称 行为说明
tomcat 9.0.33+ 停止接收请求,客户端新请求等待超时。
Reactor Netty 停止接收请求,客户端新请求等待超时。
Undertow 停止接收请求,客户端新请求直接返回 503。
(0)

相关推荐

  • 听说docker命令你还记不住

    docker作为轻量级的.高性能的沙箱容器,使用频率极高,功能非常强大. 强大的功能需要繁杂的命令来支撑,虽然docker命令很多,多的记不住. 好记性不如一个烂笔头,本文汇总了docker常用的命令 ...

  • 哦,这就是java的优雅停机?(实现及原理)

    优雅停机?这个名词我是服的,如果抛开专业不谈,多好的名词啊! 其实优雅停机,就是在要关闭服务之前,不是立马全部关停,而是做好一些善后操作,比如:关闭线程.释放连接资源等. 再比如,就是不会让调用方的请 ...

  • 54 个官方 Spring Boot Starters 出炉!别再重复造轮子了…….

    前段时间 Spring Boot 2.4.0 也发布了,本文栈长再详细总结下最新的 Spring Boot 2.4.0 官方的 Starters 都有哪些. Spring Boot starters ...

  • 测试环境搭建——Spring Boot 部署

    相比传统的 Java Web ,Spring Boot 极大简化了配置,并且遵守约定优于配置的原则即使0配置也能正常运行,是目前最流行的 Java Web 开发框架.今天的测试环境小萌新篇给大家介绍关 ...

  • 『Spring Boot 2.4新特性』减少95%内存占用

    节省 95%的内存占用,减少 80%的启动耗时. GraalVM 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java 框架 Quarkus 默认支持 G ...

  • 「Spring Boot 2.4 新特性」启动耗时详细监控

    背景 Spring Boot 项目随着项目开发过程中引入中间件数量的增加,启动耗时 逐渐增加. Spring 生态复杂,非官方插件并未严格按官方标准实现.例如 @Configuration 注解提供了 ...

  • Spring Boot 集成 JUnit5,更优雅单元测试!

    为什么使用JUnit5 JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余. JUnit5易扩展,包容性强,可以接入其他的测试引擎. ...

  • Spring Boot 三招组合拳,手把手教你打出优雅的后端接口

    作者:RudeCrab; 链接:suo.im/5YMt2A 一.前言 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等).请求数据(request).响应数据(r ...

  • 官方Spring Boot starters整理

    Spring Boot starters Spring Boot 的功能组件(例如 spring-boot-starter-actuator. spring-boot-starter-data-red ...

  • Spring Boot 解决跨域问题的 3 种方案!

    前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看.Java面试宝典PDF完整版 问题背景: Same Origin ...

  • Spring Boot快速开发企业级Admin管理后台

    Erupt 可快速的构建管理页面,零前端代码.零CURD.自动建表,仅需单个类文件 + 简洁的注解配置,即可快速开发企业级Admin管理后台! 后台管理系统非常重要,但开发存在一定的痛点,如:开发效率 ...

  • 一个比 Spring Boot 快 44 倍的 Java 框架

    light-java是内置了undertow http服务器的REST微服务轻量Java框架,它比Spring Boot内嵌Tomcat这样流行的微服务平台要快44倍,与Go语言fast-http性能 ...

  • 2021 最新版 Spring Boot 速记教程

    Demo 脚手架项目地址: Table of Contents generated with DocToc SpringBoot 速记 一.引入依赖 二.配置 Swagger 参数 一.引入依赖 二. ...