重学SpringBoot3-怎样优雅停机

news2024/11/28 12:51:47

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 数据库备份与恢复全攻略

MySQL 数据库备份与恢复全攻略 引言 在现代应用中&#xff0c;数据库是核心组件之一。无论是个人项目还是企业级应用&#xff0c;数据的安全性和完整性都至关重要。为了防止数据丢失、损坏或意外删除&#xff0c;定期备份数据库是必不可少的。本文将详细介绍 MySQL 数据库的备…

Cesium基础-(Entity)-(Billboard)

里边包含Vue、React框架代码 2、Billboard 广告牌 Cesium中的Billboard是一种用于在3D场景中添加图像标签的简单方式。Billboard提供了一种方法来显示定向的2D图像,这些图像通常用于表示简单的标记、符号或图标。以下是对Billboard的详细解读: 1. Billboard的定义和特性 B…

DEVOPS: 容器与虚拟化与云原生

概述 传统虚拟机&#xff0c;利用 hypervisor&#xff0c;模拟出独立的硬件和系统&#xff0c;在此之上创建应用虚拟机是一个主机模拟出多个主机虚拟机需要先拥有独立的系统docker 是把应用及配套环境独立打包成一个单位docker 是在主机系统中建立多个应用及配套环境docker 是…

ansible开局配置-openEuler

ansible干啥用的就不多介绍了&#xff0c;这篇文章主要在说ansible的安装、开局配置、免密登录。 ansible安装 查看系统版本 cat /etc/openEuler-latest输出内容如下&#xff1a; openeulerversionopenEuler-24.03-LTS compiletime2024-05-27-21-31-28 gccversion12.3.1-30.…

img 标签的 object-fit 属性

设置图片固定尺寸后&#xff0c;可以通过 object-fit 属性调整图片展示的形式 object-fit: contain; 图片的长宽比不变&#xff0c;相应调整大小。 object-fit: cover; 当图片的长宽比与容器的长宽比不一致时&#xff0c;会被裁切。 object-fit: fill; 图片不再锁定长宽…

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

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

数学建模清风——论文写作方法教程笔记

PS&#xff1a;本文不讲LateX的使用&#xff01;讲述论文的写作方法 首页&#xff1a;论文标题摘要关键词 一、问题重述 二、问题分析 三、模型假设 四、符号说明 五、模型的建立与求解 六、模型的分析与检验 七、模型的评价、改进与推广 八、参考文献 附录 首页&#xff…

Laravel5 抓取第三方网站图片,存储到本地

背景 近期发现&#xff0c;网站上的部分图片无法显示&#xff0c; 分析发现&#xff0c;是因为引用的第三方网站图片&#xff08;第三方服务器证书已过期&#xff09; 想着以后显示的方便 直接抓取第三方服务器图片&#xff0c;转存到本地服务器 思路 1. 查询数据表&#xff0…

自适应神经网络架构:原理解析与代码示例

个人主页&#xff1a;chian-ocean 文章专栏 自适应神经网络结构&#xff1a;深入探讨与代码实现 1. 引言 随着深度学习的不断发展&#xff0c;传统神经网络模型在处理复杂任务时的局限性逐渐显现。固定的网络结构和参数对于动态变化的环境和多样化的数据往往难以适应&#…

《Python游戏编程入门》注-第4章1

《Python游戏编程入门》的第4章是“用户输入&#xff1a;Bomb Cathcer游戏”&#xff0c;通过轮询键盘和鼠标设备状态实现Bomb Cathcer游戏。 1 Bomb Cathcer游戏介绍 “4.1 认识Bomb Cathcer游戏”内容介绍了Bomb Cathcer游戏的玩法&#xff0c;即通过鼠标来控制红色“挡板”…

【Java基础】2、Java基础语法

f2/fnf2&#xff1a;选中点中的文件名 ​​​​​​​ 1.注释 为什么要有注释&#xff1f; 给别人和以后的自己可以看懂的解释 注释含义 注释是在程序指定位置的说明性信息&#xff1b;简单理解&#xff0c;就是对代码的一种解释 注释分类 单行注释 //注释信息 多行注释…

Spring Boot 应用开发概述

目录 Spring Boot 应用开发概述 Spring Boot 的核心特性 Spring Boot 的开发模式 Spring Boot 在企业应用开发中的优势 结论 Spring Boot 应用开发概述 Spring Boot 是由 Pivotal 团队开发的一个框架&#xff0c;基于 Spring 框架&#xff0c;旨在简化和加速基于 Spring …

微信小程序 - 动画(Animation)执行过程 / 实现过程 / 实现方式

前言 因官方文档描述不清晰,本文主要介绍微信小程序动画 实现过程 / 实现方式。 实现过程 推荐你对照 官方文档 来看本文章,这样更有利于理解。 简单来说,整个动画实现过程就三步: 创建一个动画实例 animation。调用实例的方法来描述动画。最后通过动画实例的 export 方法…

docker的安装配置与基本简单命令

目录 1.docker简介 2.docker安装 2.1使用root用户登陆 更新yum源 2.2安装依赖 2.3设置yum源 更新yum源索引 2.4安装docker 2.5启动并且设置开机自启动 2.6验证安装是否成功 2.7配置docker加速器 2.8重启docker服务 3.docker简单使用 3.1下载镜像 3.2列出…

【Spring】Cookie与Session

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 一、Cookie是什么&#xff1f; Cookie的存在主要是为了解决HTTP协议的无状态性问题&#xff0c;即协议本身无法记住用户之前的操作。 "⽆状态" 的含义指的是: 默认情况…

论文略读:Can We Edit Factual Knowledge by In-Context Learning?

EMNLP 2023 第一个探索in-context learning在语言模型知识编辑方便的效果 传统的知识编辑方法通过在包含特定知识的文本上进行微调来改进 LLMs 随着模型规模的增加&#xff0c;这些基于梯度的方法会带来巨大的计算成本->论文提出了上下文知识编辑&#xff08;IKE&#xff0…

WebGL 添加背景图

1. 纹理坐标&#xff08;st坐标&#xff09;简介 ST纹理坐标&#xff08;也称为UV坐标&#xff09;是一种二维坐标系统&#xff0c;用于在三维模型的表面上精确地定位二维纹理图像。这种坐标系统通常将纹理的左下角映射到(0,0)&#xff0c;而右上角映射到(1,1)。 S坐标&#x…

基于Multisim的可编程放大电路设计与仿真

74LS279&#xff08;RS触发器&#xff09;&#xff0c;结合开关&#xff0c;将输出接入74LS163实现的8位计数器的时钟端&#xff0c;每拨动两次开关K&#xff0c;将产生一个脉冲信号&#xff0c;计数器将加一&#xff0c;产生的结果为000,001,010,011,100,101,110,111&#xff…

面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

并发编程(2)——线程管控

目录 二、day2 1. 线程管控 1.1 归属权转移 1.2 joining_thread 1.2.1 如何使用 joining_thread 1.3 std::jthread 1.3.1 零开销原则 1.3.2 线程停止 1.4 容器管理线程对象 1.4.1 使用容器 1.4.2 如何选择线程运行数量 1.5 线程id 二、day2 今天学习如何管理线程&a…