搜尋
首頁Javajava教程使用 Quarkus 和 GraalVM 本機映像增強 Java 微服務

在現代軟體開發的動態格局中,微服務已成為最受歡迎的架構方法。雖然這種方法提供了許多優點,但它並非沒有挑戰。傳統的基於 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
為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強鍵入如何有助於平台獨立性?Java的強鍵入如何有助於平台獨立性?Apr 25, 2025 am 12:11 AM

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

說明Java本機界面(JNI)如何損害平台獨立性。說明Java本機界面(JNI)如何損害平台獨立性。Apr 25, 2025 am 12:07 AM

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具