天天看點

Java 雲原生微服務架構 Quarkus 入門實踐

1. 概述

1.1 定義

Quarkus定位要做超聲速、亞原子的Java架構,使用最好标準為OpenJDK HotSpot和GraalVM量身定制的Kubernetes Native Java棧;從一開始就是針對Kubernetes設計的雲原生優化Java應用開發架構;相容主流的架構開發模式如Jpa、Netty、Undertow、Hibernate、JWT、Spring。最新版本為2.13.3。

  • Quarkus 官網:https://quarkus.io/
  • Quarkus GitHub:https://github.com/quarkusio/quarkus

1.2 GraalVM 簡介

GraalVM 是 Oracle 開發的高性能的多語言運作時 JDK,旨在提高 Java 應用程式的性能,同時消耗更少的資源。

GraalVM 提供了兩種運作Java應用程式的方法:在HotSpot JVM上使用 Graal 即時(JIT)編譯器或者作為預先(AOT)編譯的本機可執行檔案。

除了 Java,它還提供了 JavaScript、Ruby、Python 和其他一些流行語言的運作時。GraalVM 的多語言功能使得在一個應用程式中混合程式設計語言成為可能,同時消除了任何外語調用成本。目前最新版本為 22.3。

Java 雲原生微服務架構 Quarkus 入門實踐
  • GraalVM 可以建立原生可執行檔案;
  • GraalVM 提供的原生鏡像(native image)功能可以把Java代碼預先編譯(Ahead-Of-Time,AOT)成獨立的可執行檔案。該可執行檔案包括了應用本身的代碼、所依賴的第三方庫和 JDK 本身。該執行檔案并不運作在 Java 虛拟機之上,而是名為 Substrate 的虛拟機。與運作在傳統的 Java 虛拟機上相比,原生可執行檔案在運作時的啟動速度更快,所耗費的記憶體資源更少。可執行檔案的體積也更小;
  • GraalVM 生成的原生可執行檔案與底層平台相關,不能在目前平台之外的其他平台上運作。但對雲原生應用來說,這并不是一個問題。雲原生應用的設計目标是在容器中運作,所運作的底層平台是固定的。

1.3 為何使用

使用 Spring Boot 的快速開發企業級應用的微服務啟動慢,從一個應用從啟動到服務可用,一般是數秒。在對 CPU 核數和記憶體嚴格限制的情況下,花數十秒啟動的情況也屢見不鮮。這樣的問題無法适應需要快速重新開機或快速擴容的場景。不僅如此,記憶體消耗也很大。如果限制在 1G 時 FullGC 頻率變大,且經常觸發 OMM 後 Kill 導緻 pod 重新開機,并且啟動時間也會變長。

相比之下,叢集中使用 GO 語言開發的應用則配置 128M 記憶體也可正常使用。以 JVM 模式運作的 Java 應用,并不太适合于雲原生應用的開發,而擁抱雲原生則是未來技術的大趨勢。

容器雲已經為未來主流,也即是軟體都是運作在 K8S 這樣的容器叢集裡。而容器環境需要應用具備啟動速度快,資源占用小,響應時間短等特性。Quarkus 順應這種趨勢而生的。

  • 對于雲原生應用來說,平台無關性變得無關緊要。雲原生應用都是以容器化的形式運作的,所運作的底層平台是固定的;
  • 雲原生應用對啟動速度的要求比較高。當需要進行水準擴充時,要求這些新的執行個體必須在足夠短的時間内完成啟動,進而盡快的處理新增的請求;
  • 雲原生應用要求在運作時占用盡可能少的資源。盡可能的減少單個執行個體占用的資源,就意味着可以用同樣的成本,支援更多的通路請求;
  • 雲原生應用要求更小的打包體積。雲原生應用以容器鏡像的形式打包。應用鏡像的尺寸越大,所需要的存儲空間也會越大,推送和拉取鏡像所耗費的時間也會更長。

Quarkus具備企業級應用開發能力。

在 Serverless 伺服器架構、微服務、容器、Kubernetes、功能即服務(FaaS)和雲環境中運作 Java 而言,考慮了所有這些因素的 Quarkus 堪稱是一個有效的解決方案。

1.4 特性

容器優先

建構期即生成雲原生鏡像執行檔案。

Quarkus 為 GraalVM 和 HotSpot 定制應用程式。快速啟動、低記憶體消耗、體積小,在 Kubernetes 這樣的容器編排平台上提供了近乎實時的擴充和高密度的記憶體使用率。這就是使用了編譯時引導的技術。

  • 支援 Graal/SubstrateVM
  • 建構時中繼資料處理
  • 盡量減少 JNI 調用
  • 減少反射的使用
  • 本機映像預啟動

Kubernete 原生

建構期即生成雲原生鏡像執行檔案,可以與 Docker 和 Kubernetes 輕松內建,Quarkus 和 Kubernetes 的組合可以伸縮、快速建立輕量級的應用程式。Quarkus 通過工具、預建構的內建、應用程式服務等顯著提高了開發人員的工作效率。

指令式和響應式

在設計上 Quarkus 能夠在開發應用時無縫地結合熟悉的指令式代碼和非阻塞、響應式樣式。這對于習慣使用指令式模型而不想切換風格的 Java 開發人員以及使用雲原生/響應式方法的開發人員都非常有用。

社群和标準

擁抱 JavaEE 标準,使用 JavaEE 官方 RESTful、CDI 等标準接口。Quarkus 提供了一個内聚的、輕量的全棧架構,包含超過 50 個使用的最佳類庫。

對開發者友好

學習成本也低,具有統一的配置和簡單的本地可執行檔案生成,零配置,實時重新加載,80% 的常用标準和 20% 靈活應用。

1.5 官方性能資料

Java 雲原生微服務架構 Quarkus 入門實踐

從圖中可以看出,使用 Quarkus 和 GraalVM 的簡單的 REST 應用的啟動時間僅為 16 毫秒,占用記憶體僅 12MB。如果使用傳統的基于 Java 虛拟機實作,應用的啟動時間需要 4.3 秒,占用記憶體為 136MB。

2. 實戰

入門示例項目步驟:

  • 安裝 GraalVM
  • 建立 Quarkus工程
  • IDEA 導入項目
  • IDEA 編碼運作和調試
  • 打包成普通的 jar
  • 打包成依賴 GraalVM 的二進制檔案
  • 打包成不依賴 GraalVM 的二進制檔案
  • 制作成 Docker 鏡像

2.1 安裝 GraalVM

GraalVM 官方文檔:https://www.graalvm.org/22.2/docs/

GraalVM GitHub:https://github.com/graalvm/graalvm-ce-builds/releases

了解 GraalVM 的最新版本 22.3 的使用可以查閱 GraalVM 官方文檔。先從 GitHub 下載下傳 GraalVM 。這裡先以下載下傳windows版本為例,下載下傳後的檔案 graalvm-ce-java11-windows-amd64-22.2.0.zip,解壓到本地磁盤目錄,檢視版本資訊如下:

Java 雲原生微服務架構 Quarkus 入門實踐
# windows
PATH環境變量增加路徑:D:\Program Files\Java\graalvm-ce-java11-22.2.0\bin
JAVA_HOME配置環境變量:D:\Program Files\Java\graalvm-ce-java11-22.2.0

# linux
wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-linux-amd64-22.2.0.tar.gz
tar -xvf graalvm-ce-java17-linux-amd64-22.2.0.tar.gz

export GRAALVM_HOME=/home/commons/graalvm-ce-java17-22.2.0
export PATH=$PATH:$GRAALVM_HOME/bin
export JAVA_HOME=${GRAALVM_HOME}
export PATH=$PATH:$JAVA_HOME/bin
export MAVEN_HOME=/home/commons/apache-maven-3.8.6
export PATH=$PATH:$MAVEN_HOME/bin
           

2.2 建立 Quarkus 工程

萬丈高樓平地起,首先是建立 Quarkus 項目。與 Spring Boot類似,Quarkus 為我們提供了多種方式建立 Quarkus 工程,下面對常用的 3 種進行介紹。

IDEA 支援建立 Quarkus 項目

Java 雲原生微服務架構 Quarkus 入門實踐

maven 指令支援建立(使用的是 apache-maven-3.8.6)

mvn io.quarkus:quarkus-maven-plugin:create -DprojectGroupId=cn.itxs -DprojectArtifactId=quarkus-web-demo-m -DprojectVersion=1.0-SNAPSHOT -DclassName=FirstResource -Dpath=actions
           

通過官方提供 Quarkus 代碼生成 https://code.quarkus.io/ 頁面線上建立,這種方法直覺且簡單(不用記指令),推薦使用。添加自己的 maven 配置,然後下載下傳網站生成的工程包。

Java 雲原生微服務架構 Quarkus 入門實踐

我們先以第三種為例說明,通過線上網頁生成 quarkus-web-demo.zip。解壓後用 tree 指令看看項目結構,是一個标準的 maven 工程,多了個 docker 目錄,裡面有幾個 Dockerfile 檔案相關的問題。

目錄結構如下:

Java 雲原生微服務架構 Quarkus 入門實踐

2.3 IDEA 導入項目

IDEA 導入上面的 Maven項目,幾分鐘下載下傳依賴後項目已成功導入。可以看到 Quarkus 項目的 pom 檔案核心依賴為 quarkus-bom。Quarkus 官方認為傳統的接口就是一個個對外方法的資源,是以在 Quarkus 裡面是以 Resource 資源的概念來進行的。

Java 雲原生微服務架構 Quarkus 入門實踐

2.4 IDEA 運作和調試

在 IDEA 要運作和調試 Quarkus 的項目,首先得在項目添加 SDK,并将路徑指向剛才解壓的目錄。

Java 雲原生微服務架構 Quarkus 入門實踐

修改項目的 GreetingResource 源檔案示例方法傳回值内容"Hello ITXS RESTEasy",同樣也修改單元測試 GreetingResourceTest 的測試方法的值為上面的内容,在運作菜單中點選添加新的 Quarkus 配置。

Java 雲原生微服務架構 Quarkus 入門實踐

建立後點選運作按鈕(mvn compile quarkus:dev ),正常運作輸出日志如下:

Java 雲原生微服務架構 Quarkus 入門實踐

通路本地 http://localhost:8080/hello 後可以看到正确的傳回結果,同樣也可以直接點選調試按鈕進入調試模式。

Java 雲原生微服務架構 Quarkus 入門實踐

2.5 打包成普通的 Jar

通過 maven 的 package 打包後,生成打包目錄如下:

Java 雲原生微服務架構 Quarkus 入門實踐

可以直接通過 java -jar 運作 quarkus-app 目錄下 quarkus-run.jar 和 quarkus-web-demo-1.0.0-SNAPSHOT-native-image-source-jar 目錄下的 quarkus-web-demo-1.0.0-SNAPSHOT-runner.jar。不到 1 秒的時間就啟動完畢了。

通路上面測試位址同樣可以看到正确的結果:

Java 雲原生微服務架構 Quarkus 入門實踐

2.6 打包成依賴 GraalVM 二進制檔案

此方法打包的二進制檔案仍需要依賴 GraalVM,但由于代碼已經做了靜态編譯處理,是以執行效率有大幅提升,比較适合容器化啟動。

先安裝 VS C++依賴,下載下傳 Visual Studio Installer,需要取消中文并選擇英文。然後使用 powershell 進入到項目根目錄,執行 mvn package -Pnative 指令後報錯:

Java 雲原生微服務架構 Quarkus 入門實踐

根據提示安裝 native-image 執行安裝指令和确認是否配置了 GRAALVM_HOME、JAVA_HOME 環境變量

gu install native-image
# 重新執行打包
mvn package -Pnative
           

直接運作生成的可執行檔案 quarkus-web-demo-1.0.0-SNAPSHOT-runner,确實飛快,啟動時間隻要 0.033s,通路hello也正常顯示。

Java 雲原生微服務架構 Quarkus 入門實踐

2.7 打包成不依賴 GraalVM 的二進制檔案

需要本機先裝有 docker 的環境,這裡用的是 docker desktop。打包有多種方法,可以直接 maven 參數建構,也可以在 appllications.properties 檔案中增加建構參數。

quarkus.native.container-build=true
quarkus.native.native-image-xmx=4096m
           
Java 雲原生微服務架構 Quarkus 入門實踐

# 終端指令中執行打包

mvn clean package -Dnative

Java 雲原生微服務架構 Quarkus 入門實踐

2.8 制作 docker 鏡像

直接通過 Dockerfile.native 制作 docker 鏡像:

docker build \
-f src/main/docker/Dockerfile.native \
-t bolingcavalry/quarkus-web-demo:0.0.1 .
           

執行 docker 指令生成成功:

Java 雲原生微服務架構 Quarkus 入門實踐

檢視鏡像已經生成:

Java 雲原生微服務架構 Quarkus 入門實踐

通過 docker run 指令啟動後檢視容器的資訊:

Java 雲原生微服務架構 Quarkus 入門實踐

通過 curl -L http://172.17.0.2:8080/hello -w '\n' 也可以正常通路。

Java 雲原生微服務架構 Quarkus 入門實踐
來源:cnblogs.com/itxiaoshen/p/16804642.html

繼續閱讀