IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 深入聊聊Spring Boot 优雅停机 -> 正文阅读

[Java知识库]深入聊聊Spring Boot 优雅停机

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

最近一直在研究微服务中的优雅停机,在使用feign远程rpc调用的时候总会遇到上下线调用到已经重启的服务,所以就想研究一下优雅停机,当然优雅停机不单单是在Java应用层面上,由于涉及知识面比较广,我们就暂时先只研究Spring Boot 中的优雅停机,后续再研究其他的。

Spring Boot version

  • 2.6.6

容器销毁

我们都知道在我们注册的单例Bean在实现了DisposableBean接口的时候容器在关闭的时候都会执行destroy方法

@Component
public class TestDisposableBean implements DisposableBean {
    
    @Override
    public void destroy() throws Exception {
        System.out.println("测试优雅停机, Bean 正在销毁 ...");
    }
}

应用停止方式

但是需要注意的时候一般应用的停止有两种方式

  1. kill -9 pid 直接强杀应用程序
  2. kill -15

两者的区别也很明显, kill -9 pid 是操作系统从内核态直接强行杀死某个进程,该进程没有任何的反应机会,非常简单粗暴
kill -15 则可以理解为操作系统发送一个关闭信号(SIGTERM)让应用程序收到该信号自己去决定。应用程序基本可以选择如下几种方式

  1. 立即停止程序
  2. 释放相关资源后停止程序
  3. 忽略该信号,继续执行程序

模拟kill -9kill -15

上面简单说了一下两者的区别,还是比较抽象,由于打包方式使用命令去模拟比较麻烦,所以我们直接基于idea来模拟一下。

我们首先定义一个简单的单例bean销毁后的操作

@Component
public class TestDisposableBean implements DisposableBean {
    
    @Override
    public void destroy() throws Exception {
        System.out.println("测试优雅停机, Bean 正在销毁 ...");
    }
}

和上面代码一样
接着我们直接启动一个最简单的spring boot 项目
在这里插入图片描述
这里我们直接按这个销毁键,这里就相当于是给应用程序执行了kill -15
在这里插入图片描述
可以看到销毁前执行了我们定义的方法。如果我们连续快速按两下销毁键,就模拟了kill -9,我们会发现应用程序什么也没有输出

Java应用如何处理kill -15

实际上Java应用在接受到kill -15命令后都会去执行Jdk提供的一个钩子线程方法,大致使用方式如下

public class ShutdownHookTest {

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("hook execute...");
        }));
        System.out.println("app running");
        while (true) {
        }
    }
}

我们可以看到我们在执行kill -15后会执行钩子函数里面的方法
在这里插入图片描述

既然知道了Java是通过钩子函数去处理kill -15命令的,那么我们不难想象spring 这个销毁Bean的动作肯定也是这么做的。那么具体的实现方式是如何呢?我们打开源码就可以看到SpringApplication中的registerShutdownHook默认就为true

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到这里就注册了一个构造函数,而钩子函数本身的SpringApplicationShutdownHook中的run方法

在这里插入图片描述
在这里插入图片描述
可以看到实际的销毁bean操作还是在close方法中封装的
在这里插入图片描述
这里的close方法 一共做了5件事:

  1. 发布Spring应用上下文的关闭事件,让监听器们有机会在应用关闭之前做出一些响应
  2. 执行lifecycleProcessor的关闭方法,让Lifecycle们有机会在应用关闭之前做出一些响应
  3. 销毁IOC容器里所有单例Bean
  4. 关闭BeanFactory
  5. 执行勾子函数,子类实现后做各自的资源清理,比如ServletWebServerApplicationContext会实现该勾子函数关闭内嵌的WebServer(Tomcat)

Spring Boot 2.3后优雅停机的完善

我们知道在spring boot 2.3后的版本对优雅停机做了完善,如果我们想要开启也非常简单,只需要在application.yaml配置文件中开启优雅停机即可

server:
  port: 6080
  shutdown: graceful #开启优雅停机
spring:
  lifecycle:
    timeout-per-shutdown-phase: 20s #设置缓冲时间 默认30s

可以看到这里设置了一个默认缓冲时间,因为如果你在销毁操作中执行了什么慢方法就导致应用销毁不掉,就还是需要强行杀死应用

GracefulShutdown 简单源码分析

如果我们debug就会发现GracefulShutdown优雅停机的核心方法是在DefaultLifecycleProcessor中实现的
在这里插入图片描述
可以在这里看到这里利用了CountDownLatch来逐个关闭lifecycleBean,最多等待时间就是我们设置的timeout

Web容器的优雅停机

在这里插入图片描述
web容器的优雅停机主要是通过WebServerStartStopLifecycle实现SmartLifecycle接口,而不同web容器统一由WebServerManager去屏蔽底层细节

在这里插入图片描述
WebServerManager中拥有接口WebServer

WebServer中则定义了容器的启动停止的公用方法
在这里插入图片描述
实现WebServer的接口就有我们常用的容器

在这里插入图片描述

总结

总的来说Spring Boot中的优雅停机核心还是使用 kill -15来销毁应用加JVM的钩子函数来处理的。具体我们想要自定义一些应用销毁后的优雅停机处理也可以基于类似方式去实现

参考

博客

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:02:20  更:2022-06-01 15:04:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:43:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码