服务优雅停机SpringBoot

发布时间:2024年01月12日

什么是优雅停机
? 优雅停机指的是Java项目在停机时需要做好断后工作。如果直接使用kill -9 方式暴力的将项目停掉,可能会导致正常处理的请求、定时任务、RMI、注销注册中心等出现数据不一致问题。

? 如何解决优雅停机呢?大致需要解决如下问题:

首先要确保不会再有新的请求进来,所以需要设置一个流量挡板
保证正常处理已进来的请求线程,可以通过计数方式记录项目中的请求数量
如果涉及到注册中心,则需要在第一步结束后注销注册中心
停止项目中的定时任务
停止线程池
关闭其他需要关闭资源等等等

Spring Boot提供了优雅停机的功能,这意味着当你想要停止应用程序时,Spring Boot可以确保当前正在处理的请求完成后再关闭应用程序。这个特性在Spring Boot 2.3及更高版本中得到了增强。

要启用优雅停机,你需要做以下几步:

  1. 引入spring-boot-starter-actuator依赖:spring-boot-starter-actuator模块提供了很多生产级的特性,包括监控应用程序、收集应用的度量、理解应用的运行状态等。

  2. 配置优雅停机:在application.properties或application.yml中配置优雅停机的相关属性。

  3. 使用Actuator的/shutdown端点:如果你已经引入了spring-boot-starter-actuator,你可以通过调用Actuator的/shutdown端点来触发优雅停机。

下面是如何实现这些步骤的详细说明:
1. 引入spring-boot-starter-actuator依赖
在你的pom.xml文件中添加以下依赖:

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

2. 配置优雅停机
在application.properties中添加以下配置:

# 开启优雅停机功能
spring.lifecycle.timeout-per-shutdown-phase=30s

或者在application.yml中添加:

spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s

这里的timeout-per-shutdown-phase是指在实际关闭应用程序之前,Spring Boot等待正在运行的请求完成的时间。
3. 使用Actuator的/shutdown端点
首先,确保你已经暴露了shutdown端点:

management.endpoint.shutdown.enabled=true

或者在application.yml中:

management:
  endpoints:
    web:
      exposure:
        include: shutdown
  endpoint:
    shutdown:
      enabled: true

然后,你可以通过发送POST请求到/actuator/shutdown来触发优雅停机:

curl -X POST http://localhost:8080/actuator/shutdown

请注意,出于安全考虑,默认情况下shutdown端点是不暴露的。在生产环境中,你应该小心使用这个功能,并确保它只能被信任的用户访问。
以上步骤将配置Spring Boot应用程序以支持优雅停机,并通过Actuator的/shutdown端点来触发停机

在Spring Boot中,优雅停机的实现依赖于Spring Framework的ApplicationContext和Lifecycle接口。
以下是从源码层面分析调用优雅停机接口的关键步骤:

  1. Actuator Shutdown Endpoint:
  • ShutdownEndpoint类是Actuator提供的用于停机的端点。
  • 当发送POST请求到/actuator/shutdown时,会调用ShutdownEndpoint的shutdown()方法。
  1. 发布ContextClosedEvent:
  • shutdown()方法会发布一个ContextClosedEvent。
  • 这个事件会被Spring容器中的各种组件监听到,它们会开始执行关闭逻辑。
  1. 停止Lifecycle Beans:
  • Spring容器会调用实现了Lifecycle接口的beans的stop()方法。
  • 这包括SmartLifecycle beans,它们有一个getPhase()方法来指定停止顺序。
  1. Web服务器优雅停机:
  • 对于内嵌的Web服务器(如Tomcat, Jetty, Undertow),Spring Boot 2.3+提供了优雅停机支持。
  • Web服务器的连接器会停止接受新的请求,同时等待活动请求完成,直到配置的超时时间。
  1. 等待活动任务完成:
  • 如果你有异步任务或者调度任务,Spring Boot会等待这些任务完成,或者达到配置的超时时间。
  1. 关闭Spring容器:
  • 最后,ApplicationContext会被关闭,所有的单例beans会被销毁。

在源码中,这些步骤主要涉及以下几个关键类和接口:

  • ShutdownEndpoint: Actuator端点类,用于处理停机请求。
  • ContextClosedEvent: 当应用上下文关闭时发布的事件。
  • Lifecycle: 一个接口,定义了start()和stop()方法,用于管理组件的生命周期。
  • SmartLifecycle: Lifecycle的扩展,添加了对启动和关闭阶段的支持。
  • WebServer: 抽象了内嵌Web服务器的接口,提供了停止服务器的方法。
    优雅停机的实现细节可能因Spring Boot的不同版本而有所变化,但上述步骤概括了其核心逻辑。
文章来源:https://blog.csdn.net/weixin_43761434/article/details/135558181
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。