首頁 >Java >java教程 >使用 Quarkus 和 GraalVM 本機映像增強 Java 微服務

使用 Quarkus 和 GraalVM 本機映像增強 Java 微服務

王林
王林原創
2024-08-30 06:03:02368瀏覽

在現代軟體開發的動態格局中,微服務已成為最受歡迎的架構方法。雖然這種方法提供了許多優點,但它並非沒有挑戰。傳統的基於 JVM 的服務經常會出現記憶體佔用過大、啟動時間過長以及 CPU 使用率過高等問題。這些挑戰不僅會影響技術方面,還會產生財務影響,從而顯著影響運行和維護軟體解決方案的整體成本。

什麼是 GraalVM 本機映像?

GraalVM Native Image 是 GraalVM 的關鍵特性,它是一個高效能運行時,提供對各種程式語言和執行模式的支援。具體來說,GraalVM Native Image 允許您提前將 Java 應用程式編譯為獨立的本機可執行文件,從而在運行時無需使用 Java 虛擬機 (JVM)。與傳統的 JVM 相比,這種創新方法產生的可執行檔表現出幾乎瞬時的啟動時間並顯著減少了記憶體消耗。這些本機可執行檔案經過精心製作,僅包含應用程式功能所必需的基本類別、方法和依賴程式庫。除了技術實力之外,GraalVM Native Image 也成為具有深遠影響的策略解決方案。它不僅克服了技術挑戰,還引入了令人信服的財務案例。透過促進高效、安全且可即時擴展的雲端原生 Java 應用程式的開發,GraalVM 在優化資源利用率和提高成本效益方面發揮了重要作用。從本質上講,它在提高當代動態環境中軟體解決方案的效能和財務效率方面發揮關鍵作用。

技術挑戰和財務影響

1。大記憶體佔用

技術影響
由於類別載入和載入類別的元數據,傳統的基於 JVM 的服務通常會產生大量記憶體開銷。


財務案例
高記憶體消耗意味著基礎設施成本增加。 GraalVM 消除了載入類別的元資料和其他最佳化,可以更有效地利用資源,從而節省潛在的成本。

2。延長開始時間

技術影響
微服務中的冷啟動可能會導致回應時間更長,影響使用者體驗並可能導致服務降級。


財務案例
延長啟動時間不僅會影響用戶滿意度,還會導致更高的營運成本。 GraalVM 的最佳化,例如消除類別載入開銷和在建置過程中預先產生映像堆,大大減少了啟動時間,有可能最大限度地減少營運費用。

3。 CPU 使用率高

技術影響
傳統 JVM 通常會在啟動期間消耗 CPU 週期來進行分析和即時 (JIT) 編譯。


財務案例
CPU 使用率過高會導致雲端基礎設施成本增加。 GraalVM 避免了分析和 JIT 開銷,直接有助於減少 CPU 消耗,從而轉化為雲端使用中潛在的成本節省。

解決冷啟動問題

微服務,尤其是在無伺服器或容器化環境中,經常面臨冷啟動問題,影響回應時間和使用者體驗。 GraalVM 透過實施多項最佳化來應對這項挑戰:

1。沒有類別載入開銷

傳統的Java應用程式依賴執行階段的類別載入來動態載入和連結類別。此過程會帶來開銷,特別是在啟動階段。 GraalVM 透過稱為靜態或提前 (AOT) 編譯的過程最大限度地減少了這種開銷。這涉及預先載入、連結和部分啟動應用程式所需的所有類別。因此,在應用程式啟動期間不需要運行時類別載入。

2。消除解釋代碼

傳統的 Java 虛擬機器在應用即時 (JIT) 編譯之前就依賴解釋執行模式。這可能會導致啟動延遲和 CPU 使用率增加。本機可執行檔不包含解釋程式碼,進一步有助於加快啟動時間。

3。沒有分析和 JIT 開銷

GraalVM 不需要啟動即時 (JIT) 編譯器,減少啟動期間的 CPU 使用率。

4。建置時產生影像堆

GraalVM 的本機映像公用程式允許在建置過程中執行特定類別的初始化過程。這會產生包含預初始化部分的映像堆,從而加快應用程式的啟動速度。

Oracle GraalVM 的本機映像實用程式已證明啟動時間比傳統的基於 JVM 的應用程式快了近 100 倍。下圖說明了運行時記憶體需求的大幅減少,展示了 GraalVM 與 HotSpot 相比的效率(圖 1)。

Turbocharge Java Microservices with Quarkus and GraalVM Native Image

圖 1 – 本機執行檔幾乎立即啟動 (oracle.com)


實現更精簡的記憶體佔用

GraalVM 透過以下最佳化有助於降低記憶體佔用:

1。載入的類別沒有元資料

GraalVM 避免在非堆疊記憶體中儲存動態載入類別的元資料。在建置過程中,會預先載入和連結必要的類信息,從而最大限度地減少運行時對額外元資料的需求。

2。沒有分析數據或 JIT 最佳化

由於字節碼已經在本機程式碼中,GraalVM 不需要收集分析資料以進行 JIT 最佳化,從而減少了記憶體開銷。

3。隔離技術

GraalVM 引入了 Isolates,一種將堆劃分為更小、獨立「堆」的技術,從而提高效率,特別是在請求處理場景中。

通常,與在 JVM 上運行相比,它消耗的記憶體最多減少 5 倍(圖 2

Turbocharge Java Microservices with Quarkus and GraalVM Native Image

圖 2 – 與 Go 或 Java HotSpot(oracle.com) 相比的本機可執行檔記憶體


總之,GraalVM 的本機映像公用程式為微服務帶來的挑戰提供了變革性的解決方案,解決了啟動時間、記憶體佔用和 CPU 使用問題。透過採用 GraalVM,開發者可以創建雲端原生 Java 應用程序,這些應用程式不僅高效、安全,而且還提供卓越的使用者體驗。

帶有 Quarkus 的原生 Java

要將 Quarkus 服務編譯為本機映像,可以使用多種方法。雖然本文不會深入探討 Quarkus 原生建置流程,但它確實提供了基本步驟的概述。

在繼續使用任何方法建立本機映像之前,在 pom.xml 檔案中設定正確的本機設定檔至關重要。新增以下設定檔:

<profiles>
  <profile>
    <id>native</id>
    <properties>
      <quarkus.package.type>native</quarkus.package.type>
    </properties>
  </profile>
</profiles>

使用已安裝的 GraalVM 生成本機執行檔

使用以下指令檢查您的 GraalVM 版本:

./gu info native-image

此指令將顯示已安裝的 GraalVM 版本:

Downloading: Component catalog from www.graalvm.org
Filename : https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.0/native-image-installable-svm-java19-linux-amd64-22.3.0.jar
Name     : Native Image
ID       : native-image
Version  : 22.3.0
GraalVM  : 22.3.0
Stability: Experimental
Component bundle native-image cannot be installed
        - The same component Native Image (org.graalvm.native-image[22.3.0.0/55b341ca1bca5219aafa8ed7c8a2273b81d184dd600d8261c837fc32d2dedae5]) is already installed in version 22.3.0

要建立本機執行文件,請使用:

./mvnw install -Dnative

這些指令在目標目錄中產生一個 *-runner 二進位文件,讓您可以執行本機執行檔:

./target/*-runner

在未安裝 GraalVM 的情況下建立本機執行檔

如果在本機安裝 GraalVM 有挑戰,可以使用容器內建置:

./mvnw install -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=graalvm

此命令啟動 Docker 容器內的建置並提供必要的映像檔。然後您可以透過以下方式啟動應用程式:

./target/*-runner

如果建立本機映像具有挑戰性,RedHat 團隊提供了專為 Quarkus 框架設計的 GraalVM 發行版,稱為 Mandrel。心軸流線型
GraalVM,僅專注於 Quarkus 應用程式必需的本機映像功能。若要使用心軸,請依照下列步驟操作:

  1. 確定適當的 Mandrel 版本 Mandrel 儲存庫

  2. 在 application.properties 檔案中設定 Mandrel 版本:

quarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17

3.執行Maven建置指令:

./mvnw clean install -Pnative

手動建立容器

對於喜歡手動控制容器建立的人,可以採用多階段 Docker 建置。

FROM quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17 AS build
COPY --chown=quarkus:quarkus mvnw /app/mvnw
COPY --chown=quarkus:quarkus .mvn /app/.mvn
COPY --chown=quarkus:quarkus pom.xml /app/
USER quarkus
WORKDIR /app
RUN ./mvnw -B org.apache.maven.plugins:maven-dependency-plugin:3.6.1:go-offline
COPY src /app/src
RUN ./mvnw package -Dnative

FROM quay.io/quarkus/quarkus-micro-image:2.0
WORKDIR /app/
COPY --from=build /app/target/*-runner /app/application

RUN chmod 775 /app /app/application \
  && chown -R 1001 /app \
  && chmod -R "g+rwX" /app \
  && chown -R 1001:root /app

EXPOSE 8080
USER 1001

CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

此 Dockerfile 編排多階段構建,從而產生包含 Quarkus 應用程式的 Docker 映像。執行此 Dockerfile 以產生 Docker 映像,並準備好運行您的 Quarkus 應用程式。

概括

GraalVM Native Image 是一項強大的技術,可以徹底改變您開發和部署 Java 微服務的方式。透過採用 GraalVM Native Image,您可以建立以下微服務:

  • 更快
  • 更具可擴充性
  • 部署更簡單
  • 性價比更高

GraalVM Native Image 是雲端原生 Java 開發的關鍵推動者,可協助您實現業務所需的效能、可擴充性和成本節約。

以上是使用 Quarkus 和 GraalVM 本機映像增強 Java 微服務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn