1. 概述
1.1 定義
Quarkus定位要做超聲速、亞原子的Java框架,使用最好標(biāo)準(zhǔn)為OpenJDK HotSpot和GraalVM量身定制的Kubernetes Native Java棧;從一開始就是針對(duì)Kubernetes設(shè)計(jì)的云原生優(yōu)化Java應(yīng)用開發(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ā)的高性能的多語言運(yùn)行時(shí) JDK,旨在提高 Java 應(yīng)用程序的性能,同時(shí)消耗更少的資源。
GraalVM 提供了兩種運(yùn)行Java應(yīng)用程序的方法:在HotSpot JVM上使用 Graal 即時(shí)(JIT)編譯器或者作為預(yù)先(AOT)編譯的本機(jī)可執(zhí)行文件。
除了 Java,它還提供了 JavaScript、Ruby、Python 和其他一些流行語言的運(yùn)行時(shí)。GraalVM 的多語言功能使得在一個(gè)應(yīng)用程序中混合編程語言成為可能,同時(shí)消除了任何外語調(diào)用成本。目前最新版本為 22.3。
- GraalVM 可以創(chuàng)建原生可執(zhí)行文件;
- GraalVM 提供的原生鏡像(native image)功能可以把Java代碼預(yù)先編譯(Ahead-Of-Time,AOT)成獨(dú)立的可執(zhí)行文件。該可執(zhí)行文件包括了應(yīng)用本身的代碼、所依賴的第三方庫和 JDK 本身。該執(zhí)行文件并不運(yùn)行在 Java 虛擬機(jī)之上,而是名為 Substrate 的虛擬機(jī)。與運(yùn)行在傳統(tǒng)的 Java 虛擬機(jī)上相比,原生可執(zhí)行文件在運(yùn)行時(shí)的啟動(dòng)速度更快,所耗費(fèi)的內(nèi)存資源更少。可執(zhí)行文件的體積也更小;
- GraalVM 生成的原生可執(zhí)行文件與底層平臺(tái)相關(guān),不能在當(dāng)前平臺(tái)之外的其他平臺(tái)上運(yùn)行。但對(duì)云原生應(yīng)用來說,這并不是一個(gè)問題。云原生應(yīng)用的設(shè)計(jì)目標(biāo)是在容器中運(yùn)行,所運(yùn)行的底層平臺(tái)是固定的。
1.3 為何使用
使用 Spring Boot 的快速開發(fā)企業(yè)級(jí)應(yīng)用的微服務(wù)啟動(dòng)慢,從一個(gè)應(yīng)用從啟動(dòng)到服務(wù)可用,一般是數(shù)秒。在對(duì) CPU 核數(shù)和內(nèi)存嚴(yán)格限制的情況下,花數(shù)十秒啟動(dòng)的情況也屢見不鮮。這樣的問題無法適應(yīng)需要快速重啟或快速擴(kuò)容的場景。不僅如此,內(nèi)存消耗也很大。如果限制在 1G 時(shí) FullGC 頻率變大,且經(jīng)常觸發(fā) OMM 后 Kill 導(dǎo)致 pod 重啟,并且啟動(dòng)時(shí)間也會(huì)變長。
相比之下,集群中使用 GO 語言開發(fā)的應(yīng)用則配置 128M 內(nèi)存也可正常使用。以 JVM 模式運(yùn)行的 Java 應(yīng)用,并不太適合于云原生應(yīng)用的開發(fā),而擁抱云原生則是未來技術(shù)的大趨勢。
容器云已經(jīng)為未來主流,也即是軟件都是運(yùn)行在 K8S 這樣的容器集群里。而容器環(huán)境需要應(yīng)用具備啟動(dòng)速度快,資源占用小,響應(yīng)時(shí)間短等特性。Quarkus 順應(yīng)這種趨勢而生的。
- 對(duì)于云原生應(yīng)用來說,平臺(tái)無關(guān)性變得無關(guān)緊要。云原生應(yīng)用都是以容器化的形式運(yùn)行的,所運(yùn)行的底層平臺(tái)是固定的;
- 云原生應(yīng)用對(duì)啟動(dòng)速度的要求比較高。當(dāng)需要進(jìn)行水平擴(kuò)展時(shí),要求這些新的實(shí)例必須在足夠短的時(shí)間內(nèi)完成啟動(dòng),從而盡快的處理新增的請(qǐng)求;
- 云原生應(yīng)用要求在運(yùn)行時(shí)占用盡可能少的資源。盡可能的減少單個(gè)實(shí)例占用的資源,就意味著可以用同樣的成本,支持更多的訪問請(qǐng)求;
- 云原生應(yīng)用要求更小的打包體積。云原生應(yīng)用以容器鏡像的形式打包。應(yīng)用鏡像的尺寸越大,所需要的存儲(chǔ)空間也會(huì)越大,推送和拉取鏡像所耗費(fèi)的時(shí)間也會(huì)更長。
Quarkus具備企業(yè)級(jí)應(yīng)用開發(fā)能力。
在 Serverless 服務(wù)器架構(gòu)、微服務(wù)、容器、Kubernetes、功能即服務(wù)(FaaS)和云環(huán)境中運(yùn)行 Java 而言,考慮了所有這些因素的 Quarkus 堪稱是一個(gè)有效的解決方案。
1.4 特性
容器優(yōu)先
構(gòu)建期即生成云原生鏡像執(zhí)行文件。
Quarkus 為 GraalVM 和 HotSpot 定制應(yīng)用程序。快速啟動(dòng)、低內(nèi)存消耗、體積小,在 Kubernetes 這樣的容器編排平臺(tái)上提供了近乎實(shí)時(shí)的擴(kuò)展和高密度的內(nèi)存利用率。這就是使用了編譯時(shí)引導(dǎo)的技術(shù)。
- 支持 Graal/SubstrateVM
- 構(gòu)建時(shí)元數(shù)據(jù)處理
- 盡量減少 JNI 調(diào)用
- 減少反射的使用
- 本機(jī)映像預(yù)啟動(dòng)
Kubernete 原生
構(gòu)建期即生成云原生鏡像執(zhí)行文件,可以與 Docker 和 Kubernetes 輕松集成,Quarkus 和 Kubernetes 的組合可以伸縮、快速創(chuàng)建輕量級(jí)的應(yīng)用程序。Quarkus 通過工具、預(yù)構(gòu)建的集成、應(yīng)用程序服務(wù)等顯著提高了開發(fā)人員的工作效率。
命令式和響應(yīng)式
在設(shè)計(jì)上 Quarkus 能夠在開發(fā)應(yīng)用時(shí)無縫地結(jié)合熟悉的命令式代碼和非阻塞、響應(yīng)式樣式。這對(duì)于習(xí)慣使用命令式模型而不想切換風(fēng)格的 Java 開發(fā)人員以及使用云原生/響應(yīng)式方法的開發(fā)人員都非常有用。
社區(qū)和標(biāo)準(zhǔn)
擁抱 JavaEE 標(biāo)準(zhǔn),使用 JavaEE 官方 RESTful、CDI 等標(biāo)準(zhǔn)接口。Quarkus 提供了一個(gè)內(nèi)聚的、輕量的全棧框架,包含超過 50 個(gè)使用的最佳類庫。
對(duì)開發(fā)者友好
學(xué)習(xí)成本也低,具有統(tǒng)一的配置和簡單的本地可執(zhí)行文件生成,零配置,實(shí)時(shí)重新加載,80% 的常用標(biāo)準(zhǔn)和 20% 靈活應(yīng)用。
1.5 官方性能數(shù)據(jù)
從圖中可以看出,使用 Quarkus 和 GraalVM 的簡單的 REST 應(yīng)用的啟動(dòng)時(shí)間僅為 16 毫秒,占用內(nèi)存僅 12MB。如果使用傳統(tǒng)的基于 Java 虛擬機(jī)實(shí)現(xiàn),應(yīng)用的啟動(dòng)時(shí)間需要 4.3 秒,占用內(nèi)存為 136MB。
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
- 項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
2. 實(shí)戰(zhàn)
入門示例項(xiàng)目步驟:
- 安裝 GraalVM
- 創(chuàng)建 Quarkus工程
- IDEA 導(dǎo)入項(xiàng)目
- IDEA 編碼運(yùn)行和調(diào)試
- 打包成普通的 jar
- 打包成依賴 GraalVM 的二進(jìn)制文件
- 打包成不依賴 GraalVM 的二進(jìn)制文件
- 制作成 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實(shí)現(xiàn)的后臺(tái)管理系統(tǒng)+用戶小程序,支持RBAC動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
>
>*項(xiàng)目地址:
>*視頻教程:
#windows
PATH環(huán)境變量增加路徑:D:ProgramFilesJavagraalvm-ce-java11-22.2.0in
JAVA_HOME配置環(huán)境變量: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 創(chuàng)建 Quarkus 工程
萬丈高樓平地起,首先是創(chuàng)建 Quarkus 項(xiàng)目。與 Spring Boot類似,Quarkus 為我們提供了多種方式創(chuàng)建 Quarkus 工程,下面對(duì)常用的 3 種進(jìn)行介紹。
IDEA 支持創(chuàng)建 Quarkus 項(xiàng)目
maven 命令支持創(chuàng)建(使用的是 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/ 頁面在線創(chuàng)建,這種方法直觀且簡單(不用記命令),推薦使用。添加自己的 maven 配置,然后下載網(wǎng)站生成的工程包。
我們先以第三種為例說明,通過在線網(wǎng)頁生成 quarkus-web-demo.zip。解壓后用 tree 命令看看項(xiàng)目結(jié)構(gòu),是一個(gè)標(biāo)準(zhǔn)的 maven 工程,多了個(gè) docker 目錄,里面有幾個(gè) Dockerfile 文件相關(guān)的問題。
目錄結(jié)構(gòu)如下:
2.3 IDEA 導(dǎo)入項(xiàng)目
IDEA 導(dǎo)入上面的 Maven項(xiàng)目,幾分鐘下載依賴后項(xiàng)目已成功導(dǎo)入。可以看到 Quarkus 項(xiàng)目的 pom 文件核心依賴為 quarkus-bom。Quarkus 官方認(rèn)為傳統(tǒng)的接口就是一個(gè)個(gè)對(duì)外方法的資源,所以在 Quarkus 里面是以 Resource 資源的概念來進(jìn)行的。
2.4 IDEA 運(yùn)行和調(diào)試
在 IDEA 要運(yùn)行和調(diào)試 Quarkus 的項(xiàng)目,首先得在項(xiàng)目添加 SDK,并將路徑指向剛才解壓的目錄。
修改項(xiàng)目的 GreetingResource 源文件示例方法返回值內(nèi)容"Hello ITXS RESTEasy",同樣也修改單元測試 GreetingResourceTest 的測試方法的值為上面的內(nèi)容,在運(yùn)行菜單中點(diǎn)擊添加新的 Quarkus 配置。
新建后點(diǎn)擊運(yùn)行按鈕(mvn compile quarkus:dev ),正常運(yùn)行輸出日志如下:
訪問本地 http://localhost:8080/hello 后可以看到正確的返回結(jié)果,同樣也可以直接點(diǎn)擊調(diào)試按鈕進(jìn)入調(diào)試模式。
2.5 打包成普通的 Jar
通過 maven 的 package 打包后,生成打包目錄如下:
可以直接通過 java -jar 運(yùn)行 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 秒的時(shí)間就啟動(dòng)完畢了。
訪問上面測試地址同樣可以看到正確的結(jié)果:
2.6 打包成依賴 GraalVM 二進(jìn)制文件
此方法打包的二進(jìn)制文件仍需要依賴 GraalVM,但由于代碼已經(jīng)做了靜態(tài)編譯處理,所以執(zhí)行效率有大幅提升,比較適合容器化啟動(dòng)。
先安裝 VS C++依賴,下載 Visual Studio Installer,需要取消中文并選擇英文。然后使用 powershell 進(jìn)入到項(xiàng)目根目錄,執(zhí)行 mvn package -Pnative 命令后報(bào)錯(cuò):
根據(jù)提示安裝 native-image 執(zhí)行安裝命令和確認(rèn)是否配置了 GRAALVM_HOME、JAVA_HOME 環(huán)境變量
guinstallnative-image
#重新執(zhí)行打包
mvnpackage-Pnative
直接運(yùn)行生成的可執(zhí)行文件 quarkus-web-demo-1.0.0-SNAPSHOT-runner,確實(shí)飛快,啟動(dòng)時(shí)間只要 0.033s,訪問hello也正常顯示。
2.7 打包成不依賴 GraalVM 的二進(jìn)制文件
需要本機(jī)先裝有 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í)行打包
mvncleanpackage-Dnative
2.8 制作 docker 鏡像
直接通過 Dockerfile.native 制作 docker 鏡像:
dockerbuild
-fsrc/main/docker/Dockerfile.native
-tbolingcavalry/quarkus-web-demo:0.0.1.
執(zhí)行 docker 命令生成成功:
查看鏡像已經(jīng)生成:
通過 docker run 命令啟動(dòng)后查看容器的信息:
通過 curl -L http://172.17.0.2:8080/hello -w ' ' 也可以正常訪問。
審核編輯 :李倩
-
JAVA
+關(guān)注
關(guān)注
19文章
2970瀏覽量
104825 -
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17508 -
微服務(wù)
+關(guān)注
關(guān)注
0文章
137瀏覽量
7363
原文標(biāo)題:Java 云原生微服務(wù)框架 Quarkus 入門實(shí)踐
文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論