`
fhadmin框架平台
  • 浏览: 19700 次
文章分类
社区版块
存档分类
最新评论

Spring Boot 2.5 新特性 之 优雅停机

 
阅读更多

什么是优雅停机

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

@RestController
public classDemoController{
	@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. 请求服务端接口
    1. 执行关闭应用

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

相关知识

  1. 关于此处执行kill -2 而不是 kill -9
  • kill -2 相当于快捷键 Ctrl + C 会触发 Java 的 ShutdownHook 事件处理(优雅停机或者一些后置处理可参考以下源码)
    //ApplicationContext
    //www.fhadmin.org
	@Override
	publicvoidregisterShutdownHook(){
		if (this.shutdownHook == null) {
			// No shutdown hook registered yet.
			this.shutdownHook = new Thread(SHUTDOWN_HOOK_THREAD_NAME) {
				@Override
				publicvoidrun(){
					synchronized (startupShutdownMonitor) {
						doClose();
					}
				}
			};
			Runtime.getRuntime().addShutdownHook(this.shutdownHook);
		}
	}
  • kill -9,暴力美学强制杀死进程,不会执行 ShutdownHook
  1. 通过 actuate 端点实现优雅停机

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

源码解析

@Endpoint(id = "shutdown", enableByDefault = false)
public classShutdownEndpointimplementsApplicationContextAware{

    //www.fhadmin.org
	@WriteOperation
	public Map<String, String> shutdown(){
		Thread thread = new Thread(this::performShutdown);
		thread.setContextClassLoader(getClass().getClassLoader());
		thread.start();
	}

	privatevoidperformShutdown(){
		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。
分享到:
评论

相关推荐

    SpringBoot2.3新特性优雅停机详解

    Spring Boot 2.3 新特性优雅停机详解 本文主要介绍了 Spring Boot 2.3 新特性优雅停机的详细解释,通过示例代码对大家的学习或者工作具有一定的参考学习价值。 一、什么是优雅停机? 优雅停机是指在关闭服务端时...

    藏经阁-Spring Boot 2.5开发实战-114.pdf

    该资源主要关注Spring Boot 2.5的实战开发,涵盖了Spring Boot 2.5的新特性、自动化配置原理、REST API开发、MySQL数据库开发、Redis高并发缓存、MongoDB数据库开发、消息队列、安全机制、性能监控等热门知识点。...

    spring2.5新特性相关

    spring2.5新特性相关,我自己整理的

    Spring Boot 2.5开发实战1

    《Spring Boot 2.5开发实战1》这本书是针对Java高级工程师的一门精品课程,旨在帮助读者掌握Spring Boot 2.5的新特性和实践应用。Spring Boot作为一个快速开发框架,其核心价值在于通过自动化配置极大地简化了项目...

    spring2.5新特性的说明

    Spring 2.5是Spring框架的一个重要版本,它在2008年发布,引入了许多新的特性和改进,显著提升了开发效率和灵活性。这个版本主要关注于注解驱动的开发、依赖注入的增强以及对Java配置的支持。接下来,我们将详细探讨...

    spring 2.5新特性

    spring 2.5新特性spring 2.5新特性spring 2.5新特性spring 2.5新特性spring 2.5新特性

    Spring2.5新特性.rar

    Spring2.5的新特性-第一部分.doc 本文将主要关注于简化的配置和在Spring应用程序上下文(application context)核心新增的基于注解的功能; Spring_2.5新特性-第二部分-Spring_MVC中的新特性.doc

    anan基于JDK11、Spring Boot 2.5.x、Spring Cloud 生态体系技术,采用微服务前后端.zip

    标题中的“anan基于JDK11、Spring Boot 2.5.x、Spring Cloud 生态体系技术,采用微服务前后端”表明这是一个使用最新技术栈构建的微服务项目。在这个项目中,开发人员选择了Java 11(JDK11)作为编程语言,Spring ...

    Spring2.5的新特性

    【Spring2.5的新特性】 Spring框架自诞生以来,一直致力于简化企业级应用的开发,提供强大且非侵入式的解决方案。Spring2.5在这个方向上迈出了一大步,尤其对于使用Java 5或更高版本的开发者来说,它带来了更多便利...

    基于Spring Boot 2.5和Spring Cloud 2020的bootx-cloud分布式微服务开发平台设计源码

    该项目是一款基于Spring Boot 2.5和Spring Cloud 2020框架,融合Alibaba技术的分布式微服务开发平台源码。它包含1232个文件,涵盖1046个Java源文件、71个XML配置文件、25个工厂配置文件、24个YAML配置文件、15个...

    Spring Boot 2.5.0简单学习pdf资料

    Spring Boot 2.5.0 是 Spring Boot 的一个版本,提供了许多新的特性和改进。下面是 Spring Boot 2.5.0 的一些关键特性和知识点: SSM 环境搭建 SSM(Spring+SpringMVC+MyBatis)是目前非常流行的一种 Java Web ...

    springframework2.5源代码

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,它允许组件之间通过接口而非硬编码的方式来引用彼此。在2.5版本中,DI通过@Autowired注解得到了加强,可以自动匹配类型或通过属性名来注入依赖...

    spring spring security2.5 jar

    在版本2.5时,Spring Security已经是一个成熟且功能丰富的安全框架,为开发者提供了一套强大的工具来管理用户的登录、权限控制以及会话管理。 在"spring security2.5 jar"中,包含了Spring Security框架的核心类和...

    spring-boot-2.5.15.zip

    为了充分利用这个版本,建议阅读官方文档,了解新特性、改进和弃用的功能。同时,保持与社区的互动,如关注官方博客、参与讨论论坛等,以便获取最新资讯和最佳实践。 在下载并解压"spring-boot-2.5.15.zip"后,...

    基于Spring Boot 2.5和Netty-WebSocket的 LayIM 集成企业内部网页版聊天工具设计源码

    本项目为基于Spring Boot 2.5和Netty-WebSocket框架构建的网页版聊天工具源码,适用于企业内部集成。源码包含336个文件,涵盖57个JavaScript脚本、48个Java类、15个CSS样式表、11个HTML模板、4个JSON配置文件等,...

    spring-boot-2.5.15.tar.gz

    Spring Boot 的核心特性之一是自动配置,它会根据项目中的依赖自动设置相应的配置。例如,如果你的项目包含了 Spring Data JPA 相关的依赖,Spring Boot 将自动配置数据访问层,使得你可以立即开始编写数据库相关的...

    spring2.5的一个新特性

    标题中的“spring2.5的一个新特性”指的Spring框架的第2.5版本中引入的重要更新。Spring是一个广泛使用的Java企业级应用开发框架,它提供了丰富的功能来简化应用程序的构建,包括依赖注入、面向切面编程(AOP)、...

    Spring Reference 2.5 中文

    《Spring Reference 2.5 中文》是针对Spring框架2.5版本的开发参考手册,旨在为Java开发者提供详尽的指南和最佳实践。Spring框架是Java企业级应用开发的重要工具,它以其依赖注入(Dependency Injection)和面向切面...

    Spring2.5-中文参考手册chm

    Spring2.5版本是该框架的一个重要里程碑,它在2008年发布,带来了许多新特性和改进,提升了开发者在构建应用程序时的灵活性和效率。 **依赖注入(DI)和控制反转(IoC)** Spring的核心特性之一是依赖注入(Dependency...

    spring boot2.0实现优雅停机的方法

    Spring Boot 2.0 实现优雅停机的方法 Spring Boot 2.0 中实现优雅停机的方法主要是通过配置 Tomcat 容器和实现 GracefulShutdown 类来实现的。优雅停机是指在关闭应用程序时,先停止接收新的请求,然后等待所有...

Global site tag (gtag.js) - Google Analytics