最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot3實現(xiàn)優(yōu)雅停機(jī)的完整流程

 更新時間:2024年10月30日 09:30:35   作者:CoderJia_  
在現(xiàn)代微服務(wù)架構(gòu)中,優(yōu)雅停機(jī)(Graceful Shutdown)是一項重要功能,可以確保服務(wù)在關(guān)閉時處理完所有當(dāng)前請求,避免突然終止連接或丟失數(shù)據(jù),Spring Boot 3 提供了對優(yōu)雅停機(jī)的內(nèi)置支持,本文給大家介紹了SpringBoot3怎樣優(yōu)雅停機(jī),需要的朋友可以參考下

在現(xiàn)代微服務(wù)架構(gòu)中,優(yōu)雅停機(jī)(Graceful Shutdown)是一項重要功能,可以確保服務(wù)在關(guān)閉時處理完所有當(dāng)前請求,避免突然終止連接或丟失數(shù)據(jù)。Spring Boot 3 提供了對優(yōu)雅停機(jī)的內(nèi)置支持,允許在關(guān)閉應(yīng)用程序上下文期間為現(xiàn)有請求設(shè)置一個寬限期,同時防止新請求進(jìn)入。本文將詳細(xì)介紹 Spring Boot 3 的優(yōu)雅停機(jī)機(jī)制,重點分析 Tomcat 和 Reactor Netty 兩種常用的嵌入式 Web 服務(wù)器的優(yōu)雅停機(jī)流程。

1. 什么是優(yōu)雅停機(jī)?

優(yōu)雅停機(jī)的目標(biāo)是在服務(wù)關(guān)閉時:

  • 允許當(dāng)前的處理請求在指定的寬限期內(nèi)完成。
  • 阻止新的請求進(jìn)入。
  • 向外部監(jiān)控或負(fù)載均衡器標(biāo)記服務(wù)為不可用。

這種機(jī)制可以確保服務(wù)在維護(hù)或版本升級時避免數(shù)據(jù)丟失和請求中斷,提供更高的穩(wěn)定性和可用性。

2. Spring Boot 3 優(yōu)雅停機(jī)的配置

在 Spring Boot 3 中,我們可以使用 server.shutdown 配置來開啟優(yōu)雅停機(jī),并指定寬限期。配置項如下:

server:
  shutdown: "graceful" # 開啟優(yōu)雅停機(jī)
spring:
  lifecycle:
    timeout-per-shutdown-phase: "20s"  # 停機(jī)的寬限期,默認(rèn)為 30 秒

此配置項適用于所有四種嵌入式 Web 服務(wù)器:Tomcat、Jetty、Reactor Netty 和 Undertow。

注意:Spring Boot 3 默認(rèn)禁用優(yōu)雅停機(jī),需要將 server.shutdown 設(shè)置為 graceful 以啟用。

3. Tomcat 和 Reactor Netty 的優(yōu)雅停機(jī)機(jī)制

Spring Boot 3 支持在不同的 Web 服務(wù)器上實現(xiàn)優(yōu)雅停機(jī)。以下是 Tomcat 和 Reactor Netty 的具體停機(jī)方式:

3.1 Tomcat 優(yōu)雅停機(jī)

使用Tomcat的優(yōu)雅關(guān)機(jī)需要Tomcat 9.0.33或更高版本,在 Tomcat 上啟用優(yōu)雅停機(jī)后,當(dāng)收到關(guān)閉信號時,它將停止接受新的連接請求,并在網(wǎng)絡(luò)層阻止傳入流量:

  • 阻止新請求:一旦啟動關(guān)閉流程,Tomcat 將在網(wǎng)絡(luò)層拒絕新的請求連接。
  • 完成現(xiàn)有請求:Tomcat 會確保已有請求在指定的寬限期內(nèi)完成。如果請求未完成且寬限期到達(dá),將強制終止。

注意:若某些請求未在寬限期內(nèi)完成,則這些請求將被中斷。

3.2 Reactor Netty 優(yōu)雅停機(jī)

Reactor Netty 是 Spring WebFlux 默認(rèn)使用的非阻塞式 Web 服務(wù)器,適合響應(yīng)式編程。Reactor Netty 的優(yōu)雅停機(jī)實現(xiàn)方式如下:

  • 網(wǎng)絡(luò)層停止:當(dāng)關(guān)閉信號到達(dá),Reactor Netty 將停止接受新請求連接,并釋放相關(guān)資源。
  • 等待寬限期:當(dāng)前所有活動請求在寬限期內(nèi)繼續(xù)處理;在寬限期結(jié)束后,未完成的請求將被強制中止。

Reactor Netty 在優(yōu)雅停機(jī)期間通過停止接受新的連接來實現(xiàn)無縫停機(jī)。其無阻塞模型讓服務(wù)在短時間內(nèi)完成停機(jī)。

Reactor Netty 在優(yōu)雅停機(jī)期間通過停止接受新的連接來實現(xiàn)無縫停機(jī)。其無阻塞模型讓服務(wù)在短時間內(nèi)完成停機(jī)。

4. 優(yōu)雅停機(jī)的流程

在 Tomcat 和 Reactor Netty 上的優(yōu)雅停機(jī)流程類似,大致包含以下幾個步驟:

  1. 標(biāo)記服務(wù)不可用:停止接收新的請求,通常是通過在負(fù)載均衡器中剔除該服務(wù)或在網(wǎng)絡(luò)層阻斷連接來實現(xiàn)。
  2. 設(shè)置寬限期:當(dāng)前請求允許在寬限期內(nèi)繼續(xù)處理。
  3. 關(guān)閉活動連接:寬限期結(jié)束后,所有未完成的請求會被中止,資源釋放。

Spring Boot 3 的 SmartLifecycle 和 ApplicationContext 控制器在關(guān)閉階段對生命周期進(jìn)行管理,保證所有組件按照順序優(yōu)雅停止。

5. 實現(xiàn)優(yōu)雅停機(jī)的完整示例

我們可以創(chuàng)建一個簡單的 Spring Boot 3 應(yīng)用來展示優(yōu)雅停機(jī)配置。

5.1 代碼示例

在 application.yml 中啟用優(yōu)雅停機(jī)并設(shè)置寬限期為 30 秒:

server:
  shutdown: "graceful" # 開啟優(yōu)雅停機(jī)
spring:
  lifecycle:
    timeout-per-shutdown-phase: "30s"  # 停機(jī)的寬限期,默認(rèn)為 30 秒

創(chuàng)建一個簡單的 REST 控制器,模擬一個處理時間較長的請求:

@RestController
@RequestMapping("/api")
public class DemoController {

    @GetMapping("/long-running")
    public String longRunningTask() throws InterruptedException {
        System.out.println("開始執(zhí)行耗時任務(wù)...");
        Thread.sleep(20000); // 模擬耗時任務(wù)
        return "任務(wù)完成";
    }
}

此控制器會等待 20 秒后返回結(jié)果。通過優(yōu)雅停機(jī)機(jī)制,即使應(yīng)用關(guān)閉,也會允許該任務(wù)在 30 秒寬限期內(nèi)完成。

啟動類里添加一段代碼方便打印服務(wù)何時停止運行:

    @PreDestroy
    public void destroy() {
        System.out.println("Application is destroyed");
    }

5.2 IDEA 停止服務(wù)

由于 IDEA 運行的服務(wù)點擊紅點結(jié)束,會直接停止程序,無法模擬停機(jī),Linux 上通過 java -jar 運行的程序沒有這種煩惱,所有此處引入 actuator 的功能,它可以執(zhí)行 shutdown。

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

增加如下 actuator 配置:

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    shutdown:
      enabled: true # 開放停機(jī)端口

調(diào)用 curl -X POST http://localhost:8080/actuator/shutdown,即可停止服務(wù):

5.3 測試優(yōu)雅停機(jī)

啟動應(yīng)用并訪問 http://localhost:8080/api/long-running,然后調(diào)用 http://localhost:8080/actuator/shutdown 停止服務(wù)。

請求在寬限期內(nèi)返回 任務(wù)完成。

修改超期時間為 10s,超過寬限期后,請求被中止。

6. 負(fù)載均衡器中的停機(jī)策略

在實際應(yīng)用中,負(fù)載均衡器(如 Nginx、Kubernetes)也可以在服務(wù)停機(jī)時配合優(yōu)雅停機(jī)流程,通過從負(fù)載均衡池中剔除當(dāng)前實例來防止新流量進(jìn)入。這樣可以確保所有請求被其他實例接管,而當(dāng)前實例只處理已有請求,直至完成后停機(jī)。

7. 優(yōu)雅停機(jī)的注意事項

  • 寬限期配置:設(shè)置合理的寬限期,確保長時間請求可以完成。
  • 負(fù)載均衡器協(xié)作:在生產(chǎn)環(huán)境中建議與負(fù)載均衡器配合,實現(xiàn)完整的優(yōu)雅停機(jī)流程。
  • 避免頻繁停機(jī):頻繁停機(jī)會中斷長時間任務(wù),應(yīng)避免在高負(fù)載時頻繁重啟應(yīng)用。

8. 總結(jié)

在 Spring Boot 3 中,通過簡單配置即可實現(xiàn)優(yōu)雅停機(jī),確保服務(wù)在關(guān)閉時能夠完整處理當(dāng)前請求,減少對用戶體驗的影響。在 Tomcat 和 Reactor Netty 上實現(xiàn)的優(yōu)雅停機(jī)過程相似,都采用了在網(wǎng)絡(luò)層阻止新請求和在應(yīng)用層設(shè)置寬限期的方式。優(yōu)雅停機(jī)機(jī)制在高并發(fā)服務(wù)中顯得尤為重要,是微服務(wù)架構(gòu)中保持穩(wěn)定性和一致性的關(guān)鍵。

以上就是SpringBoot3實現(xiàn)優(yōu)雅停機(jī)的完整流程的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3優(yōu)雅停機(jī)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程

    MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程

    這篇文章主要介紹了MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程,需要的朋友可以參考下
    2020-08-08
  • Spring interceptor攔截器配置及用法解析

    Spring interceptor攔截器配置及用法解析

    這篇文章主要介紹了Spring interceptor攔截器配置及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Java?static靜態(tài)與非靜態(tài)訪問規(guī)則解析及避坑指南

    Java?static靜態(tài)與非靜態(tài)訪問規(guī)則解析及避坑指南

    Java靜態(tài)和非靜態(tài)成員變量初始化過程解析是Java語言中一個非常重要的概念,這篇文章主要介紹了Java?static靜態(tài)與非靜態(tài)訪問規(guī)則解析及避坑指南的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • 詳解Maven profile配置管理及激活profile的幾種方式

    詳解Maven profile配置管理及激活profile的幾種方式

    這篇文章主要介紹了詳解Maven profile配置管理及激活profile的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 基于SpringBoot整合oauth2實現(xiàn)token認(rèn)證

    基于SpringBoot整合oauth2實現(xiàn)token認(rèn)證

    這篇文章主要介紹了基于SpringBoot整合oauth2實現(xiàn)token 認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Spring Boot 入門指南

    Spring Boot 入門指南

    Spring Boot 簡化了Spring 應(yīng)用的初始搭建、開發(fā)過程,開發(fā)人員可使用Spring提供的特定的方式來進(jìn)行配置,不再需要重復(fù)自定義樣板化的配置。本文就將帶你入門Spring Boot
    2021-05-05
  • Springboot下載excel文件中文名亂碼問題及解決

    Springboot下載excel文件中文名亂碼問題及解決

    這篇文章主要介紹了Springboot下載excel文件中文名亂碼問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java泛型模擬scala實現(xiàn)自定義ArrayList方式

    Java泛型模擬scala實現(xiàn)自定義ArrayList方式

    這篇文章主要介紹了Java泛型模擬scala實現(xiàn)自定義ArrayList方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot結(jié)合JWT實現(xiàn)用戶登錄、注冊、鑒權(quán)

    SpringBoot結(jié)合JWT實現(xiàn)用戶登錄、注冊、鑒權(quán)

    用戶登錄、注冊及鑒權(quán)是我們基本所有系統(tǒng)必備的,也是很核心重要的一塊,本文主要介紹了SpringBoot結(jié)合JWT實現(xiàn)用戶登錄、注冊、鑒權(quán),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • Java8?Stream教程之collect()的技巧

    Java8?Stream教程之collect()的技巧

    Java8引入了全新的Stream?API,這里的Stream和I/O流不同,它更像具有Iterable的集合類,但行為和集合類又有所不同,下面這篇文章主要給大家介紹了關(guān)于Java8?Stream教程之collect()的技巧,需要的朋友可以參考下
    2022-09-09

最新評論

石棉县| 红桥区| 郴州市| 凌源市| 盱眙县| 安国市| 偃师市| 万安县| 惠州市| 潞城市| 师宗县| 乌兰察布市| 高陵县| 和田市| 定西市| 和龙市| 和林格尔县| 巴南区| 会东县| 大宁县| 新丰县| 澄城县| 晴隆县| 漠河县| 剑川县| 兴安盟| 浦城县| 澎湖县| 芦溪县| 新宁县| 梁平县| 商河县| 邵阳市| 临湘市| 花垣县| 台山市| 华容县| 洪雅县| 曲阳县| 河北省| 报价|