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。

- 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 官方性能數據

從圖中可以看出,使用 Quarkus 和 GraalVM 的簡單的 REST 應用的啟動時間僅為 16 毫秒,占用內存僅 12MB。如果使用傳統的基于 Java 虛擬機實現,應用的啟動時間需要 4.3 秒,占用內存為 136MB。
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
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,解壓到本地磁盤目錄,查看版本信息如下:

>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element實現的后臺管理系統+用戶小程序,支持RBAC動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
>
>*項目地址:
>*視頻教程:
#windows
PATH環境變量增加路徑:D:ProgramFilesJavagraalvm-ce-java11-22.2.0in
JAVA_HOME配置環境變量:D:ProgramFilesJavagraalvm-ce-java11-22.2.0
#linux
wgethttps://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-linux-amd64-22.2.0.tar.gz
tar-xvfgraalvm-ce-java17-linux-amd64-22.2.0.tar.gz
exportGRAALVM_HOME=/home/commons/graalvm-ce-java17-22.2.0
exportPATH=$PATH:$GRAALVM_HOME/bin
exportJAVA_HOME=${GRAALVM_HOME}
exportPATH=$PATH:$JAVA_HOME/bin
exportMAVEN_HOME=/home/commons/apache-maven-3.8.6
exportPATH=$PATH:$MAVEN_HOME/bin
2.2 創建 Quarkus 工程
萬丈高樓平地起,首先是創建 Quarkus 項目。與 Spring Boot類似,Quarkus 為我們提供了多種方式創建 Quarkus 工程,下面對常用的 3 種進行介紹。
IDEA 支持創建 Quarkus 項目

maven 命令支持創建(使用的是 apache-maven-3.8.6)
mvnio.quarkuscreate-DprojectGroupId=cn.itxs-DprojectArtifactId=quarkus-web-demo-m-DprojectVersion=1.0-SNAPSHOT-DclassName=FirstResource-Dpath=actions
通過官方提供 Quarkus 代碼生成 https://code.quarkus.io/ 頁面在線創建,這種方法直觀且簡單(不用記命令),推薦使用。添加自己的 maven 配置,然后下載網站生成的工程包。

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

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

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

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

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

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

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

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

根據提示安裝 native-image 執行安裝命令和確認是否配置了 GRAALVM_HOME、JAVA_HOME 環境變量
guinstallnative-image
#重新執行打包
mvnpackage-Pnative

直接運行生成的可執行文件 quarkus-web-demo-1.0.0-SNAPSHOT-runner,確實飛快,啟動時間只要 0.033s,訪問hello也正常顯示。

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

#終端命令中執行打包
mvncleanpackage-Dnative

2.8 制作 docker 鏡像
直接通過 Dockerfile.native 制作 docker 鏡像:
dockerbuild
-fsrc/main/docker/Dockerfile.native
-tbolingcavalry/quarkus-web-demo:0.0.1.
執行 docker 命令生成成功:

查看鏡像已經生成:

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

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

審核編輯 :李倩
-
JAVA
+關注
關注
20文章
2986瀏覽量
107088 -
框架
+關注
關注
0文章
404瀏覽量
17812 -
微服務
+關注
關注
0文章
145瀏覽量
7683
原文標題:Java 云原生微服務框架 Quarkus 入門實踐
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
從 Java 到 Go:面向對象的巨人與云原生的輕騎兵
微服務器架構幾種典型的基礎框架,你了解嗎?
云原生AI服務怎么樣
云原生LLMOps平臺作用
Java微服務中如何確保安全性?
如何選擇云原生機器學習平臺
什么是云原生MLOps平臺
k8s微服務架構就是云原生嗎?兩者是什么關系
開源分析和落地方案—Sentinel篇

入門級攻略:如何容器化部署微服務?
云原生和非云原生哪個好?六大區別詳細對比
京東云原生安全產品重磅發布

從積木式到裝配式云原生安全

基于DPU與SmartNic的云原生SDN解決方案

基于DPU的云原生裸金屬服務快速部署及存儲解決方案

評論