高效部署

解壓縮可執行 JAR 檔

您可以使用可執行 JAR 檔來執行應用程式,但從巢狀 JAR 檔載入類別會產生一些額外成本。根據 JAR 檔的大小,從已解壓縮的結構執行應用程式會更快,並且在生產環境中建議這樣做。某些 PaaS 實作也可能會選擇在執行之前解壓縮檔案。例如,Cloud Foundry 就是以這種方式運作的。

Spring Boot 支援使用不同的佈局將您的應用程式解壓縮到目錄中。預設佈局效率最高,而且支援 CDS

在此佈局中,程式庫會解壓縮到 lib/ 資料夾,而應用程式 JAR 檔包含應用程式類別和一個參考 lib/ 資料夾中程式庫的 Manifest 檔案。

$ java -Djarmode=tools -jar my-app.jar extract
$ java -jar my-app/my-app.jar

啟動後,您應該不會看到任何差異。

執行 java -Djarmode=tools -jar my-app.jar help extract 以查看所有可能的選項。

使用 CDS 優化啟動時間

類別資料共享 (CDS) 是一個 JVM 功能,可以協助減少 Java 應用程式的啟動時間和記憶體佔用。

要使用它,您應該先以解壓縮的形式執行應用程式的訓練運行

$ java -Djarmode=tools -jar my-app.jar extract --destination application
$ cd application
$ java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar my-app.jar

這會建立一個 application.jsa 檔案,只要應用程式沒有更新,就可以重複使用。

要使用快取,您需要在啟動應用程式時新增一個額外的參數

$ java -XX:SharedArchiveFile=application.jsa -jar my-app.jar
有關 CDS 的更多詳細資訊,請參閱 Spring Framework 參考文件

在 JVM 中使用 Ahead-of-Time (AOT) 處理

使用 AOT 生成的初始化程式碼來執行應用程式,對啟動時間有益。首先,您需要確保您正在建置的 JAR 檔包含 AOT 生成的程式碼。

CDS 和 AOT 可以結合使用,以進一步縮短啟動時間。

對於 Maven,這表示您應該使用 -Pnative 進行建置,以啟用 native 設定檔

$ mvn -Pnative package

對於 Gradle,您需要確保您的建置包含 org.springframework.boot.aot 外掛程式。

建置 JAR 檔後,請在將系統屬性 spring.aot.enabled 設為 true 的情況下執行它。例如:

$ java -Dspring.aot.enabled=true -jar myapplication.jar

........ Starting AOT-processed MyApplication ...

請注意,使用 Ahead-of-Time 編譯有一些缺點。它意味著以下限制:

  • 類別路徑在建置時即固定且完整定義。

  • 應用程式中定義的 Bean 無法在執行期間更改,這表示:

    • Spring 的 @Profile 標註和特定設定檔的配置 有一些限制

    • 不支援在建立 Bean 時會變更的屬性(例如 @ConditionalOnProperty.enable 屬性)。

要深入瞭解 Ahead-of-Time 編譯,請參閱 理解 Spring Ahead-of-Time 編譯章節

使用 JVM 進行檢查點和還原

協調式檢查點還原 (CRaC) 是一個 OpenJDK 專案,它定義了一個新的 Java API,允許您在 HotSpot JVM 上對應用程式進行檢查點和還原。它基於 CRIU,一個在 Linux 上實現檢查點/還原功能的專案。

原理如下:您幾乎像往常一樣啟動應用程式,但使用啟用 CRaC 的 JDK 版本,例如 BellSoft Liberica JDK with CRaCAzul Zulu JDK with CRaC。然後在某個時間點,可能是在某些工作負載預熱 JVM 並執行所有常用程式碼路徑之後,您可以使用 API 呼叫、jcmd 命令、HTTP 端點或其他機制觸發檢查點。

正在執行的 JVM 的記憶體表示,包括其預熱狀態,會被序列化到磁碟,以便在稍後時間點快速還原,甚至可能在具有相似作業系統和 CPU 架構的其他機器上。還原的程序保留 HotSpot JVM 的所有功能,包括在執行期間進一步的 JIT 優化。

基於 Spring Framework 提供的基礎,Spring Boot 提供了對應用程式檢查點和還原的支援,並 在有限的範圍內 自動管理資源(例如通訊端、檔案和執行緒池)的生命週期。預期其他依賴項以及可能處理此類資源的應用程式程式碼需要額外的生命週期管理。

您可以在 Spring Framework JVM 檢查點還原支援文件中 找到更多關於兩種支援模式(「執行中應用程式的按需檢查點/還原」和「啟動時的自動檢查點/還原」)的詳細資訊、如何啟用檢查點和還原支援以及一些指南。