当前位置: 首页 > news >正文

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-怎样优雅停机

  • 1. 什么是优雅停机?
  • 2. Spring Boot 3 优雅停机的配置
  • 3. Tomcat 和 Reactor Netty 的优雅停机机制
    • 3.1 Tomcat 优雅停机
    • 3.2 Reactor Netty 优雅停机
  • 4. 优雅停机的流程
  • 5. 实现优雅停机的完整示例
    • 5.1 代码示例
    • 5.2 IDEA 停止服务
    • 5.3 测试优雅停机
  • 6. 负载均衡器中的停机策略
  • 7. 优雅停机的注意事项
  • 8. 总结

在现代微服务架构中,优雅停机(Graceful Shutdown)是一项重要功能,可以确保服务在关闭时处理完所有当前请求,避免突然终止连接或丢失数据。Spring Boot 3 提供了对优雅停机的内置支持,允许在关闭应用程序上下文期间为现有请求设置一个宽限期,同时防止新请求进入。本文将详细介绍 Spring Boot 3 的优雅停机机制,重点分析 Tomcat 和 Reactor Netty 两种常用的嵌入式 Web 服务器的优雅停机流程。

1. 什么是优雅停机?

优雅停机的目标是在服务关闭时:

  • 允许当前的处理请求在指定的宽限期内完成。
  • 阻止新的请求进入。
  • 向外部监控或负载均衡器标记服务为不可用。

这种机制可以确保服务在维护或版本升级时避免数据丢失和请求中断,提供更高的稳定性和可用性。

2. Spring Boot 3 优雅停机的配置

在 Spring Boot 3 中,我们可以使用 server.shutdown 配置来开启优雅停机,并指定宽限期。配置项如下:

server:shutdown: "graceful" # 开启优雅停机
spring:lifecycle:timeout-per-shutdown-phase: "20s"  # 停机的宽限期,默认为 30 秒

此配置项适用于所有四种嵌入式 Web 服务器:Tomcat、Jetty、Reactor Netty 和 Undertow。

注意:Spring Boot 3 默认禁用优雅停机,需要将 server.shutdown 设置为 graceful 以启用。

3. Tomcat 和 Reactor Netty 的优雅停机机制

Spring Boot 3 支持在不同的 Web 服务器上实现优雅停机。以下是 Tomcat 和 Reactor Netty 的具体停机方式:

3.1 Tomcat 优雅停机

使用Tomcat的优雅关机需要Tomcat 9.0.33或更高版本,在 Tomcat 上启用优雅停机后,当收到关闭信号时,它将停止接受新的连接请求,并在网络层阻止传入流量:

  • 阻止新请求:一旦启动关闭流程,Tomcat 将在网络层拒绝新的请求连接。
  • 完成现有请求:Tomcat 会确保已有请求在指定的宽限期内完成。如果请求未完成且宽限期到达,将强制终止。

注意:若某些请求未在宽限期内完成,则这些请求将被中断。

3.2 Reactor Netty 优雅停机

Reactor Netty 是 Spring WebFlux 默认使用的非阻塞式 Web 服务器,适合响应式编程。Reactor Netty 的优雅停机实现方式如下:

  • 网络层停止:当关闭信号到达,Reactor Netty 将停止接受新请求连接,并释放相关资源。
  • 等待宽限期:当前所有活动请求在宽限期内继续处理;在宽限期结束后,未完成的请求将被强制中止。

Reactor Netty 在优雅停机期间通过停止接受新的连接来实现无缝停机。其无阻塞模型让服务在短时间内完成停机。

4. 优雅停机的流程

在 Tomcat 和 Reactor Netty 上的优雅停机流程类似,大致包含以下几个步骤:

  1. 标记服务不可用:停止接收新的请求,通常是通过在负载均衡器中剔除该服务或在网络层阻断连接来实现。
  2. 设置宽限期:当前请求允许在宽限期内继续处理。
  3. 关闭活动连接:宽限期结束后,所有未完成的请求会被中止,资源释放。

Spring Boot 3 的 SmartLifecycleApplicationContext 控制器在关闭阶段对生命周期进行管理,保证所有组件按照顺序优雅停止。

5. 实现优雅停机的完整示例

我们可以创建一个简单的 Spring Boot 3 应用来展示优雅停机配置。

5.1 代码示例

application.yml 中启用优雅停机并设置宽限期为 30 秒:

server:shutdown: "graceful" # 开启优雅停机
spring:lifecycle:timeout-per-shutdown-phase: "30s"  # 停机的宽限期,默认为 30 秒

创建一个简单的 REST 控制器,模拟一个处理时间较长的请求:

@RestController
@RequestMapping("/api")
public class DemoController {@GetMapping("/long-running")public String longRunningTask() throws InterruptedException {System.out.println("开始执行耗时任务...");Thread.sleep(20000); // 模拟耗时任务return "任务完成";}
}

此控制器会等待 20 秒后返回结果。通过优雅停机机制,即使应用关闭,也会允许该任务在 30 秒宽限期内完成。

启动类里添加一段代码方便打印服务何时停止运行:

    @PreDestroypublic void destroy() {System.out.println("Application is destroyed");}

5.2 IDEA 停止服务

由于 IDEA 运行的服务点击红点结束,会直接停止程序,无法模拟停机,Linux 上通过 java -jar 运行的程序没有这种烦恼,所有此处引入 actuator 的功能,它可以执行 shutdown。

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

增加如下 actuator 配置:

management:endpoints:web:exposure:include: '*'endpoint:shutdown:enabled: true # 开放停机端口

调用 curl -X POST http://localhost:8080/actuator/shutdown,即可停止服务:

测试停止服务

5.3 测试优雅停机

启动应用并访问 http://localhost:8080/api/long-running,然后调用 http://localhost:8080/actuator/shutdown 停止服务。

请求在宽限期内返回 任务完成

任务完成

修改超期时间为 10s,超过宽限期后,请求被中止。

请求被中止

6. 负载均衡器中的停机策略

在实际应用中,负载均衡器(如 Nginx、Kubernetes)也可以在服务停机时配合优雅停机流程,通过从负载均衡池中剔除当前实例来防止新流量进入。这样可以确保所有请求被其他实例接管,而当前实例只处理已有请求,直至完成后停机。

7. 优雅停机的注意事项

  • 宽限期配置:设置合理的宽限期,确保长时间请求可以完成。
  • 负载均衡器协作:在生产环境中建议与负载均衡器配合,实现完整的优雅停机流程。
  • 避免频繁停机:频繁停机会中断长时间任务,应避免在高负载时频繁重启应用。

8. 总结

在 Spring Boot 3 中,通过简单配置即可实现优雅停机,确保服务在关闭时能够完整处理当前请求,减少对用户体验的影响。在 Tomcat 和 Reactor Netty 上实现的优雅停机过程相似,都采用了在网络层阻止新请求和在应用层设置宽限期的方式。优雅停机机制在高并发服务中显得尤为重要,是微服务架构中保持稳定性和一致性的关键。

相关文章:

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-怎样优雅停机 1. 什么是优雅停机&#xff1f;2. Spring Boot 3 优雅停机的配置3. Tomcat 和 Reactor Netty 的优雅停机机制3.1 Tomcat 优雅停机3.2 Reac…...

【数据结构】顺序表和链表

1.线性表 我们在C语言当中学过数组&#xff0c;其实呢&#xff0c;数组可以实现线性表&#xff0c;线性表理解上类似于数组&#xff0c;那么什么是线性表呢&#xff1f;线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见…...

Training language models to follow instructions with human feedback解读

前置知识方法数据集结论 前置知识 GPT的全称是Generative Pre-Trained Transformer&#xff0c;预训练模型自诞生之始&#xff0c;一个备受诟病的问题就是预训练模型的偏见性。因为预训练模型都是通过海量数据在超大参数量级的模型上训练出来的&#xff0c;对比完全由人工规则…...

线性回归矩阵求解和梯度求解

正规方程求解线性回归 首先正规方程如下&#xff1a; Θ ( X T X ) − 1 X T y \begin{equation} \Theta (X^T X)^{-1} X^T y \end{equation} Θ(XTX)−1XTy​​ 接下来通过线性代数的角度理解这个问题。 二维空间 在二维空间上&#xff0c;有两个向量 a a a和 b b b&…...

M3U8不知道如何转MP4?包能学会的4种格式转换教学!

在流媒体视频大量生产的今天&#xff0c;M3U8作为一种基于HTTP Live Streaming&#xff08;HLS&#xff09;协议的播放列表格式&#xff0c;广泛应用于网络视频直播和点播中。它包含了媒体播放列表的信息&#xff0c;指向了视频文件被分割成的多个TS&#xff08;Transport Stre…...

C++第4课——swap、switch-case-for循环(含视频讲解)

文章目录 1、课程代码2、课程视频 1、课程代码 #include<iostream> using namespace std; int main(){/* //第一个任务&#xff1a;学会swap int a,b,c;//从小到大排序输出 升序 cin>>a>>b>>c;//5 4 3if(a>b)swap(a,b);//4 5 3 swap()函数是用于交…...

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 4)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…...

linux网络编程7——协程设计原理与汇编实现

文章目录 协程设计原理与汇编实现1. 协程概念2. 协程的实现2.1 setjmp2.2 ucontext2.3 汇编实现2.4 优缺点2.5 实现协程原语2.5.1 create()2.5.2 yield()2.5.3 resume()2.5.4 exit()2.5.5 switch()2.5.6 sleep() 2.6 协程调度器 3. 利用hook使用协程版本的库函数学习参考 协程设…...

Ubuntu22.04版本左右,扩充用户可使用内存

1 取得root权限后&#xff0c;输入命令 lsblk 查看所有磁盘和分区&#xff0c;找到想要替换用户可使用文件夹内存的磁盘和分区。若没有进行分区&#xff0c;并转为所需要的分区数据类型&#xff0c;先进行分区与格式化&#xff0c;过程自行查阅。 扩充替换过程&#xff0c;例如…...

基于ArcMap中Python 批量处理栅格数据(以按掩膜提取为例)

注&#xff1a;图片来源于公众号&#xff0c;公众号也是我自己的。 ArcMap中的python编辑器是很多本科生使用ArcMap时容易忽略的一个工具&#xff0c;本人最近正在读一本书《ArcGIS Python 编程基础与应用》&#xff0c;在此和大家分享、交流一些相关的知识。 这篇文章主要分享…...

【flink】之集成mybatis对mysql进行读写

背景&#xff1a; 在现代大数据应用中&#xff0c;数据的高效处理和存储是核心需求之一。Flink作为一款强大的流处理框架&#xff0c;能够处理大规模的实时数据流&#xff0c;提供丰富的数据处理功能&#xff0c;如窗口操作、连接操作、聚合操作等。而MyBatis则是一款优秀的持…...

Java设计模式—观察者模式详解

引言 模式角色 UML图 示例代码 应用场景 优点 缺点 结论 引言 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知…...

【Cri-Dockerd】安装cri-dockerd

cri-dockerd的作用&#xff1a; 在k8s1.24之前。k8s会通过dockershim来调用docker进行容器运行时containerd&#xff0c;并且会自动安装dockershim&#xff0c;但是从1.24版本之前k8s为了降低容器运行时的调用的复杂度和效率&#xff0c;直接调用containerd了&#xff0c;并且…...

GCC及GDB的使用

参考视频及博客 https://www.bilibili.com/video/BV1EK411g7Li/?spm_id_from333.999.0.0&vd_sourceb3723521e243814388688d813c9d475f https://www.bilibili.com/video/BV1ei4y1V758/?buvidXU932919AEC08339E30CE57D39A2BABF6A44F&from_spmidsearch.search-result.0…...

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 3)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

数据结构——基础知识补充

1.队列 1.普通队列 queue.Queue 是 Python 标准库 queue 模块中的一个类&#xff0c;适用于多线程环境。它实现了线程安全的 FIFO&#xff08;先进先出&#xff09;队列。 2.双端队列 双端队列&#xff08;Deque&#xff0c;Double-Ended Queue&#xff09;是一种具有队列和…...

只有.git文件夹时如何恢复项目

有时候误删文件但由于.git是隐藏文件夹而幸存&#xff0c;或者项目太大&#xff0c;单单甩给你一个.git文件夹让你自己恢复整个项目&#xff0c;该怎么办呢&#xff1f; 不用担心&#xff0c;只要进行以下步骤&#xff0c;即可把原项目重新搭建起来&#xff1a; 创建一个文件…...

anchor、anchor box、bounding box之间关系

最近学YOLO接触到这些概念&#xff0c;一下子有点蒙&#xff0c;简单总结一下。 anchor和anchor box Anchor&#xff1a;表示一组预定义的尺寸比例&#xff0c;用来代表常见物体的宽高比。可以把它看成是一个模板或规格&#xff0c;定义了物体框的“形状”和“比例”&#xff…...

代码随想录算法训练营第三十天 | 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间

LeetCode 452.用最少数量的箭引爆气球&#xff1a; 文章链接 题目链接&#xff1a;452.用最少数量的箭引爆气球 思路&#xff1a; 气球的区间有重叠部分&#xff0c;只要弓箭从重叠部分射出来&#xff0c;那么就能减少所使用的弓箭数 **局部最优&#xff1a;**只要有重叠部分…...

海亮科技亮相第84届中国教装展 尽显生于校园 长于校园教育基因

10月25日&#xff0c;第84届中国教育装备展示会&#xff08;以下简称“教装展”&#xff09;在昆明滇池国际会展中心开幕。作为国内教育装备领域规模最大、影响最广的专业展会&#xff0c;本届教装展以“数字赋能教育&#xff0c;创新引领未来”为主题&#xff0c;为教育领域新…...

C语言数据结构学习:栈

C语言 数据结构学习 汇总入口&#xff1a; C语言数据结构学习&#xff1a;[汇总] 1. 栈 栈&#xff0c;实际上是一种特殊的线性表。这里使用的是链表栈&#xff0c;链表栈的博客&#xff1a;C语言数据结构学习&#xff1a;单链表 2. 栈的特点 只能在一端进行存取操作&#x…...

如何快速分析音频中的各种频率成分

从视频中提取音频 from moviepy.editor import VideoFileClip# Load the video file and extract audio video_path "/mnt/data/WeChat_20241026235630.mp4" video_clip VideoFileClip(video_path)# Extract audio and save as a temporary file for further anal…...

MongoDB 6.0 主从复制配置

以下是 MongoDB 6.0 版本配置主从的详细安装步骤&#xff1a; 1. 安装 MongoDB&#xff1a;可以从官网下载 MongoDB 6.0 的安装包并进行安装&#xff0c;或者使用相应的包管理工具进行安装。 2. 配置主节点&#xff1a;在主节点的 MongoDB 配置文件&#xff08;默认路径为 …...

NPU 神经网络处理单元

Ⅰ 什么是 NPU&#xff1f; 当前正处于神经网络和机器学习处理需求爆发的初期。传统的 CPU&#xff08;中央处理器&#xff09;/GPU&#xff08;图形处理器&#xff09;可以执行类似任务&#xff0c;但专门为神经网络优化的 NPU&#xff08;神经处理单元&#xff09;比 CPU/GP…...

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…...

Vulkan 开发(五):Vulkan 逻辑设备

图片来自《Vulkan 应用开发指南》 Vulkan 开发系列文章&#xff1a; 1. 开篇&#xff0c;Vulkan 概述 2. Vulkan 实例 3. Vulkan 物理设备 4. Vulkan 设备队列 在 Vulkan 中&#xff0c;逻辑设备&#xff08;Logical Device&#xff09;是与物理设备&#xff08;Physical D…...

Kafka 解决消息丢失、乱序与重复消费

一、引言 在分布式系统中&#xff0c;Apache Kafka 作为一种高吞吐量的分布式发布订阅消息系统&#xff0c;被广泛应用于日志收集、流式处理、消息队列等场景。然而&#xff0c;在实际使用过程中&#xff0c;可能会遇到消息丢失、乱序、重复消费等问题&#xff0c;这些问题可能…...

计算机专业毕业生面试工具推荐:白瓜面试

随着毕业季的临近&#xff0c;计算机专业的毕业生们即将步入职场&#xff0c;面试成为了他们必须面对的挑战。在这个过程中&#xff0c;选择合适的面试工具可以大大提高求职成功率。今天&#xff0c;我要向大家推荐一款专为计算机专业毕业生设计的面试工具——白瓜面试。 为什…...

数字IC开发:布局布线

数字IC开发&#xff1a;布局布线 前端经过DFT&#xff0c;综合后输出网表文件给后端&#xff0c;由后端通过布局布线&#xff0c;将网表转换为GDSII文件&#xff1b;网表文件只包含单元器件及其连接等信息&#xff0c;GDS文件则包含其物理位置&#xff0c;具体的走线&#xff1…...

做网站所具备的的条件/北京网站排名推广

我试图将一些代码从perl转换为php.Perl代码如下所示&#xff1a;my $handle Connect($port,$host);我试图使用socket在PHP中做同样的事情.我试过socket_create和socket_connect,socket_create和socket_bind,以及fsocketopen.结果,我遇到错误消息,说“拒绝连接”或“拒绝许可”…...

字体/宁波seo教学

最近在使用yocto添加自己的编译代码时&#xff0c;遇到了一个问题。报错如下&#xff1a; ERROR: zm-bsp-0.1-r0 do_package: QA Issue: zm-bsp: Files/directories were installed but not shipped in any package: 网上查了很多信息&#xff0c;都没有解决我的问题&#xf…...

免费网页制作成app/seo网站推广如何做

JVM内存区域中&#xff0c;除了程序计数器外&#xff0c;其他几个运行时区域都有可能发生OutOfMemoryError&#xff08;OOM&#xff09;异常。本文对OOM异常进行总结&#xff0c;通过代码验证JVM规范中描述的运行时区域存储的内容&#xff1b;了解可能导致这些区域OOM异常的代码…...

织梦做中英文企业网站/俄罗斯搜索引擎入口

1环境 Win10&#xff0c;ANACONDA3(64-bit)&#xff0c;Python3.6.2。ANACONDA Prompt中不能用pip命令安装包&#xff0c;并且是在安装了TensorFlow后才发生的。 TypeError: parse() got an unexpected keyword argument ‘transport_encoding’ 2错误信息 报错如下&#…...

滨州 网站开发/厉害的seo顾问

[转]do_select()函数分析&#xff0c;理解select(),poll(),poll_wait()函数的关系 2013-10-4阅读282 评论0 Select函数实现原理分析&#xff08;转载&#xff09;select需要驱动程序的支持&#xff0c;驱动程序实现fops内的poll函数。select通过每个设备文件对应的poll函数提供…...

巨野做网站的/广点通

默认ansible的所有task是在我们的配置的管理机器上面运行的,当在一个独立的群集里面配置,那是适用的.而有一些情况是,某些任务运行的状态是需要传递给其他机器的,在同一个任务你需要在其他机器上执行,这时候你就许多要用task委托 使用delegate_to关键字便可以配置任务在其他机器…...