Spring Boot 3.2 + CRaC = 王炸!

来源:https://www.cnblogs.com/javastack/archive/2023/12/21/17918295.html
-Advertisement-
Play Games

原文:https://foojay.io/today/springboot-3-2-crac/ 前段時間發佈了 Spring 6.1 和 SpringBoot 3.2,它們都完全支持 CRaC(檢查點協調恢復)。 如果你想瞭解有關 CRaC 的更多信息,請隨時閱讀此處: https://docs.a ...


原文:https://foojay.io/today/springboot-3-2-crac/

前段時間發佈了 Spring 6.1 和 SpringBoot 3.2,它們都完全支持 CRaC(檢查點協調恢復)。

如果你想瞭解有關 CRaC 的更多信息,請隨時閱讀此處:

https://docs.azul.com/core/crac/crac-introduction

CRaC 是一個 OpenJDK 項目,可以“快照”正在運行的 JVM(Java 虛擬機)並將其狀態(包括你的應用程式)存儲到磁碟。然後,在另一個時間點,你可以將 JVM 從保存的檢查點恢復到記憶體中。這樣,我們就可以啟動應用程式、預熱它並創建檢查點。從保存的檢查點恢復到記憶體主要依賴於磁碟I/O,這意味著它非常快(在毫秒範圍內)。

為了測試 SpringBoot 3.2 對 CRaC 的支持,我將使用 SpringBoot Petclinic 演示。

https://github.com/spring-projects/spring-petclinic

對於這個小測試,我在我的 M1 Macbook Pro 上使用 4 核和 4GB RAM 在 Parallels 中運行 Ubuntu 22.04。

先決條件

要在 SpringBoot 3.2 中使用 CRaC,你需要具備三件事:

  • 支持 CRaC 的 JVM
  • org.crac 的依賴項
  • 可以存儲檢查點的文件夾

Spring Boot 基礎就不介紹了,推薦看這個實戰項目:

https://github.com/javastacks/spring-boot-best-practice

JDK

使用的 JDK(Java 開發工具包)是 Azul Zulu 21.0.1 + CRaC,你可以在此處獲取:

https://www.azul.com/downloads/?os=linux&package=jdk-crac#zulu

JDK 適用於 x64 和 aarch64 CPU 架構以及 JDK 17 和 JDK 21。

推薦閱讀:Java 8 腰斬!Java 17 暴漲 430%!!

許可權

可能需要設置許可權才能使用 CRIU,這意味著在運行演示的 Linux 機器上,你需要執行一次以下命令:

sudo chown root:root $JAVA_HOME/lib/criu
sudo chmod u+s $JAVA_HOME/lib/criu

org.crac。

將 petclinic 存儲庫克隆到本地電腦並添加對 org.crac 庫的依賴項。

由於 CRaC 目前僅在 Linux 上可用,因此你找不到支持 MacOS 和 Windows 的 CRaC 的 JDK。這意味著如果你使用的是 Mac 或 Windows 電腦,則無法針對 CRaC API 進行編碼。為瞭解決這個問題,org.crac 庫提供了與支持 CRaC 的 JDK 中可用的相同 API,但你將在“org.crac”命名空間中找到它,而不是使用“jdk.crac”命名空間。

這樣,即使在 MacOS 和 Windows 上,你也可以針對 CRaC API 進行編碼,而不會出現任何問題,並且一旦你在具有啟用 CRaC 的 JDK 的 Linux 系統上運行它,它將使用 CRaC 功能。

你可以在 Maven Central 上找到 org.crac ,因此你可以添加依賴,如下所示:

Gradle:

implementation 'org.crac:crac:1.4.0'

Maven:

<dependency>
  <groupId>org.crac</groupId>
  <artifactId>crac</artifactId>
  <version>1.4.0</version>
</dependency>

為檢查點創建一個文件夾

在我們測試之前,我們需要確保我們有一個可以存儲檢查點的文件夾,例如 /tmp_checkpoint 在項目文件夾中。

不使用 CRaC 啟動

克隆 petclinic 存儲庫後,你需要構建項目(例如 gradlew clean build),然後就可以運行它。

我們唯一感興趣的是應用程式的啟動時間。我對兩個 JDK 版本(17 和 21)進行了測試,首先,只需從 17 切換到 21,petclinic 應用程式的啟動時間就已經縮短了 500 毫秒!

因此,如果可能的話,你應該儘快切換 JDK,以獲得更好的性能。

通過執行以下命令啟動應用程式:

java -jar spring-petclinic-3.2.0.jar

以下是在不使用 CRaC 的情況下啟動應用程式時的結果:

好的,快了大約 500ms,但啟動仍然需要一些時間,所以讓我們看一下 SpringBoot 3.2 中實現的另一種方法。

自動檢查點

Spring 團隊的工程師有一個好主意,通過在應用程式啟動之前自動創建檢查點來縮短 Spring/SpringBoot 框架的啟動時間。

這是文檔中的描述:

“當設置 -Dspring.context.checkpoint=onRefresh JVM 系統屬性時,在 LifecycleProcessor.onRefresh 階段啟動時會自動創建一個檢查點。此階段完成後,所有非延遲初始化的單例都已實例化,並且 InitializingBean# afterPropertiesSet 回調已被調用;但生命周期尚未開始,並且 ContextRefreshedEvent 尚未發佈。”

為了使用自動檢查點,我們按如下方式啟動應用程式:

java -Dspring.context.checkpoint=onRefresh -XX:CRaCCheckpointTo=./tmp_checkpoint -jar spring-petclinic-3.2.0.jar

執行應用程式後,它將創建檢查點,並將檢查點文件存儲在文件夾 ./tmp_checkpoint 中,然後退出應用程式。

現在你可以通過執行以下命令從檢查點恢復應用程式(這意味著再次啟動它):

java -XX:CRaCRestoreFrom=./tmp_checkpoint

以下是從自動檢查點恢復時與啟動時間相關的結果

這非常酷,我們的啟動時間比原始啟動時間快一個數量級,而無需更改代碼。這也意味著檢查點僅包含框架代碼,而不包含你的應用程式代碼,因為它尚未啟動。

手動檢查點

自動檢查點已經是與啟動時間相關的一個很大的改進,但我們甚至可以通過使用手動檢查點來更快。

使用手動檢查點時,你可以決定何時創建檢查點。

為什麼這很重要?

好吧,你可能想在 10 分鐘後或當你的應用程式完全預熱(大多數/所有代碼已編譯和優化)等時創建一個檢查點。

創建手動檢查點的過程與自動檢查點類似,唯一的區別是你從應用程式外部觸發檢查點,而不是讓框架自動創建檢查點。

在開始之前,請確保檢查點的文件夾為空。

首先,你按如下方式啟動你的應用程式:

java -XX:CRaCCheckpointTo=./tmp_checkpoint -jar spring-petclinic-3.2.0.jar

現在,你需要等待應用程式完全啟動,然後再打開第二個 shell 視窗。

在第二個 shell 視窗中,執行以下命令:

jcmd spring-petclinic-3.2.0.jar JDK.checkpoint

現在你應該看到在第一個 shell 視窗中(你啟動 petclinic 應用程式的位置)創建了一個檢查點並且應用程式已關閉。

你可以通過驗證文件夾 ./tmp_checkpoint 是否包含檢查點文件來檢查應用程式是否已設置檢查點。

現在你可以關閉第二個 shell 視窗。

要從此檢查點恢復應用程式,請執行與自動檢查點相同的命令:

java -XX:CRaCRestoreFrom=./tmp_checkpoint

這個手動觸發的檢查點不僅包含框架代碼,還包含應用程式代碼,這意味著我們應該看到更快的啟動,因為應用程式已經由框架載入並啟動。結果如下:

正如你所看到的,我們已經能夠將 petclinic 應用程式的啟動時間減少另一個數量級,降至 75 毫秒!

信息

由於Spring 6.1和SpringBoot 3.2完全支持CRaC,因此我們不需要對代碼進行修改。這裡的完全支持意味著只要你使用 Spring 資源,框架就會負責在檢查點之前關閉資源併在恢復後恢復它們。

如果你使用其他資源,則需要在相關類中實現 CRaC Resource 介面,併在“beforeCheckpoint()”方法中關閉其他資源(例如打開的文件或套接字連接),併在“beforeCheckpoint()”方法中重新打開其他資源。 afterRestore()' 方法。

判決

正如我們所看到的,使用 CRaC 可以顯著減少 SpringBoot 3.2 應用程式的啟動時間。如果你只是想在不接觸代碼的情況下嘗試一下,只需使用 Spring 6.1 / SpringBoot 3.2 中的自動檢查點功能即可將啟動時間減少一個數量級。

為了儘可能縮短啟動時間,你可以手動創建檢查點,這可以將啟動時間縮短兩個數量級。

CRaC 的優點在於它仍然在普通 JVM 上運行,並且在檢查點/恢復後代碼甚至可以進一步優化。

為了獲得這些結果,我需要向 petclinic 項目添加幾行代碼,如果你想重現這些數字,請隨時在我的 GitHub 存儲庫中克隆 petclinic 項目的副本。

推薦一個開源免費的 Spring Boot 實戰項目:

https://github.com/javastacks/spring-boot-best-practice

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先上代碼: 1 def barcode(image): 2 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 3 blur = cv2.GaussianBlur(gray, (5, 5), cv2.RETR_EXTERNAL, cv2.CHAIN_APPR ...
  • 今日內容 1.什麼是編程 2.電腦組成原理 3.電腦操作系統 4.編程語言是什麼 什麼是編程 什麼是編程語言 編程語言是人與電腦交流的介質 什麼是編程? 編程:用編程語言寫出一個個文件,這堆文件會達到一個目的。 編程有什麼用? 讓電腦幫我們幹活 電腦組成原理 CPU中央處理器 1.幫我們控 ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`QStringListModel`字元串映射組件的常用方法及靈活運用。`QStringListModel` 是 ... ...
  • 介紹 作為一名有著大量微服務系統處理經驗的軟體架構師,我經常遇到一個不斷重覆的問題:“我應該使用 RabbitMQ 還是 Kafka?” 出於某種原因,許多開發人員認為這些技術是可以互換的。雖然在某些情況下確實如此,但 RabbitMQ 還是 Kafka 之間存在根本上的差異。 因此,不同的場景需要 ...
  • 在如今這個人工智慧高速發展的時代,每個行業都在被AI技術影響而改變。層出不窮的AI輔助工具,讓我們看到了機器正在取代一部分基礎的日常工作。對於我們開發者而言,當前最炙手可熱的就是GitHub Copilot,市面上最好的開發者輔助工具。GitHub Copilot所提供的代碼補全、建議、解釋等能力非 ...
  • 今天在看文檔的時候,發現支付寶新出了一個 v3 版本的介面調用方式,感覺有點意思,花了點時間研究了下這個版本要怎麼實現自簽名,大家有興趣可以看看。 ...
  • 數據的預處理是數據分析,或者機器學習訓練前的重要步驟。通過數據預處理,可以 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加 ...
  • 最簡單的Hook 剛開始學的時候,用的hook都是最基礎的5位元組hook,也不會使用hook框架,hook流程如下: 構建一個jmp指令跳轉到你的函數(函數需定義為裸函數) 保存被hook地址的至少5位元組機器碼,然後寫入構建的jmp指令 接著在你的代碼里做你想要的操作 以內聯彙編的形式執行被hook ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...