Java 云原生微服務框架 Quarkus 入門實踐
點擊上方“Java技術(shù)江湖”,選擇“設為星標”
回復”666“獲取全網(wǎng)最熱的Java核心知識點整理
1.1 定義
Quarkus定位要做超聲速、亞原子的Java框架,使用最好標準為OpenJDK HotSpot和GraalVM量身定制的Kubernetes Native Java棧;從一開始就是針對Kubernetes設計的云原生優(yōu)化Java應用開發(fā)框架;兼容主流的框架開發(fā)模式如Jpa、Netty、Undertow、Hibernate、JWT、Spring。最新版本為2.13.3。
Quarkus 官網(wǎng):https://quarkus.io/ Quarkus GitHub:https://github.com/quarkusio/quarkus
1.2 GraalVM 簡介
GraalVM 是 Oracle 開發(fā)的高性能的多語言運行時 JDK,旨在提高 Java 應用程序的性能,同時消耗更少的資源。
GraalVM 提供了兩種運行Java應用程序的方法:在HotSpot JVM上使用 Graal 即時(JIT)編譯器或者作為預先(AOT)編譯的本機可執(zhí)行文件。
除了 Java,它還提供了 JavaScript、Ruby、Python 和其他一些流行語言的運行時。GraalVM 的多語言功能使得在一個應用程序中混合編程語言成為可能,同時消除了任何外語調(diào)用成本。目前最新版本為 22.3。

GraalVM 可以創(chuàng)建原生可執(zhí)行文件; GraalVM 提供的原生鏡像(native image)功能可以把Java代碼預先編譯(Ahead-Of-Time,AOT)成獨立的可執(zhí)行文件。該可執(zhí)行文件包括了應用本身的代碼、所依賴的第三方庫和 JDK 本身。該執(zhí)行文件并不運行在 Java 虛擬機之上,而是名為 Substrate 的虛擬機。與運行在傳統(tǒng)的 Java 虛擬機上相比,原生可執(zhí)行文件在運行時的啟動速度更快,所耗費的內(nèi)存資源更少。可執(zhí)行文件的體積也更小; GraalVM 生成的原生可執(zhí)行文件與底層平臺相關,不能在當前平臺之外的其他平臺上運行。但對云原生應用來說,這并不是一個問題。云原生應用的設計目標是在容器中運行,所運行的底層平臺是固定的。
1.3 為何使用
使用 Spring Boot 的快速開發(fā)企業(yè)級應用的微服務啟動慢,從一個應用從啟動到服務可用,一般是數(shù)秒。在對 CPU 核數(shù)和內(nèi)存嚴格限制的情況下,花數(shù)十秒啟動的情況也屢見不鮮。這樣的問題無法適應需要快速重啟或快速擴容的場景。不僅如此,內(nèi)存消耗也很大。如果限制在 1G 時 FullGC 頻率變大,且經(jīng)常觸發(fā) OMM 后 Kill 導致 pod 重啟,并且啟動時間也會變長。
相比之下,集群中使用 GO 語言開發(fā)的應用則配置 128M 內(nèi)存也可正常使用。以 JVM 模式運行的 Java 應用,并不太適合于云原生應用的開發(fā),而擁抱云原生則是未來技術(shù)的大趨勢。
容器云已經(jīng)為未來主流,也即是軟件都是運行在 K8S 這樣的容器集群里。而容器環(huán)境需要應用具備啟動速度快,資源占用小,響應時間短等特性。Quarkus 順應這種趨勢而生的。
對于云原生應用來說,平臺無關性變得無關緊要。云原生應用都是以容器化的形式運行的,所運行的底層平臺是固定的; 云原生應用對啟動速度的要求比較高。當需要進行水平擴展時,要求這些新的實例必須在足夠短的時間內(nèi)完成啟動,從而盡快的處理新增的請求; 云原生應用要求在運行時占用盡可能少的資源。盡可能的減少單個實例占用的資源,就意味著可以用同樣的成本,支持更多的訪問請求; 云原生應用要求更小的打包體積。云原生應用以容器鏡像的形式打包。應用鏡像的尺寸越大,所需要的存儲空間也會越大,推送和拉取鏡像所耗費的時間也會更長。
Quarkus具備企業(yè)級應用開發(fā)能力。
在 Serverless 服務器架構(gòu)、微服務、容器、Kubernetes、功能即服務(FaaS)和云環(huán)境中運行 Java 而言,考慮了所有這些因素的 Quarkus 堪稱是一個有效的解決方案。
1.4 特性
容器優(yōu)先
構(gòu)建期即生成云原生鏡像執(zhí)行文件。
Quarkus 為 GraalVM 和 HotSpot 定制應用程序。快速啟動、低內(nèi)存消耗、體積小,在 Kubernetes 這樣的容器編排平臺上提供了近乎實時的擴展和高密度的內(nèi)存利用率。這就是使用了編譯時引導的技術(shù)。
支持 Graal/SubstrateVM 構(gòu)建時元數(shù)據(jù)處理 盡量減少 JNI 調(diào)用 減少反射的使用 本機映像預啟動
Kubernete 原生
構(gòu)建期即生成云原生鏡像執(zhí)行文件,可以與 Docker 和 Kubernetes 輕松集成,Quarkus 和 Kubernetes 的組合可以伸縮、快速創(chuàng)建輕量級的應用程序。Quarkus 通過工具、預構(gòu)建的集成、應用程序服務等顯著提高了開發(fā)人員的工作效率。
命令式和響應式
在設計上 Quarkus 能夠在開發(fā)應用時無縫地結(jié)合熟悉的命令式代碼和非阻塞、響應式樣式。這對于習慣使用命令式模型而不想切換風格的 Java 開發(fā)人員以及使用云原生/響應式方法的開發(fā)人員都非常有用。
社區(qū)和標準
擁抱 JavaEE 標準,使用 JavaEE 官方 RESTful、CDI 等標準接口。Quarkus 提供了一個內(nèi)聚的、輕量的全棧框架,包含超過 50 個使用的最佳類庫。
對開發(fā)者友好
學習成本也低,具有統(tǒng)一的配置和簡單的本地可執(zhí)行文件生成,零配置,實時重新加載,80% 的常用標準和 20% 靈活應用。
1.5 官方性能數(shù)據(jù)

從圖中可以看出,使用 Quarkus 和 GraalVM 的簡單的 REST 應用的啟動時間僅為 16 毫秒,占用內(nèi)存僅 12MB。如果使用傳統(tǒng)的基于 Java 虛擬機實現(xiàn),應用的啟動時間需要 4.3 秒,占用內(nèi)存為 136MB。
2. 實戰(zhàn)
入門示例項目步驟:
安裝 GraalVM 創(chuàng)建 Quarkus工程 IDEA 導入項目 IDEA 編碼運行和調(diào)試 打包成普通的 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,解壓到本地磁盤目錄,查看版本信息如下:

# windows
PATH環(huán)境變量增加路徑:D:\Program Files\Java\graalvm-ce-java11-22.2.0\bin
JAVA_HOME配置環(huán)境變量: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 創(chuàng)建 Quarkus 工程
萬丈高樓平地起,首先是創(chuàng)建 Quarkus 項目。與 Spring Boot類似,Quarkus 為我們提供了多種方式創(chuàng)建 Quarkus 工程,下面對常用的 3 種進行介紹。
IDEA 支持創(chuàng)建 Quarkus 項目

maven 命令支持創(chuàng)建(使用的是 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/ 頁面在線創(chuàng)建,這種方法直觀且簡單(不用記命令),推薦使用。添加自己的 maven 配置,然后下載網(wǎng)站生成的工程包。

我們先以第三種為例說明,通過在線網(wǎng)頁生成 quarkus-web-demo.zip。解壓后用 tree 命令看看項目結(jié)構(gòu),是一個標準的 maven 工程,多了個 docker 目錄,里面有幾個 Dockerfile 文件相關的問題。
目錄結(jié)構(gòu)如下:

2.3 IDEA 導入項目
IDEA 導入上面的 Maven項目,幾分鐘下載依賴后項目已成功導入。可以看到 Quarkus 項目的 pom 文件核心依賴為 quarkus-bom。Quarkus 官方認為傳統(tǒng)的接口就是一個個對外方法的資源,所以在 Quarkus 里面是以 Resource 資源的概念來進行的。

2.4 IDEA 運行和調(diào)試
在 IDEA 要運行和調(diào)試 Quarkus 的項目,首先得在項目添加 SDK,并將路徑指向剛才解壓的目錄。

修改項目的 GreetingResource 源文件示例方法返回值內(nèi)容"Hello ITXS RESTEasy",同樣也修改單元測試 GreetingResourceTest 的測試方法的值為上面的內(nèi)容,在運行菜單中點擊添加新的 Quarkus 配置。

新建后點擊運行按鈕(mvn compile quarkus:dev ),正常運行輸出日志如下:

訪問本地 http://localhost:8080/hello 后可以看到正確的返回結(jié)果,同樣也可以直接點擊調(diào)試按鈕進入調(diào)試模式。

2.5 打包成普通的 Jar
通過 maven 的 package 打包后,生成打包目錄如下:

可以直接通過 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 秒的時間就啟動完畢了。
訪問上面測試地址同樣可以看到正確的結(jié)果:

2.6 打包成依賴 GraalVM 二進制文件
此方法打包的二進制文件仍需要依賴 GraalVM,但由于代碼已經(jīng)做了靜態(tài)編譯處理,所以執(zhí)行效率有大幅提升,比較適合容器化啟動。
先安裝 VS C++依賴,下載 Visual Studio Installer,需要取消中文并選擇英文。然后使用 powershell 進入到項目根目錄,執(zhí)行 mvn package -Pnative 命令后報錯:

根據(jù)提示安裝 native-image 執(zhí)行安裝命令和確認是否配置了 GRAALVM_HOME、JAVA_HOME 環(huán)境變量
gu install native-image
# 重新執(zhí)行打包
mvn package -Pnative
直接運行生成的可執(zhí)行文件 quarkus-web-demo-1.0.0-SNAPSHOT-runner,確實飛快,啟動時間只要 0.033s,訪問hello也正常顯示。

2.7 打包成不依賴 GraalVM 的二進制文件
需要本機先裝有 docker 的環(huán)境,這里用的是 docker desktop。打包有多種方法,可以直接 maven 參數(shù)構(gòu)建,也可以在 appllications.properties 文件中增加構(gòu)建參數(shù)。
quarkus.native.container-build=true
quarkus.native.native-image-xmx=4096m

# 終端命令中執(zhí)行打包
mvn clean package -Dnative

2.8 制作 docker 鏡像
直接通過 Dockerfile.native 制作 docker 鏡像:
docker build \
-f src/main/docker/Dockerfile.native \
-t bolingcavalry/quarkus-web-demo:0.0.1 .
執(zhí)行 docker 命令生成成功:

查看鏡像已經(jīng)生成:

通過 docker run 命令啟動后查看容器的信息:

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

文章來源:cnblogs.com/itxiaoshen/p/16804642.html

14家互聯(lián)網(wǎng)公司裁員(1-2月裁員清單)

Spring Boot + Flowable 快速實現(xiàn)工作流,So Easy!

面試官:String長度有限制嗎?是多少?
關注公眾號【Java技術(shù)江湖】后回復“PDF”即可領取200+頁的《Java工程師面試指南》
強烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點,不管是復習還是面試,都很實用。

