SpringBoot在K8s下实现优雅停机

2023-11-12

在K8s中,当我们实现滚动升级之前,务必要实现应用级别的优雅停机。否则滚动升级时,还是会影响到业务。本文介绍SpringBoot应用实现优雅停机。此次教程基于SpringBoot 2.5.0。

1. 加入必要依赖

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

2. 配置SpringBoot应用

默认情况下,SpringBoot是直接关机的,所以,需要将优雅停机配置打开。在applicatoin.yaml中配置:

spring:
  application:
    name: demo
  # 停机过程超时时长设置了20s,超过20s,直接停机
  lifecycle:
    timeout-per-shutdown-phase: 20s

server:
  port: 8080
  #  默认为IMMEDIATE,表示立即关机;GRACEFUL表示优雅关机
  shutdown: graceful

management:
  server:
    address: 127.0.0.1
    port: 50000
  # 开启shutdown endpoint
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      base-path: /private-url
      exposure:
        # 暴露shutdown endpoint
        include: health,shutdown

这时我们只需要在发送停机请求告诉应用,即可优雅停机。发送指令为:curl -XPOST 127.0.0.1:50000/private-url/shutdown

3. 集成到Pod中

生产环境中当然不会直接使用Pod部署应用,而是使用Deployment部署应用。以下只是样例:

apiVersion: v1 
kind: Pod 
metadata:
  name: demopod
spec:
  containers:
  - image: springboot-demo:v1.10
    name: demo-container
    ports:
    - containerPort: 8080
    lifecycle:
      preStop:
        exec:
          command: ["curl", "-XPOST", "127.0.0.1:50000/private-url/shutdown"]

注意:

1.前提是你的应用镜像中必须包含curl命令。2.50000是应用管理端口,不能暴露给公网。

4. 实验效果

在命令行里执行:

% curl -X POST 127.0.0.1:50000/private-url/shutdown
{"message":"Shutting down, bye..."}%

应用日志:

... o.s.b.w.e.tomcat.GracefulShutdown  : Commencing graceful shutdown. Waiting for active requests to complete
... o.s.b.w.e.tomcat.GracefulShutdown  : Gracefsul shutdown complete
... o.s.b.w.e.tomcat.GracefulShutdown  : Commencing graceful shutdown. Waiting for active requests to complete
... o.s.b.w.e.tomcat.GracefulShutdown  : Graceful shutdown complete

最后,关注本公众号,后台发消息:springboot优雅停机,即可拿到源码。

首图来自:https://pixabay.com/photos/woman-model-flowers-chrysanthemums-6059236/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot在K8s下实现优雅停机 的相关文章

  • 将 html 转换为 pdf 时防止表格单元格跨页破坏

    使用 Google Apps 脚本 我有一个 html 模板 我填写该模板 然后以 pdf 形式发送 通过传真和 或电子邮件 该模板包括一个带有问题 答案的两列表格 如果行数足够多 表格会在pdf中跨页分页 并且分页符通常发生在单元格的中间
  • ReactTable 修复了最后一行

    我正在使用 ReactTable 最后我需要创建一些摘要 当分页存在时 它每次都应该可见 可以用react table来实现吗 我可以通过创建下一个表来部分解决这个问题 但我没有找到如何隐藏标题的方法 另一个问题是调整列宽度时 它不会应用于
  • 如何观察包含许多 sass 文件的整个目录/文件夹的变化

    我如何跟踪包含许多 sass 文件的整个目录的更改 我正在使用以下命令来观察 sass 的变化 file sass watch style scss style css 但是如何观察包含许多 sass 文件的整个目录 文件夹的变化 只需使用
  • 在导航栏下方添加背景图片

    我想在导航栏下方添加背景图像 具有完整窗口大小的宽度 它不应覆盖整个页面长度 而是从导航栏菜单下方开始 一直向下直到特定的指定高度 但宽度是满的 我参考了以下内容 但仍然没有结果 在 Twitter Bootstrap 中的导航栏下方启动背
  • 具有最大高度和滚动的动态内容的对话框+页脚CSS

    我有一个dialog with 位置 绝对 and a 最大高度放 这最大高度财产是set从外面by a javascript框架 jQuery UI 对话框 所以我无法控制它 里面有 2 个 div 其中一个充满了动态内容 and a 静
  • 导航栏折叠在 Bootstrap 中不起作用

    Bhanu pratap 解决了这个问题 在这个问题的末尾检查一下 我一直在遵循旧的路线来构建导航栏折叠 三明治 问题是课程中的页面顶部似乎有一个黑条 并且缩小页面时会出现导航栏 对我来说 我只需在左侧找到一个按钮 另外 当我缩小页面时 我
  • 应用程序移至 Docker 生产环境时 Flask-WTF CSRF 验证失败

    我刚刚为我一直在开发的 Flask 应用程序设置了生产环境 这个堆栈是 Windows Server 2012 R2 Hyper V VM Running Ubuntu 14 04 Docker 1 5 Running Containers
  • 从顶部开始在同一水平线上显示同一行中的两个 div

    这是我的代码 floating box display inline block width 150px margin 10px border 3px solid 73AD21 after box border 3px solid red
  • 无法使用 docker build 运行 gradle 包装器

    我有这个小构建 FROM eclipse temurin 17 jdk as build java COPY java project root project WORKDIR root project RUN chmod x gradle
  • 理解 z-index:该元素如何出现在其父级同级元素的前面?

    为什么当我删除时红色 div 位于绿色 div 前面z index from wrapperRed 感觉像z index是沿着链条向上继承的 如果我改变z index将绿色 div 更改为 6 即使删除第一句中描述的行后 它仍保留在红色 d
  • save_and_open_page 已停止提供我的 CSS

    我的测试设置工作得很好 每当我打电话时 都能提供正确格式的 css 页面save and open page从测试中 然后 我设置了一些 javascript 测试 并对我的设置进行了一些更改 抱歉 我无法详细说明所有内容 我没有足够详细地
  • 将鼠标悬停在原点时会触发translateY()

    当您将光标移动到按钮底部时 是否可以无限期地不触发动画 它看起来是这样的 gif https i stack imgur com QwdHW gif and codepen https codepen io jaeyson pen GwwJ
  • CSS 继承、别名和其他很酷的东西

    有一天 我随机浏览网页 发现了一些程序 可以让你编写 CSS 别名和其他很酷的东西 我现在不记得了 举个例子 我记得你可以这样做 myclass background color red greenfont 其中 greenfont 在其他
  • 删除 IE9 边缘周围的 2px 灰色边框

    我正在尝试对这个网站进行编码 尝试关键字 并且我正在尝试找出如何删除这个阴影2px灰色边框延伸到 IE9 窗口的内部 至少顶部 左侧和底部 我的边距设置为零 因此所有页面元素都到达页面的最边缘 但使用 IE9 它们会停在这个灰色边框处 我没
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • CSS 到底如何计算相对尺寸

    我想更好地理解某些 CSS 行为 这与具体问题无关 我只是在调试网站时遇到的 让我们在固定位置的 div 中放置一个全宽图像 div img style width 100 src https via placeholder com 150
  • 具有 100% 高度行和 Internet Explorer 9 的表格

    我有以下示例 div style height 150px background color AAAAFF div
  • 使用 CSS 的响应式图像

    我发现调整图像大小以使其具有响应能力很棘手 我正在开发一个 php 应用程序来自动将网站转换为响应式版本 我有点被图像困住了 我已经成功地为网站上的每个图像添加了一个包装类 并且可以很好地调整图像的大小 我的问题在于自然小于窗口的图像 例如
  • 带有 npm 启动脚本的 Nodejs 应用程序

    我对nodejs很陌生 在我的docker化环境中 我想为nodejs应用程序提供appdynamics支持 这要求每个应用程序都要求将以下内容作为其应用程序的第一行 require appdynamics profile controll

随机推荐

  • 分布式系统实现幂等性的方式

    幂等性 接口的幂等性就是同样的数据 在实现方法的多次调用 得到的结果一致 对于查询接口 天然的保持幂等性 但是对于cud来说 如何保持幂等性 看法 从以下方式来看 要保证幂等性 必须要有一个标识 至始至终的保持不变的标识 只有这样 后来的操
  • 开源点云数据集整理汇总

    目录 一 ModelNet40 1 网址 2 模型 二 ShapeNet 1 网址 2 模型 三 S3DIS Dataset 1 网址 2 模型 四 ScanNet 1 网址 2 模型 五 RGB D Object Dataset 1 网址
  • 麻雀算法极限学习机SSA-ELM回归预测及其MATLAB代码实现

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • 哈希 学习笔记

    Tips Hash 哈希 散列 Tips 哈希经常与哈希函数指一个意思 本文中哈希与哈希函数不做特殊区分 默认就是一个意思 什么是哈希 在记录的关键字与记录的存储地址之间建立的一种对应关系叫哈希函数 哈希函数就是一种映射 是从关键字到存储地
  • AI笔记(1)

    回归与分类 回归 在数学表示 数值是一个连续性的 要预测的一个值 回归分析是一种预测性的建模技术 它研究的是因变量和自变量之家的关系 这种技术通常用于预测分析 通过使用直线或曲线来拟合数据点 目标是使曲线到数据点的距离差异最小 分类 分类模
  • python重新加载某方法

    20221014 引言 我记得 在很久之前我就弄过这部分内容 当时也是在jupyter notebook中进行实验 然后在这个过程中 需要重新加载某个方法 因为在实验过程中 修改了这个py文件中的函数 整体的思路就是这样 这次也是遇到了这个
  • nginx+ftp实现图片的上传与访问

    1 Nginx的安装 在前面的博客讲到 具体见下面的网址 Nginx的安装 http blog csdn net zbw18297786698 article details 52556293 2 Linux安装ftp组件 2 1 安装vs
  • 随e行创建L2TP 809 错误【一键脚本】

    请下载下面的文件 809 repair zip 右键点击 809 repaire bat 文件 以管理员身份运行 选择 是 根据提示 输入对应字符 yes 以完成对注册表的修改 等待脚本完成对注册表和服务的更改 按任意键退出窗口 809错误
  • LeetCode 热题 HOT 100:链表专题

    LeetCode 热题 HOT 100 https leetcode cn problem list 2cktkvj 文章目录 2 两数相加 19 删除链表的倒数第 N 个结点 21 合并两个有序链表 23 合并 K 个升序链表 141 环
  • windows服务器修改SSL证书友好名称

    系统环境 操作系统 windows 2016 web服务器 IIS 10 修改原因 阿里云上创建的免费证书 友好名称均为alias 在一些集成环境中操作绑定对应站点的SSL证书的时候 可能会因为证书友好名称相同 而找不到对应的SSL证书 操
  • UNIAPP保存base64图片

    制作APP分享二维码 后端生成base64图片 需要前端保存到相册 上代码 saveImgFile base64 base64为base64图片值 const bitmap new plus nativeObj Bitmap test bi
  • Kotlin快速入门

    kotlin kotlin 完全兼容 java 可以和java互相调用 2017年谷歌正式将其作为android开发的第一语言 kotlin编译后产生与java编译后相同的class字节码文件 基础语法 第一个代码 hello world
  • Method的invoke()方法的使用

    public Object invoke Object obj Object args throws IllegalAccessException IllegalArgumentException InvocationTargetExcep
  • idea插件开发入门

    前言 最近想研究一款自动在idea中定位缺陷及发送JIRA的快捷工具 方便提升报自动化脚本的bug的效率 因为idea插件学习是必不可少了 沉淀小结如下 idea插件开发入门 插件用途 工程创建 配置文件 Action实现 开发语法 常用对
  • js三种获取数组的最后一个元素的方法

    一 pop 方法 pop 方法 删除数组最后一个元素 并返回该元素 所以利用这个方法可以取到数组的最后一个 同理shift 可以取到数组的第一个元素 shift 删除数组第一个元素 并返回该元素 let arr 1 2 3 let ele
  • css background image size,html - css background image content size - Stack Overflow

    body margin 0 height 100vh top box text align center height 20 border 1px solid blue background red two area display inl
  • https http 重定向 302 303

    笔者在项目中曾经遇到过这样的情况 就是整个web应用使用的https协议 但是其中某一个表单提交单服务器端 服务器返回了一个重定向的响应 但是此时浏览器直接被拦截 没有做重定向处理 F12打开一看 是因为在https的请求中 混杂着http
  • 解决docker下载安装速度慢的问题

    1 进入etc docker 目录 root iZwz98nzsodcbigjqrrmxmZ cd etc docker 2 在该目录下新建daemon json文件 registry mirrors https docker mirror
  • git 查看远程分支在不同的终端看到的分支不同的解决方法

    多人协作开发的时候 有时候有很多分支 并且在有些分支在a电脑删除之后 在b电脑查看当前分支 居然还有那个被删除掉了的分支 git fetch prune origin 直接执行这行代码 之后再查看一下远程分支 git branch a a
  • SpringBoot在K8s下实现优雅停机

    在K8s中 当我们实现滚动升级之前 务必要实现应用级别的优雅停机 否则滚动升级时 还是会影响到业务 本文介绍SpringBoot应用实现优雅停机 此次教程基于SpringBoot 2 5 0 1 加入必要依赖