本文以Quarkus和Spring Boot為例,為大家分析Quarkus和Spring Boot在測試環(huán)境中誰占用內(nèi)存少且速度更快。閱讀完整文相信大家對Quarkus和Spring Boot有了一定的認(rèn)識。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了象州免費建站歡迎大家使用!
Quarkus
一套適用于GraalVM和HotSpot的開源技術(shù),可以編寫Java應(yīng)用程序。 它提供(承諾)超快速的啟動時間和更低的內(nèi)存占用。 這使其非常適合容器和無服務(wù)器工作負載。 它使用Eclipse Microprofile(JAX-RS,CDI,JSON-P)(Java EE的子集)來構(gòu)建Microservices。
GraalVM是通用的多語言虛擬機(JavaScript,Python,Ruby,R,Java,Scala,Kotlin)。 GraalVM(特別是Substrate VM)使提前(AOT)編譯成為可能,將字節(jié)碼轉(zhuǎn)換為本地機器代碼,從而產(chǎn)生可以本地執(zhí)行的二進制文件。
請記住,并非所有功能都可以在本機執(zhí)行中使用,因此AOT編譯有其局限性。 請注意這句話(引用GraalVM團隊):
我們進行的主動靜態(tài)分析需要一個封閉世界的假設(shè),這意味著在構(gòu)建時必須知道運行時可訪問的所有類和所有字節(jié)碼。
因此,例如,反射和Java本機接口(JNI)將無法使用,至少是開箱即用的(需要一些額外的工作)。 你可以在此處的Native Image Java限制''文檔中找到限制列表。
Spring Boot
Spring Boot是建立在Spring框架之上的開源框架,它提供了一種更簡單的方法來構(gòu)建,配置和運行基于Java Web的應(yīng)用程序 。 使之成為微服務(wù)的理想選擇。
準(zhǔn)備-創(chuàng)建Docker映像
夸庫斯圖像
讓我們創(chuàng)建Quarkus應(yīng)用程序,以便稍后將其包裝在Docker Image中。 基本上,我們將執(zhí)行Quarkus入門指南中的相同操作。
使用Quarkus maven原型創(chuàng)建項目:
Dockerfile
mvn io.quarkus:quarkus-maven-plugin:1.0.0.CR2:create \
DprojectGroupId=ujr.combat.quarkus \
DprojectArtifactId=quarkus-echo \
DclassName="ujr.combat.quarkus.EchoResource" \
Dpath="/echo"
這將導(dǎo)致我們的項目結(jié)構(gòu)如下:
請注意,這還創(chuàng)建了兩個示例Dockerfile(src / main / docker):一個用于普通的JVM App Image,另一個用于本機App Image。
在生成的代碼中,我們只需要更改一件事,在下面添加依賴項,因為我們要生成JSON內(nèi)容。
Dockerfile
io.quarkus
quarkus-resteasy-jsonb
在整個RESTEasy項目實施過程中,Quarkus使用JAX-RS規(guī)范。
僅此而已,使用下一條命令,我們可以看到應(yīng)用程序正在運行:
Dockerfile
mvn clean compile quarkus:dev
在這種模式下,我們還通過后臺編譯啟用了熱部署。 讓我們做一個簡單的測試來看看它:
Dockerfile
curl -sw "\n\n" http://localhost:8080/echo/ualter | jq .
現(xiàn)在我們看到它正在運行,讓我們創(chuàng)建Docker Image。
重要! 不要下載最新版本19.3.0,因為它與Quarkus 1.0不兼容,也許會與Quarkus 1.1兼容。 現(xiàn)在,應(yīng)該工作的版本是GraalVM 19.2.1,得到這個。
配置其環(huán)境變量起始路徑:
Dockerfile
GRAALVM_HOME=/Users/ualter/Developer/quarkus/graalvm-ce-java8-19.2.1/Contents/Home/
然后在你的環(huán)境中為GraalVM安裝本機映像:
Dockerfile
$GRAALVM_HOME/bin/gu install native-image
讓我們?yōu)楫?dāng)前平臺生成本機版本(在這種情況下,將為macOS生成本機可執(zhí)行文件)。
Dockerfile
mvn package -Pnative
如果一切正常,我們可以在./target文件夾中找到一個名為quarkus-echo-1.0-SNAPSHOT-runner的文件。 這是你的應(yīng)用程序的可執(zhí)行二進制文件,你可以運行以下命令來啟動它:./target/quarkus-echo-1.0-SNAPSHOT-runner。 無需使用JVM(普通的:java -cp app:lib / :etc App.jar),它是本機可執(zhí)行二進制文件。
讓我們?yōu)閼?yīng)用程序生成一個本機Docker鏡像。 該命令將創(chuàng)建一個本機映像,即帶有Linux本機可執(zhí)行應(yīng)用程序的Docker映像。 默認(rèn)情況下,本機可執(zhí)行文件是基于當(dāng)前平臺(macOS)創(chuàng)建的,因為我們知道此生成的可執(zhí)行文件與將成為容器(Linux)的平臺不是同一平臺,我們將指示Maven構(gòu)建從中生成可執(zhí)行文件 在容器內(nèi),生成本地docker鏡像:*
Dockerfile
mvn package -Pnative -Dquarkus.native.container-build=true
此時,請確保具有Docker容器運行時和可運行的環(huán)境。
該文件將是64位Linux可執(zhí)行文件,因此自然地,此二進制文件不適用于我們的macOS,它是為我們的Docker容器映像構(gòu)建的。 因此,繼續(xù)前進...讓我們繼續(xù)進行Docker映像生成...
Dockerfile
docker build -t ujr/quarkus-echo -f src/main/docker/Dockerfile.native .
docker run -i --name quarkus-echo --rm -p 8081:8081 ujr/quarkus-echo
附帶說明,關(guān)于Docker映像大?。?/p>
最終的Docker映像為115MB,但你可以使用無發(fā)行版的映像版本獲得一個很小的Docker映像。 非發(fā)行版映像僅包含你的應(yīng)用程序及其運行時相關(guān)性,其他所有項(軟件包管理器,shell或在標(biāo)準(zhǔn)Linux發(fā)行版中常見的普通程序)都將被刪除。 我們的應(yīng)用程序的Distroless映像大小為42.3MB。 文件./src/main/docker/Dockerfile.native-distroless具有產(chǎn)生它的收據(jù)。
關(guān)于Distroless Images:“將運行時容器中的內(nèi)容嚴(yán)格限制為應(yīng)用程序所需的內(nèi)容是Google和其他在容器中使用了多年的技術(shù)巨頭的最佳實踐”
Spring啟動映像
在這一點上,可能每個人都知道如何生成普通的Spring Boot Docker映像,讓我們跳過細節(jié)吧? 只是一項重要的觀察,代碼是完全相同的。 更好的說法是幾乎一樣,因為我們當(dāng)然使用的是Spring框架注釋。 那是唯一的區(qū)別。
The Battle
讓我們啟動兩個容器,使其啟動并運行幾次,然后比較啟動時間和內(nèi)存占用量。
在此過程中,每個容器被創(chuàng)建并銷毀了10次。 后來,分析了他們的啟動時間及其內(nèi)存占用量。 下面顯示的數(shù)字是基于所有這些測試的平均結(jié)果。
啟動時間
顯然,當(dāng)與可伸縮性和無服務(wù)器架構(gòu)相關(guān)時,這方面可能會發(fā)揮重要作用。
關(guān)于無服務(wù)器架構(gòu),在此模型中,通常,臨時容器將由事件觸發(fā)以執(zhí)行任務(wù)/功能。 在云環(huán)境中,價格通?;趫?zhí)行次數(shù)而不是先前購買的某些計算能力。 因此,此處的冷啟動可能會影響此類解決方案,因為容器(通常)僅在執(zhí)行任務(wù)時才處于活動狀態(tài)。
在“可伸縮性”中,很明顯,如果有必要突然進行橫向擴展,則啟動時間將定義直到容器完全準(zhǔn)備就緒(啟動并運行)以響應(yīng)所提出的加載方案之前所花費的時間。
這種情況(需要且快速)突然增加了多少,長時間的冷啟動情況可能更糟。
讓我們看看它們在啟動時間方面的表現(xiàn):
好吧,你可能已經(jīng)注意到,它是在啟動時間圖中插入的另一項經(jīng)過測試的選項。 實際上,它與Quarkus應(yīng)用程序完全相同,但是是使用JVM Docker Image(使用Dockerfile.jvm)生成的。 如我們所見,甚至使用Docker鏡像和JVM Quarkus應(yīng)用程序的應(yīng)用程序的啟動時間也比Spring Boot快。
不用說,顯然是獲勝者Quarkus Native應(yīng)用程序,它是迄今為止所有人中啟動速度最快的應(yīng)用程序。
內(nèi)存占用
現(xiàn)在,讓我們檢查一下內(nèi)存如何運行。 檢查每個容器應(yīng)用程序在開始時需要消耗多少內(nèi)存,以使其自身啟動并運行,以準(zhǔn)備接收請求。
結(jié)論
總結(jié)一下所有事情,這就是我們在Linux Ubuntu中查看結(jié)果的結(jié)果:
看來Quarkus贏得了這兩輪比賽(啟動時間和內(nèi)存占用),以明顯的優(yōu)勢戰(zhàn)勝了對手SpringBoot。
這可能使我們感到疑惑……也許是時候考慮一些真正的實驗室,經(jīng)驗以及對Quarkus的一些嘗試了。 我們應(yīng)該了解它在現(xiàn)實生活中的表現(xiàn),它如何適合我們的業(yè)務(wù)場景以及最有用的東西。
但是,讓我們不要忘記其弊端,因為我們已經(jīng)在上面看到了JVM的某些功能在本機可執(zhí)行二進制文件中無法(尚未/輕松)運行。
綜上所述,Quarkus和Spring Boot各有各的優(yōu)缺點,具體使用還要根據(jù)自己情況選擇其中一種,如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。