Spring Boot 应用如何优雅关闭

Spring Boot 优雅停止服务的几种方法 以上这几种方法实现的话比较简单,但是真实工作中还需要考虑的点还很多,比如需要保护暴露的点不被别人利用,一般要加一些防火墙,或者只在内网使用,保证程序安全。在真实的工作中的时候第三种比较常用,程序中一般使用内存队列或线程池的时候最好要优雅的关机,将内存队列没有处理的保存起来或线程池中没处理完的程序处理完。但是因为停机的时候比较快,所以停服务的时候最好不要处理大量的数据操作,这样会影响程序停止。 阅读详情

什么是优雅关闭

优雅关闭是指在关闭应用或服务时,执行一系列操作来确保数据的一致性和系统的稳定性。这些操作包括:

  • 停止接受新的请求
  • 等待所有正在处理的请求完成
  • 关闭所有连接和资源
  • 释放所有内存和 CPU 资源

优雅关闭可以避免数据丢失、程序崩溃等问题。

优雅关闭的重要性

优雅关闭对于应用和服务的高可用性至关重要。它可以确保在关闭应用或服务时不会丢失数据或中断正在进行的操作。

优雅关闭的实现方法

优雅关闭可以通过多种方式实现,包括:

  • 使用操作系统提供的关闭信号
  • 使用应用程序自身的关闭机制
  • 使用第三方库或框架

优雅关闭的示例

以下是一个使用 Java 实现优雅关闭的示例:

Java

public class GracefulShutdown {

    public static void main(String[] args) {
        // 创建一个线程池来处理请求
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        // 接受新的请求
        while (true) {
            executorService.submit(() -> {
                // 处理请求
            });
        }

        // 优雅关闭
        executorService.shutdown();
        while (!executorService.isTerminated()) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在这个示例中,我们使用 ExecutorService 来处理请求。在关闭应用时,我们首先关闭 ExecutorService,然后等待所有正在处理的请求完成。这样可以确保所有请求都能够正常完成,不会丢失数据。

如何优雅关闭 Spring Boot

优雅关闭 Spring Boot 应用是指在关闭应用时,不会中断正在处理的请求,并能正确释放资源。Spring Boot 提供了多种优雅关闭应用的方法:

1. 使用 Actuator

Actuator 是 Spring Boot 提供的一个管理端点,可以用于监控和管理 Spring Boot 应用。Actuator 提供了一个 /shutdown 端点,用于关闭应用。

要使用 Actuator 关闭应用,需要在应用的配置文件中添加以下配置:

management.endpoints.web.exposure.include=shutdown

配置完成后,可以通过 HTTP 请求 /shutdown 端点来关闭应用。例如,可以使用 curl 命令:

curl -X POST http://localhost:8080/shutdown

2. 使用自定义关闭钩子

Java 提供了 Runtime 类,用于注册关闭钩子。关闭钩子是在 JVM 退出时执行的代码。

可以使用自定义关闭钩子来优雅关闭 Spring Boot 应用。例如:

public class GracefulShutdown {

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            // 关闭应用
        }));

        // 启动应用
    }
}

3. 使用 Spring Boot 生命周期事件

Spring Boot 提供了 ApplicationListener 接口,用于监听 Spring Boot 应用的生命周期事件。

可以使用 ApplicationListener 监听 ContextClosedEvent 事件,并在事件发生时执行优雅关闭操作。例如:

public class GracefulShutdownListener implements ApplicationListener<ContextClosedEvent> {

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 关闭应用
    }
}

4. 使用 Spring Boot 2.3 的新功能

Spring Boot 2.3 引入了新的 server.shutdown 配置属性,用于控制应用关闭的行为。

设置 server.shutdown=graceful 后,Spring Boot 会在接收到关闭信号后,首先停止接受新的请求,然后等待所有当前正在处理的请求处理完成,最后再关闭应用。

server.shutdown=graceful

Spring Boot 提供了多种优雅关闭应用的方法。可以根据应用的具体需求选择合适的方法。

Spring Boot优雅关闭的底层实现是什么?

Spring Boot 优雅关闭的底层实现依赖于 Spring Boot Actuator 和 Tomcat 等嵌入式 Web 服务器的 生命周期 事件。

1. Spring Boot Actuator

Spring Boot Actuator 提供了一个 /shutdown 端点,用于关闭应用。当收到关闭请求时,Actuator 会触发 ContextClosedEvent 事件。

2. Tomcat 生命周期事件

Tomcat 等嵌入式 Web 服务器提供了 beforeStop() 和 afterStop() 等生命周期事件。

3. 优雅关闭流程

Spring Boot 优雅关闭的流程大致如下:

  1. 客户端向 /shutdown 端点发送关闭请求。
  2. Actuator 触发 ContextClosedEvent 事件。
  3. 应用程序监听器监听到 ContextClosedEvent 事件,并执行优雅关闭操作,例如:
    • 停止接收新的请求
    • 等待所有正在处理的请求完成
    • 关闭数据库连接
    • 释放资源
  4. Tomcat 触发 beforeStop() 事件,进行一些清理工作,例如:
    • 关闭连接器
    • 释放端口
  5. Tomcat 触发 afterStop() 事件,完成关闭操作。

4. 优雅关闭的配置

Spring Boot 默认情况下启用了优雅关闭功能。可以通过以下配置项进行调整:

  • server.shutdown: 控制关闭行为,可选值包括 immediate 和 graceful。
    • immediate: 立即关闭应用,不等待正在处理的请求完成。
    • graceful: 优雅关闭应用,等待正在处理的请求完成。
  • server.shutdown.timeout: 优雅关闭超时时间,单位为秒。

Spring Boot 优雅关闭的底层实现依赖于 Spring Boot Actuator 和 Tomcat 等嵌入式 Web 服务器的生命周期事件。通过监听 ContextClosedEvent 事件,应用程序可以执行优雅关闭操作,确保数据的一致性和系统的稳定性。

Spring Boot Actuator优雅关闭的底层实现跟系统的关系

Spring Boot Actuator 优雅关闭的底层实现与系统密切相关,主要体现在以下几个方面:

1. 操作系统信号

Spring Boot Actuator 依赖于操作系统提供的信号机制来触发优雅关闭。当收到 SIGTERM 或 SIGKILL 等信号时,Actuator 会触发 ContextClosedEvent 事件,并执行优雅关闭操作。

2. 线程池

Spring Boot 默认使用 Tomcat 线程池来处理请求。在优雅关闭过程中,Actuator 会停止接收新的请求,并等待所有正在处理的请求完成。这需要操作系统提供线程管理机制,以便能够控制线程的执行和销毁。

3. 文件句柄

在优雅关闭过程中,应用程序需要关闭所有打开的文件句柄。这需要操作系统提供文件管理机制,以便能够打开、关闭和管理文件句柄。

4. 内存管理

在优雅关闭过程中,应用程序需要释放所有占用的内存空间。这需要操作系统提供内存管理机制,以便能够分配、回收和管理内存空间。

5. 总结

Spring Boot Actuator 优雅关闭的底层实现依赖于操作系统提供的多种机制,包括信号机制、线程管理机制、文件管理机制和内存管理机制。这些机制对于保证优雅关闭的顺利进行至关重要。

以下是一些具体的例子:

  • SIGTERM 信号是操作系统提供的终止信号,它指示应用程序或服务应该正常关闭。Spring Boot Actuator 会监听 SIGTERM 信号,并在收到该信号时触发 ContextClosedEvent 事件,并执行优雅关闭操作。
  • Tomcat 线程池是操作系统提供的线程管理机制,它允许应用程序创建和管理线程。在优雅关闭过程中,Spring Boot Actuator 会停止接收新的请求,并等待所有正在处理的请求完成。这需要操作系统提供线程管理机制,以便能够控制线程的执行和销毁。
  • 文件句柄 是操作系统提供的文件管理机制,它允许应用程序打开、关闭和管理文件。在优雅关闭过程中,应用程序需要关闭所有打开的文件句柄。这需要操作系统提供文件管理机制,以便能够打开、关闭和管理文件句柄。
  • 内存空间 是操作系统提供的内存管理机制,它允许应用程序分配、回收和管理内存空间。在优雅关闭过程中,应用程序需要释放所有占用的内存空间。这需要操作系统提供内存管理机制,以便能够分配、回收和管理内存空间。

总之,Spring Boot Actuator 优雅关闭的底层实现与系统密切相关,依赖于操作系统提供的多种机制。这些机制对于保证优雅关闭的顺利进行至关重要。

Java微服务——如何优雅关闭 Spring Boot 应用 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBoot 应用呢?那就通过本文一起来探究吧。(本文主要针对基于Spring B... 阅读详情

相关推荐

Spring Boot 应用优雅关闭详解

在微服务和分布式系统的背景下,应用的启动和关闭变得尤为重要。尤其是在进行应用的部署、升级和维护时,如何优雅地关闭一个Spring Boot应用以确保所有正在进行的请求被妥善处理,变得至关重要。本文将详细介绍Spring Boot应用优雅关闭的概念、实现方法及其在实际应用中的意义和最佳实践。

fudaihb的博客 2345

Spring Boot 项目优雅关闭(两种完善解决方案附带示例代码)

Spring Boot 项目优雅关闭常用两种方案,一种是使用kill -2 和 -15 发送程序终止信号,另一种是使用spring-boot-actuator包提供一个优雅下线接口

kerwin的博客 1万+

优雅关闭Spring Boot应用程序:优雅地停止Spring Boot应用程序

使用Actuator可以通过发送HTTP请求来关闭应用程序,使用自定义的关闭钩子可以在应用程序关闭时执行特定的操作,而使用Spring Boot的生命周期事件可以监听应用程序的关闭事件并执行相应的操作。在开发Spring Boot应用程序时,如何优雅地关闭应用程序是一个常见的问题。通过Actuator,我们可以使用HTTP端点来执行各种管理操作,包括关闭应用程序。除了使用Actuator,我们还可以使用Java提供的Runtime类来注册一个自定义的关闭钩子,以在应用程序关闭时执行特定的操作。

YmsNet的博客 876

Spring boot 项目中如何优雅停止服务的五种方法,值得收藏!

=====第二种方法也比较简单,获取程序启动时的上下文,然后关闭主程序启动时的上下文。这样的程序在关闭的时候也会调用PreDestroy注解。如下方法在程序启动十秒后进行关闭。try {第三种===第一种方法,在springboot启动的时候将进程号写入一个app.pid文件,生成的路径是可以指定的,可以通过命令cat /Users/huangqingshi/app.id | xargs kill命令直接停止服务,这个时候bean对象的PreDestroy方法也会调用的。

2201_75604341的博客 4887

LVGL的基础知识总结

另外,还有自定义字库的使用,具体可参考开发手册。

qq_28576837的博客 7391

U2Net网络实战:从原理到代码实现(附背景去除应用)

本文深入解析了U2Net网络的原理与代码实现,重点剖析了其独特的嵌套U型结构(RSU模块)和显著图融合机制。通过实战演示,指导读者如何加载预训练模型并应用于精准的图像背景去除任务,为电商、摄影等领域提供高效的自动化抠图解决方案。

nn3456的博客 491

Spring Boot 应用优雅关闭

写这篇文章是因为看到 “线程池在使用结束后应该正确关闭.” 那么如果我们的 Spring 应用都无法正确关闭, 那么线程池肯定也无从保障。

howeres的博客 566

单反相机物镜设计[DG-10]

REAR(要打在像面,操作数要找像面对应位置15):以透镜单位表示的真实光线径向坐标,波长由Wave定义,参见“Hx、Hy、Px和Py”。最小玻璃厚度最小不能小于semi-dia的1/10,要根据layout看有没有过厚过薄,反复调节。PROD:两个操作数的乘积(操作#1 X操作#2)。3x4就是57.3x0.41=23.5。拦光一般在第一面和最后一面操作,减少边缘无用光线。光阑面与镜面贴近,要调距离,同时设置光阑像差。后截距是指从镜头后表面到焦点的距离。CONS:弧度转为角度。镜头相互嵌入,有错误。

weixin_72050316的博客 600

如何优雅关闭 Spring Boot 应用

前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBoot 应用呢?那就通过本文一起来探究吧。(本文主要针对基于Spring B...

lingqu+wx bjmsb06 286

SAP Integration Suite 与 SAP Cloud Integration 的关系解析

SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 595

SI案例分享--PCB通孔互连新技术的应用(VeCS)

本文介绍了VeCS的物理结构和制造过程,并通过全波仿真模拟和测量,分析了VeCS的电性能,并与传统的测量方法进行了比较。结果表明,由于有一个连续的参考平面,VeCS的TDR阻抗可以很容易地控制到目标阻抗,同时可以大大减轻信道上的串扰,的确是一种性能不错的PCB互连创新设计方案。

一只豌豆象的博客 2116

如何优雅的关闭基于Spring Boot 内嵌 Tomcat 的 Web 应用

背景 最近在搞云化项目的启动脚本,觉得以往kill方式关闭服务项目太粗暴了,这种kill关闭应用的方式会让当前应用将所有处理中的请求丢弃,响应失败。这种形式的响应失败在处理重要业务逻辑中是要极力避免的,所以我们需要一种更加优雅的方式关闭springBoot应用。 基本思路 首先我们关闭一个微服务应用可以分为两大步骤 关闭web应用服务器 关闭spring容器 我项目中使用的是内置的tomcat服...

weixin_47082274的博客 3349

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

Spring Boot应用优雅关闭

在需要实现优雅关闭的应用工程中增加下述依赖:部分启动器默认就依赖了Actuator启动器,如:spring-cloud-starter-netflix-eureka-server,那么下述依赖是可以省略的。

风生的博客 705

8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术

NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。

烟云的计算 4265

华为od面试手撕真题【分解质因数】

华为od面试手撕真题【分解质因数】

MISAYAONE的博客 1135

Spring Boot应用优雅关闭机制与实践指南

在Java微服务架构中,应用生命周期管理是保障系统稳定性的关键技术。Spring Boot通过Shutdown Hook机制实现优雅关闭,其核心原理是注册JVM关闭钩子触发Spring容器的有序销毁流程。该技术能有效解决资源泄漏、数据不一致等生产环境常见问题,特别适用于需要处理数据库连接池释放、消息队列消费者退出的分布式场景。通过Actuator端点或JMX管理Bean等热词技术,开发者可以实现对应用关闭过程的精准控制。结合Kubernetes等容器平台的preStop钩子,能够构建从应用到基础设施的全链路

weixin_33462927的博客 85

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

优雅关闭 Spring Boot 应用

前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBoot 应用呢?那就通过本文一起来探究吧。(本文主要针对基于Spring B...

gw的博客 277

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

优雅关闭Spring Boot应用

文章目录官方介绍代码测试小结 最新的Spring Boot添加了一个新特性 — 优雅停机。 官方介绍 官方文档地址:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-graceful-shutdown 这个机制会有一个超时时间,该超时时间提供一个宽限期,在此宽限期内,现有请求将被允许完成,而新请求将不被允许。 不允许新请求的确切方式因所使用的Web服务器而异。 Jetty,Reactor N

分享技术,分享生活 1719

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Boot应用优雅关闭实践与优化方案

在分布式系统架构中,应用的优雅关闭(Graceful Shutdown)是确保数据一致性和系统稳定性的关键技术。其核心原理是通过生命周期钩子机制,在接收到终止信号时有序停止接收新请求、完成进行中的任务并释放资源。该技术能有效避免强制终止导致的事务中断、消息丢失等数据一致性问题,尤其适用于微服务、消息队列、数据库连接池等关键组件场景。本文以Spring Boot框架为例,深入解析了包括SmartLifecycle接口、Shutdown Hook、PreDestroy注解等实现方式,并针对HikariCP连接池

weixin_29234509的博客 179
上一篇: 分布式事务及解决方案
下一篇: ThreadLocal是什么?
byteinit
博客等级 码龄17年 326粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值