教你Spring Boot 2.3 优雅关闭的新姿势

createh54个月前 (02-01)技术教程27


猿灯塔   希望对各位有帮助!

另外!文末有令你们心动的白嫖惊喜哦!

想要的朋友转发文章并私聊我哦!

Spring Boot 2.3有个新特性叫:Graceful shutdown(优雅关闭)

下面是官方的说明:

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. When a grace period is configured, upon shutdown, the web server will no longer permit new requests and will wait for up to the grace period for active requests to complete.

优雅关闭支持所有 4 个嵌入式 Web 服务器:Jetty, Reactor Netty, Tomcat, Undertow,以及响应式的和基于 Servlet 的 Web 应用程序。

当配置了一个优雅关闭的缓冲时间,直到应用程序关闭时,Web 服务器都不再允许接收新的请求,缓冲时间是为了等待目前所有进行中的活动请求处理完成。

需要说明的是,Tomcat、Jetty 在网络层会立即停止接收请求,而 Undertow 可以继续接收请求,但会立即返回 503 服务不可用错误。

怎么开启优雅关闭?

下面是 Yaml 文件的配置示例:

# 开启优雅关闭
server: 
  shutdown: graceful

# 关闭的缓冲时间  
spring: 
  lifecycle: 
    timeout-per-shutdown-phase: 10s

源码分析

上面介绍了优雅关闭参数的配置方式,下面我们通过源码来看下默认的配置是什么。

先看第一个参数配置接收类:

org.springframework.boot.autoconfigure.web.ServerProperties

public enum Shutdown {
    GRACEFUL,
    IMMEDIATE;

    private Shutdown() {
    }
}

如源码所示,默认为:IMMEDIATE,所以优雅关闭是大家根据业务需要手动开启的。

再来看第二个参数配置接收类:

org.springframework.boot.autoconfigure.context.LifecycleProperties

如源码所示,默认缓冲时间为:30 秒。

再看下优雅关闭的源码:

根据 Graceful 可以找到几个相关的类,我们进入 Tomcat 的:

org.springframework.boot.web.embedded.tomcat.GracefulShutdown

public enum GracefulShutdownResult {

    /**
     * Requests remained active at the end of the grace period.
     */
    REQUESTS_ACTIVE,

    /**
     * The server was idle with no active requests at the end of the grace period.
     */
    IDLE,

    /**
     * The server was shutdown immediately, ignoring any active requests.
     */
    IMMEDIATE;

}

REQUESTS_ACTIVE 说的是在缓冲期结束前连接保持活动状态,也就是虽然官方默认给你 30 秒的缓存时间来处理囤积请求,如果 30 秒之后还没处理完成,最后 Spring Boot 也会强制关闭应用。

所以需要注意的是,优雅关闭时一定要考虑当时的业务处理量,所设置的缓冲时间是否能处理完正在处理中的业务。

另外,Spring Boot 优雅关闭需要配合 Actuator 的 /shutdown 端点来进行触发,具体参考这篇文章:Spring Boot 优雅停止服务的几种方法。

感谢大家的观看,如果可以的话,

我是否有荣幸能得到你们的点赞与转发呢!

另外!小编这里有免费的JAVA干货资料以及面试资料

有需要的朋友私聊我噢




相关文章

java小知识-ShutdownHook(优雅关闭)

作者:京东物流 崔冬冬一、先提出一个问题我们如果在JVM退出的时候做一些事情,比如关闭远程链接,怎么实现呢?二、ShutdownHook简介java里有个方法Runtime.getRuntime#ad...

又一时代结束 甲骨文宣布将弃用Java插件

Java 插件一直被认为是系统不稳定因素的温床,它的时代即将过去。甲骨文公司宣布 Java 插件即将退出历史舞台。Java 插件不会立即死去。它将在下一个版本的 Java 开发工具包中被弃用,然后随着...

大白话详解Spring Cloud服务降级与熔断

1. Hystrix断路器概述1.1 分布式系统面临的问题复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。这就造成有可能会发生 服务雪崩 。那么什么是服务雪崩呢...

记一次TOMCAT开启一段时间自动关闭

最近同事开发的一个项目部署上线后用过几天就TOMCAT自动关闭,并且该项目没有开通对外访问。通过阿里云监控台查看,从升级后系统内存占用上升趋势,CPU等信息没有太大变化。打印服务器日志后发现全是线程...