微服務之爭,Quarkus還是Spring Boot

在容器時代(Docker時代),Java仍然保持著活力,但是這一切都在悄悄的改變中,那麼下一場技術變革中,誰會一馬當先,是Spring Boot還是 Quarkus?


微服務之爭,Quarkus還是Spring Boot

下面讓我們在兩個用JAVA生成微服務的兩個技術架構進行一個對比

1.非常出名的SpringBoot

2.不太出名的Quarkus

介紹:

什麼是Quarkus?


微服務之爭,Quarkus還是Spring Boot


一套適用於GraalVM和HotSpot來編寫Java應用程序的開源技術。它提供(承諾)超快速的啟動時間和更低的內存佔用。這使其非常適合容器和無服務器工作負載。它使用Eclipse Microprofile(JAX-RS,CDI,JSON-P)(Java EE的子集)來構建微服務。

GraalVM是通用的多語言虛擬機(JavaScript,Python,Ruby,R,Java,Scala和Kotlin)。GraalVM (特別是Substrate VM)使提前(AOT)編譯成為可能,將字節碼轉換為本地機器代碼,從而產生可以本地執行的二進制文件

請記住,並非所有功能都可以在本機執行中使用,因此AOT編譯有其侷限性。請注意這句話(來自GraalVM團隊):

我們進行的主動靜態分析需要一個特定的封閉世界,這意味著在構建時必須知道運行時可訪問的所有類和所有字節碼。

因此,例如,反射和Java本機接口(JNI)將不起作用,至少需要是開箱即用(這要一些額外的工作)。我們可以在本機映像Java限制文檔中找到限制列表。

什麼是SpringBoot?

這裡只用一句話概括

Spring Boot是建立在Spring框架之上的開源框架,它提供了一種更簡單的方法來構建,配置和運行基於Java Web的應用程序。使之成為微服務的理想選擇。

開始比較之前,我們需要做一些準備-創建Docker鏡像

Quarkus鏡像

讓我們先創建一個Quarkus程序,稍後我們會把它寫入Docker鏡像中,基本上,按照Quarkus官方教程做就OK了。


1

<code>mvn io.quarkus:quarkus-maven-plugin:1.0.0.CR2:create \ /<code>

2

<code>    -DprojectGroupId=ujr.combat.quarkus \  /<code>

3

<code>    -DprojectArtifactId=quarkus-echo \ /<code>

4

<code>    -DclassName="ujr.combat.quarkus.EchoResource" \/<code>

5

<code>    -Dpath="/echo"/<code>

在創建了文件目錄後,我們創建了兩個Dockerfile(src/main/docker):一個用於普通的JVM應用程序鏡像,另一個用於本機應用程序鏡像。

在生成代碼的過程中,我們僅僅需要做的就是添加下面的MAVEN依賴,讓我們可以添加JSON內容依賴。

Dockerfile

<code> 
  io.quarkusquarkus-resteasy-jsonb 4/<code>

Quarkus在RESTEasy項目實現中使用JAX-RS規範,我們使用下一個命令,就可以運行我們的程序:

<code>mvn clean compile quarkus:dev/<code>

在這種模式中,我還是還可以啟動熱部署,使用下面的命令

Dockerfile

<code>1curl -sw "\n\n" http://localhost:8080/echo/ualter | jq ./<code>

下面我們創建Docker鏡像

這裡下載最新的GraalVM:https://github.com/GraalVM/GraalVM-ce-builds/releases

重要!不要下載最新版本19.3.0

,它與Quarkus 1.0不兼容,也許Quarkus 1.1會兼容。現在應該可以工作的版本是GraalVM 19.2.1,下面。

配置其環境變量home path:

Dockerfile

<code>
1## At macOS will be: export 
2GRAALVM_HOME=/Users/ualter/Developer/quarkus/graalvm-ce-java8-19.2.1/Contents/Home//<code>

然後會在我們的環境中安裝Native的GraalVM虛擬鏡像

Dockerfile

<code>$GRAALVM_HOME/bin/gu install native-image/<code>

下面為當前平臺生成native版本(在本例中,將為macOS生成本機可執行文件)。

Dockerfile

<code>mvn package -Pnative/<code>


如果一切正常,我們可以在./target文件夾中找到名為quarkus-echo-1.0-SNAPSHOT-runner的文件。這是應用程序的可執行二進制文件,您可以運行以下命令啟動它:./target/quarkus-echo-1.0-SNAPSHOT-runner。不需要使用JVM(普通的:java-cp app:lib/*:etc app.jar),它是一個本機可執行二進制文件。

讓我們為我們的應用程序生成一個本地Docker映像。此命令將創建本機映像,即帶有Linux本機可執行應用程序的Docker映像。默認情況下,本機可執行文件是基於當前平臺(macOS)創建的,因為我們知道這個可執行文件與容器(Linux)的平臺不同,我們將指示Maven build從容器內部生成可執行文件,生成本機docker映像:

Dockerfile

<code>mvn package -Pnative -Dquarkus.native.container-build=true/<code>

這時候,我們已經有了一個Docker容器在運行,一個程序執行的環境。

這個文件將是一個64位的Linux可執行文件,所以很自然,這個二進制文件不會在我們的macOS上運行,它是為我們的docker容器映像構建的,下面我們來使用這個文件

Dockerfile

<code>1docker build -t ujr/quarkus-echo -f src/main/docker/Dockerfile.native . 
2  ## Testing it... 
3  docker run -i --name quarkus-echo --rm -p 8081:8081 ujr/quarkus-echo/<code>

額外說明:

最終的docker鏡像是115MB,但是可以使用無發行版的鏡像版本創建一個小的docker鏡像。無發行版鏡像只包含應用程序及其運行時依賴項,其他所有內容(包管理器、shell或標準Linux發行版中常見的普通程序)都將被刪除。我們應用程序的不可分發鏡像大小為42.3MB。文件./src/main/docker/docker file.native-distroless具有生成該文件的收據。

關於不受歡迎的鏡像:“將運行時容器中的內容限制為應用程序所需的內容是谷歌和其他技術巨頭多年來在生產中使用容器的最佳實踐。”

Spring Boot鏡像

怎麼生成這個鏡像,這裡就不多說了,大家自己去Spring.IO上面去看下。


Dockerfile

<code>1mvn install dockerfile:build 
2## Testing it...
3  docker run --name springboot-echo --rm -p 8082:8082 ujr/springboot-echo/<code>

下面是比較


微服務之爭,Quarkus還是Spring Boot

讓我們啟動兩個容器,啟動它們並運行幾次,然後比較啟動時間和內存佔用。

在這個過程中,每個容器都被創建和銷燬了10次。隨後,分析了它們的啟動時間和內存佔用。下面顯示的數字是基於所有這些測試的平均結果。

啟動時間

當涉及到可伸縮性和無服務器體系結構時,啟動時間可能會發揮重要作用。

關於無服務器架構,在這個模型中,通常事件會觸發一個臨時容器來執行任務/功能。在雲環境中,價格通常基於執行的次數,而不是以前購買的一些計算容量。因此,這裡冷啟動可能會影響這類解決方案,因為容器(通常)只有在執行其任務時才是活動的。

在可伸縮性方面,很明顯,如果需要突然向外擴展,那麼啟動時間將定義容器完全準備好(啟動並運行)響應所呈現的加載場景所需的時間。

這是多麼突然的情況(需要和快速),更糟糕的情況可能是長期冷啟動。

讓我們看看他們在啟動時間方面的表現:


微服務之爭,Quarkus還是Spring Boot

我們在這裡,在程序啟動的時間就已經開始了下一個測試的啟動,實際上,它是同一個Quarkus程序由一個JVM Docker鏡像生成,

即使是使用Docker映像和JVM的應用程序,Quarkus應用程序的啟動時間也比Spring Boot快。

顯然Quarkus是勝利者,Quarkus本機應用程序迄今為止啟動最快的。

內存佔用

現在,讓我們檢查一下內存的情況。檢查每個容器應用程序在啟動時需要消耗多少內存,以便啟動和運行,準備接收請求。


微服務之爭,Quarkus還是Spring Boot


結論:

總結一下,這就是我們在Linux Ubuntu中看到的結果:


微服務之爭,Quarkus還是Spring Boot

Quarkus似乎贏得了這兩輪比賽(啟動時間和內存佔用),以明顯的優勢戰勝了對手SpringBoot。

但是我們可以看到的是Quarkus在技術生態和架構生態上還是不夠完善的,但是i如果冷啟動等問題困擾你,或許可以嘗試一下Quarkus。

如果喜歡我的文章,麻煩點個關注唄。


分享到:


相關文章: