《学会 SpringBoot · 优雅停机方案》

Source

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

CSDN.gif


优雅停机

技术简介

在 Spring Boot 中,“优雅停机”(Graceful Shutdown)指的是在应用程序关闭时,能够优雅地处理正在进行的请求和任务,而不是强制立即终止。这种机制可以确保在应用程序关闭时,现有的请求能够被处理完毕,避免数据丢失或请求失败。

优雅停机的特点

  • 处理现有请求:在接收到关闭信号后,应用会停止接收新的请求,但会继续处理已经接收到的请求。
  • 可配置的超时:可以配置一个超时时间,在这个时间内,应用会尝试完成所有正在进行的请求。如果超时后仍有请求未完成,应用会强制关闭。
  • 资源清理:在关闭过程中,可以执行一些清理操作,比如关闭数据库连接、释放资源等。

支持的版本
优雅停机功能在 Spring Boot 2.3 中首次引入,并在后续版本中得到了增强和改进。Spring Boot 3 继续支持和优化这一特性。


实现步骤

Step1、添加依赖:首先确保你的Spring Boot项目中包含了Spring Boot Actuator的依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Step2、启用端点:默认情况下,ShutdownEndpoint是禁用的。你需要在application.properties或application.yml文件中启用它。

# 很多资料仅配置shutdown,会提示 No static resource actuator/shutdown
management:

  endpoints:
    # 暴露所有端点信息,设置为false比较安全,端点需要的单独打开
    enabled-by-default: true

    #以web方式暴露
    web:
      exposure:
        include: '*'

Step3、使用端点:一旦启用了 ShutdownEndpoint,你可以通过HTTP请求来触发应用程序的关闭。

# 使用curl命令,这会导致应用程序开始关闭过程。
curl -X POST http://localhost:8082/actuator/shutdown

会输出如下信息:

{
    
      
    "message": "Shutting down, bye..."
}

温馨提示:基于安全考虑,由于这个端点会关闭应用程序,所以通常只应该在受保护的环境中使用,例如通过安全框架如Spring Security 限制访问。


自定义方式

您可以通过以下几种方式实现优雅关机时的自定义逻辑:
1、使用 @PreDestroy 注解
在 Spring 管理的 bean 中使用 @PreDestroy 注解,可以在 bean 被销毁之前执行一些清理逻辑。

@Component
public class MyService {
    
      

    @PreDestroy
    public void cleanup() {
    
      
        System.out.println("Cleaning up resources...");
    }
}

2、实现 ApplicationListener 接口
您可以实现 ApplicationListener 接口,以便在应用程序上下文关闭时执行特定操作。

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;

@Component
public class MyContextClosedListener implements ApplicationListener<ContextClosedEvent> {
    
      

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
    
      
        // 执行清理操作
        System.out.println("Application context is closing...");
    }
}

3、使用 SpringApplication 的 addListeners 方法
在启动应用程序时,您可以向 SpringApplication 添加自定义监听器,以便在应用程序关闭时执行特定操作。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;

@SpringBootApplication
public class MyApplication {
    
      

    public static void main(String[] args) {
    
      
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.addListeners((ApplicationListener<ContextClosedEvent>) event -> {
    
      
            System.out.println("Application is shutting down...");
        });
        app.run(args);
    }
}

4、自定义类继承ShutdownEndpoint,具体方法后续展开。


总结陈词

此篇文章介绍了SpringBoot 项目中如何进行优雅停机的相关知识,仅供学习参考。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif