<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:SpringBoot如何優(yōu)雅停機?

          共 5469字,需瀏覽 11分鐘

           ·

          2024-04-11 15:50

          本文內容已收錄至我的面試網站:www.javacn.site

          優(yōu)雅停機(Graceful Shutdown)是指在服務器需要關閉或重啟時,能夠先處理完當前正在進行的請求,然后再停止服務的操作。

          優(yōu)雅停機的實現步驟主要分為以下幾步:

          1. 停止接收新的請求:首先,系統(tǒng)會停止接受新的請求,這樣就不會有新的任務被添加到任務隊列中。
          2. 處理當前請求:系統(tǒng)會繼續(xù)處理當前已經在處理中的請求,確保這些請求能夠正常完成。這通常涉及到等待正在執(zhí)行的任務完成,如處理HTTP請求、數據庫操作等。
          3. 釋放資源:在請求處理完成后,系統(tǒng)會釋放所有已分配的資源,如關閉數據庫連接、斷開網絡連接等。
          4. 關閉服務:最后,當所有請求都處理完畢且資源都已釋放后,系統(tǒng)會安全地關閉服務。

          0.SpringBoot如何實現優(yōu)雅停機?

          優(yōu)雅停機的實現步驟分為以下兩步:

          1. 使用合理的 kill 命令,給 Spring Boot 項目發(fā)送優(yōu)雅停機指令。
          2. 開啟 Spring Boot 優(yōu)雅停機/自定義 Spring Boot 優(yōu)雅停機的實現。

          1.合理殺死進程

          在 Linux 中 kill 殺死進程的常用命令有以下這些:

          1. kill -2 pid:向指定 pid 發(fā)送 SIGINT 中斷信號,等同于 ctrl+c。也就說,不僅當前進程會收到該信號,而且它的子進程也會收到終止的命令。
          2. kill -9 pid:向指定 pid 發(fā)送 SIGKILL 立即終止信號。程序不能捕獲該信號,最粗暴最快速結束程序的方法。
          3. kill -15 pid:向指定 pid 發(fā)送 SIGTERM 終止信號。信號會被當前進程接收到,但它的子進程不會收到,如果當前進程被 kill 掉,它的的子進程的父進程將變成 init 進程 (init 進程是那個 pid 為 1 的進程)。
          4. kill pid:等同于 kill 15 pid。

          因此,在以上命令中,我們不能使用“kill -9”來殺死進程,使用“kill”殺死進程即可

          2.設置SpringBoot優(yōu)雅停機

          在 Spring Boot 2.3.0 之后,可以通過配置設置開啟 Spring Boot 的優(yōu)雅停機功能,如下所示:

          # 開啟優(yōu)雅停機,默認值:immediate 為立即關閉
          server.shutdown=graceful

          # 設置緩沖期,最大等待時間,默認:30秒
          spring.lifecycle.timeout-per-shutdown-phase=60s

          此時,應用在關閉時,Web 服務器將不再接受新請求,并等待正在進行的請求完成的緩沖時間。

          然而,如果是 Spring Boot 2.3.0 之前,就需要自行擴展(線程池)來實現優(yōu)雅停機了。它的核心實現實現是在系統(tǒng)關閉時會調用 ShutdownHook,然后在 ShutdownHook 中阻塞 Web 容器的線程池,直到所有請求都處理完畢再關閉程序,這樣就實現自定義優(yōu)雅線下了。

          但是,不同的 Web 容器(Tomcat、Jetty、Undertow)有不同的自定義優(yōu)雅停機的方法,以 Tomcat 為例,它的自定義優(yōu)雅停機實現如下。

          2.1 Tomcat 容器關閉代碼

          public class TomcatGracefulShutdown implements TomcatConnectorCustomizerApplicationListener<ContextClosedEvent{
              private volatile Connector connector;

              public void customize(Connector connector) {
                  this.connector = connector;
              }

              public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
                  this.connector.pause();
                  Executor executor = this.connector.getProtocolHandler().getExecutor();
                  if (executor instanceof ThreadPoolExecutor) {
                      try {
                          log.info("Start to shutdown tomcat thread pool");
                          ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
                          threadPoolExecutor.shutdown();
                          if (!threadPoolExecutor.awaitTermination(20, TimeUnit.SECONDS)) {
                              log.warn("Tomcat thread pool did not shutdown gracefully within 20 seconds. ");
                          }
                      } catch (InterruptedException e) {
                          log.warn("Fail to shut down tomcat thread pool ", e);
                      }
                  }
              }
          }

          2.2 設置 Tomcat 自動裝配

          @Configuration
          @ConditionalOnClass({Servlet.classTomcat.class})
          public static class TomcatConfiguration 
          {
              @Bean
              public TomcatGracefulShutdown tomcatGracefulShutdown() {
                  return new TomcatGracefulShutdown();
              }

              @Bean
              public EmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory(TomcatGracefulShutdown gracefulShutdown) {
                  TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
                  tomcatFactory.addConnectorCustomizers(gracefulShutdown);
                  return tomcatFactory;
              }
          }

          PS:Jetty、Undertow 優(yōu)雅停機的實現方式,參考《面試訓練營》,vx:gg_stone

          課后思考

          Spring Boot Actuator 能實現優(yōu)雅停機嗎?為什么?如何實現分布式系統(tǒng)的優(yōu)雅停機?


          特殊說明

          以上內容來自我的《Java 面試突擊訓練營》,這門課程是有著 14 年工作經驗(前 360 開發(fā)工程師),9 年面試官經驗的我,花費 4 年時間打磨完成的一門視頻面試課

          整個課程從 Java 基礎到微服務 Spring Cloud、從實際開發(fā)問題到場景題應有盡有,包含模塊如下:

          訓練營系統(tǒng)的帶領大家把 Java 常見的面試題過一遍,遇到一個問題,把這個問題相關的內容都給大家講明白,并且視頻支持永久觀看和一直更新。并且面試訓練營還提供 10 大就業(yè)服務。

          上完訓練營的課程之后,基本可以應對目前市面上絕大部分公司的面試了,想要了解詳情,加我微信:GG_Stone【備注:訓練營】

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  韩国一区二 | 苍井空一级婬片A片在哪看 | 亚洲中文字幕在线免费视频 | 大色鬼在线天堂精品 | 人人超碰在线 |