重学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 秒宽限期内完成。

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

    @PreDestroy
    public 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 上实现的优雅停机过程相似,都采用了在网络层阻止新请求和在应用层设置宽限期的方式。优雅停机机制在高并发服务中显得尤为重要,是微服务架构中保持稳定性和一致性的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903757.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶】模版入门看这一篇就够了

文章目录 1. 泛型编程2. 函数模板2. 1 函数模板概念2. 2 函数模板格式2. 3 函数模板的原理2. 4 函数模板的实例化2. 5 模板参数的匹配原则2. 6 补充&#xff1a;使用调试功能观察函数调用 3. 类模板3 .1 类模板的定义格式3. 2 类模板的实例化 1. 泛型编程 在C语言中&#xff0…

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…

基于边缘计算的智能门禁系统架构设计分析

案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统&#xff0c;用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前&#xff0c;可以通过线上提前预约的方式将自己的个人信息…

CAS的ABA问题

目录 什么是 CAS CAS最主要的用途&#xff0c;实现原子类 基于CAS实现自旋锁 CAS的一个典型缺陷&#xff0c;ABA问题 解决 ABA 问题的方法 什么是 CAS CAS: 全称Compare and swap&#xff0c;字⾯意思:”⽐较并交换“&#xff0c;⼀个 CAS 涉及到以下操作&#xff1a; 我…

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的布匹缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的布匹缺陷检测系统是在 PyTo…

基于SSM+小程序的童装商城管理系统(商城3)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的童装商城管理系统实现了管理员及用户。 1、管理员实现了 首页、个人中心、用户管理、分类列表管理、童装商城管理、系统管理、订单管理。 2、用户实现了 注册、登录、首…

一家光伏企业终止,恐不具行业代表性,市占率仅为2.35%

海达光能终止原因如下&#xff1a;报告期内海达光能销售金额较所在行业第二名亚玛顿相差两倍以上&#xff0c;公司毛利率更是远低于行业龙头福莱特&#xff0c;恐难以说明公司行业代表性。在企业竞争上&#xff0c;公司2021年度的市场占有率约为2.35%&#xff0c;公司未来光伏玻…

丁子晴作品《指尖的爱的温度》荣获“金犊奖”全球最佳新锐奖

第33届时报金犊奖颁奖盛典于10月18日在中国成都西部智谷数字体验中心隆重举行。丁子晴的作品《指尖的爱的温度》在激烈的竞争中脱颖而出,荣获了第33届“金犊奖”全球最佳新锐奖。享有盛誉的“金犊奖”是一个全球性的奖项,以其专业严谨、创意水平高的特点,被业界誉为“青年创意的…

kaggle 数据集下载

文章目录 kaggle 数据集下载&#xff08;1&#xff09; 数据集下载&#xff08;2&#xff09; 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍&#xff0c;快忘得差不多了&#xff0c;惭愧。 参考了好多帖子&#xff0c;使用命令行…

vue2项目在发布后更新,提示用户刷新页面

1、在项目根目录创建resetVersion.js的文件&#xff0c;内容如下 &#xff08;具体路径可能会有点问题&#xff0c;但是不影响&#xff09; const path require(path); const fsExtra require(fs-extra);const runBuild async () > {try {const OUTPUT_DIR public; // …

13.音乐管理系统(基于SpringBoot + Vue)

目录 1.系统的受众说明 ​​​​​​​ 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图&#xff08;图2.2.1-1&#xff09; 2.2.2 系统功能表&#xff08;表2.2.2…

MySQL用户权限管理属于SQL语句中的DCL语句

1.用户授权 语法&#xff1a;grant 权限&#xff0c;权限&#xff0c;on 库名&#xff0c;表名 to 用户名 [identified by 密码] MySQL5的版本&#xff0c;如果这个用户事先不存在&#xff0c;这个grant命令去给用户授权的时候&#xff0c;会将用户一起创建出来&#xff0…

时间序列预测(十五)——有关Python项目框架的实例分析

#1024程序员节&#xff5c;征文# 在之前的学习中&#xff0c;已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解&#xff0c;并能够将所学知识应用于实际中&#xff0c;我决定找一个完整的Python框架来进行深入学习。经过寻找&#xff0c;我终于找到了一篇非常具…

业务流程顺畅度为何受制于数据失真

在当今数字化驱动的商业环境中&#xff0c;企业的业务流程高度依赖于数据的准确性和完整性。然而&#xff0c;数据失真问题却如同隐匿在流程中的“暗礁”&#xff0c;频繁地给企业的业务流程顺畅度带来严重挑战&#xff0c;进而影响企业的整体运营效率和竞争力。 数据失真的表…

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目 1. 项目概述 项目目标是构建一个大数据分析系统&#xff0c;包含以下核心模块&#xff1a; 1、数据爬取&#xff1a;通过request请求获取猎聘网的就业数据。 2、数据存储和分析&#xff1a;使用 Hive …

GB/T 28046.1-2011 道路车辆 电气及电子设备的环境条件和试验 第1部分:一般规定(2)

写在前面 本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T 28046标准的相关知识&#xff0c;希望能帮助更多的同学认识和了解GB/T 28046标准。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 第1部分&#xff1a;一般规定 7. 试验和要…

GetMaterialApp组件的用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

自适应阻抗案例分析(上)

案例分析一 Duchaine,V.,Gosselin,C.(2009).Safe,stable and intuitive control for physical human-robot interaction.In IEEE international conference on robotics and automation,2009.ICRA09(pp.3383-3388).IEEE. 主要贡献 1.利用外力反馈调整阻尼系数&#xff0c;同…

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤…

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言&#xff1a;上一篇实现了角色简单的移动控制&#xff0c;但是实际游戏中玩家的视角是可以转动的&#xff0c;并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动&#xff0c;觉得有帮助的话可以点赞收藏支持一下&#xff01; 玩家第一人称视角 修复小问…