什么是优雅停机
先来一段简单的代码,如下:
@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,超时候无论线程任务是否执行完毕都会停机处理,一定要合理合理设置。
效果体验
- 请求服务端接口
- 请求服务端接口
-
执行关闭应用
-
- 服务端接到关闭指令
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
- 接口请求执行完成
相关知识
- 关于此处执行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
- 通过 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();
}
}
- 不同 web 容器优雅停机行为区别
容器停机行为取决于具体的 web 容器行为
tomcat 9.0.33+ | 停止接收请求,客户端新请求等待超时。 |
Reactor Netty | 停止接收请求,客户端新请求等待超时。 |
Undertow | 停止接收请求,客户端新请求直接返回 503。 |
相关推荐
Spring Boot 2.3 新特性优雅停机详解 本文主要介绍了 Spring Boot 2.3 新特性优雅停机的详细解释,通过示例代码对大家的学习或者工作具有一定的参考学习价值。 一、什么是优雅停机? 优雅停机是指在关闭服务端时...
该资源主要关注Spring Boot 2.5的实战开发,涵盖了Spring Boot 2.5的新特性、自动化配置原理、REST API开发、MySQL数据库开发、Redis高并发缓存、MongoDB数据库开发、消息队列、安全机制、性能监控等热门知识点。...
spring2.5新特性相关,我自己整理的
《Spring Boot 2.5开发实战1》这本书是针对Java高级工程师的一门精品课程,旨在帮助读者掌握Spring Boot 2.5的新特性和实践应用。Spring Boot作为一个快速开发框架,其核心价值在于通过自动化配置极大地简化了项目...
Spring 2.5是Spring框架的一个重要版本,它在2008年发布,引入了许多新的特性和改进,显著提升了开发效率和灵活性。这个版本主要关注于注解驱动的开发、依赖注入的增强以及对Java配置的支持。接下来,我们将详细探讨...
spring 2.5新特性spring 2.5新特性spring 2.5新特性spring 2.5新特性spring 2.5新特性
Spring2.5的新特性-第一部分.doc 本文将主要关注于简化的配置和在Spring应用程序上下文(application context)核心新增的基于注解的功能; Spring_2.5新特性-第二部分-Spring_MVC中的新特性.doc
标题中的“anan基于JDK11、Spring Boot 2.5.x、Spring Cloud 生态体系技术,采用微服务前后端”表明这是一个使用最新技术栈构建的微服务项目。在这个项目中,开发人员选择了Java 11(JDK11)作为编程语言,Spring ...
【Spring2.5的新特性】 Spring框架自诞生以来,一直致力于简化企业级应用的开发,提供强大且非侵入式的解决方案。Spring2.5在这个方向上迈出了一大步,尤其对于使用Java 5或更高版本的开发者来说,它带来了更多便利...
该项目是一款基于Spring Boot 2.5和Spring Cloud 2020框架,融合Alibaba技术的分布式微服务开发平台源码。它包含1232个文件,涵盖1046个Java源文件、71个XML配置文件、25个工厂配置文件、24个YAML配置文件、15个...
Spring Boot 2.5.0 是 Spring Boot 的一个版本,提供了许多新的特性和改进。下面是 Spring Boot 2.5.0 的一些关键特性和知识点: SSM 环境搭建 SSM(Spring+SpringMVC+MyBatis)是目前非常流行的一种 Java Web ...
1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,它允许组件之间通过接口而非硬编码的方式来引用彼此。在2.5版本中,DI通过@Autowired注解得到了加强,可以自动匹配类型或通过属性名来注入依赖...
在版本2.5时,Spring Security已经是一个成熟且功能丰富的安全框架,为开发者提供了一套强大的工具来管理用户的登录、权限控制以及会话管理。 在"spring security2.5 jar"中,包含了Spring Security框架的核心类和...
为了充分利用这个版本,建议阅读官方文档,了解新特性、改进和弃用的功能。同时,保持与社区的互动,如关注官方博客、参与讨论论坛等,以便获取最新资讯和最佳实践。 在下载并解压"spring-boot-2.5.15.zip"后,...
本项目为基于Spring Boot 2.5和Netty-WebSocket框架构建的网页版聊天工具源码,适用于企业内部集成。源码包含336个文件,涵盖57个JavaScript脚本、48个Java类、15个CSS样式表、11个HTML模板、4个JSON配置文件等,...
Spring Boot 的核心特性之一是自动配置,它会根据项目中的依赖自动设置相应的配置。例如,如果你的项目包含了 Spring Data JPA 相关的依赖,Spring Boot 将自动配置数据访问层,使得你可以立即开始编写数据库相关的...
标题中的“spring2.5的一个新特性”指的Spring框架的第2.5版本中引入的重要更新。Spring是一个广泛使用的Java企业级应用开发框架,它提供了丰富的功能来简化应用程序的构建,包括依赖注入、面向切面编程(AOP)、...
《Spring Reference 2.5 中文》是针对Spring框架2.5版本的开发参考手册,旨在为Java开发者提供详尽的指南和最佳实践。Spring框架是Java企业级应用开发的重要工具,它以其依赖注入(Dependency Injection)和面向切面...
Spring2.5版本是该框架的一个重要里程碑,它在2008年发布,带来了许多新特性和改进,提升了开发者在构建应用程序时的灵活性和效率。 **依赖注入(DI)和控制反转(IoC)** Spring的核心特性之一是依赖注入(Dependency...
Spring Boot 2.0 实现优雅停机的方法 Spring Boot 2.0 中实现优雅停机的方法主要是通过配置 Tomcat 容器和实现 GracefulShutdown 类来实现的。优雅停机是指在关闭应用程序时,先停止接收新的请求,然后等待所有...