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

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

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

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

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

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

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

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

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

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

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

此配置項(xiàng)適用于所有四種嵌入式 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ù)器上實(shí)現(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)閉信號(hào)時(shí),它將停止接受新的連接請(qǐng)求,并在網(wǎng)絡(luò)層阻止傳入流量:

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

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

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

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

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

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

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

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

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

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

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

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

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

5.1 代碼示例

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

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

創(chuàng)建一個(gè)簡(jiǎn)單的 REST 控制器,模擬一個(gè)處理時(shí)間較長(zhǎng)的請(qǐng)求:

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

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

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

啟動(dòng)類(lèi)里添加一段代碼方便打印服務(wù)何時(shí)停止運(yùn)行:

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

5.2 IDEA 停止服務(wù)

由于 IDEA 運(yùn)行的服務(wù)點(diǎn)擊紅點(diǎn)結(jié)束,會(huì)直接停止程序,無(wú)法模擬停機(jī),Linux 上通過(guò) java -jar 運(yùn)行的程序沒(méi)有這種煩惱,所有此處引入 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 # 開(kāi)放停機(jī)端口

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

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

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

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

修改超期時(shí)間為 10s,超過(guò)寬限期后,請(qǐng)求被中止。

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

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

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

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

8. 總結(jié)

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

以上就是SpringBoot3實(shí)現(xiàn)優(yōu)雅停機(jī)的完整流程的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3優(yōu)雅停機(jī)的資料請(qǐng)關(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攔截器配置及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java?static靜態(tài)與非靜態(tài)訪問(wèn)規(guī)則解析及避坑指南

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

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

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

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

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

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

    Spring Boot 入門(mén)指南

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

    Springboot下載excel文件中文名亂碼問(wèn)題及解決

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

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

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

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

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

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

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

最新評(píng)論

水城县| 文登市| 贵南县| 天祝| 邹城市| 叶城县| 甘洛县| 景德镇市| 乐都县| 逊克县| 阜阳市| 临邑县| 古田县| 绥中县| 西乡县| 滕州市| 尼勒克县| 淮南市| 蕲春县| 万载县| 武邑县| 蕉岭县| 兴城市| 武陟县| 琼海市| 乌苏市| 两当县| 乐东| 三门县| 马山县| 绥芬河市| 永定县| 永寿县| 和硕县| 罗江县| 遂川县| 高邮市| 突泉县| 根河市| 招远市| 惠安县|