<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Quarkus是SpringBoot的替代品嗎?

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-11-10 10:01 ? 次閱讀

1 概述

SpringBoot框架不用多介紹,Java程序員想必都知道。相對來說熟悉Quarkus的人可能會少一些。Quarkus首頁放出的標語:超音速亞原子的Java(Supersonic Subatomic Java)。

它是為 OpenJDK HotSpot 和 GraalVM 量身定制的 Kubernetes Native Java 框架,基于同類最佳的 Java 庫和標準制作而成。Quarkus 的到來為開發 Linux 容器和 kubernetes 原生 Java 微服務帶來了一個創新平臺。

在本文中,我們將對這兩個 Java 框架 Spring Boot 和 Quarkus 進行簡單的比較。我們可以更好地了解它們之間的異同,以及一些特殊性。我們還會執行一些測試來衡量它們的性能。最后,我們會介紹一個開發人員如何從Spring轉換到Quarkus。

2 SpringBoot

Spring Boot 是一個基于 Java 的框架,專注于企業應用。它可以簡單使用所有 Spring 項目,并集成了許多開箱即用的功能,來幫助開發人員提高生產力。

Spring Boot減少了配置和樣板代碼的數量。此外,由于其約定優于配置 方法,它根據依賴項自動注冊默認配置,大大縮短了 Java 應用程序的開發周期。

3 Quarkus

Quarkus 是另一個采用與上述 Spring Boot 類似方法的框架,但還有一個額外的優點,即以更快的啟動時間、更好的資源利用率和效率交付更小的工件 (Supersonic、Subatomic)。

它針對云、無服務器和容器化環境進行了優化。盡管側重點略有不同, Quarkus 也能與最流行的 Java 框架很好地集成。

4 比較

如上所述,這兩個框架都與其他項目和框架有很好的集成。但是,它們的內部實現和架構是不同的。例如,Spring Boot 提供兩種類型的 Web 功能:阻塞(Servlets)和非阻塞(WebFlux) 。

另一方面,Quarkus 也提供這兩種方法,但與 Spring Boot 不同的是,它允許我們同時使用 阻塞和非阻塞方法。此外,Quarkus 在其架構中嵌入了反應式 編程方法。

為了在我們的比較中獲得更準確的數據,我們將使用兩個完全響應式的應用程序,這些應用程序使用 Spring WebFlux 和 Quarkus 響應式功能實現。

此外,Quarkus 項目中最重要的功能之一是能夠創建原生鏡像(Native Images,基于特定平臺的可執行二進制文件)。因此,我們還將在比較中包含兩個原生映像,但 Spring 的原生鏡像支持仍處于試驗階段。另外我們需要用到 GraalVM。

測試應用

我們的應用程序將實現三個 API:一個允許用戶創建郵政編碼,另一個用于查找特定郵政編碼的信息,最后按城市查詢郵政編碼。這些 API 是使用了前面提到的 Spring Boot 和 Quarkus 的反應式方法實現的,數據庫使用的是PostgreSQL。

我們的目標是創建一個比 HelloWorld 程序稍微復雜一些的樣例程序。當然,數據庫驅動和序列化框架等內容的實現會影響我們的比較結果。但是,大多數應用程序可能都會需要處理這些事情。

因此,比較的目的并不是為了證明哪個框架更好或更高效,而是分析研究這些特定實現的一個案例。

測試計劃

為了測試這兩種實現,我們將使用 JMeter 執行測試,并分析其測試報告。此外,我們將使用 VisualVM 在執行測試期間監控應用程序的資源利用率。

測試將運行 5 分鐘,會調用所有 API,從預熱期開始,然后增加并發用戶數,直到達到 1,500。我們將在前幾秒鐘開始填充數據庫,然后開始查詢,如下所示:

96ae35ac-7f69-11ee-939d-92fbcf53809c.jpg96ba23f8-7f69-11ee-939d-92fbcf53809c.jpg

所有測試均在以下規格的機器上進行:

96c6277a-7f69-11ee-939d-92fbcf53809c.jpg

由于缺乏與其他后臺進程的隔離,最終結果可能不太理想,但正如前面提到的,我們無意對這兩個框架的性能進行廣泛而詳細的分析。

5 調查結果

對開發人員來說,這兩個項目的體驗都很棒,但值得一提的是 Spring Boot 有更好的文檔,在網上也可以找到更多資料。Quarkus 在這方面正在改進,但仍然有點落后。

在指標方面,我們有如下結果:

96d1758a-7f69-11ee-939d-92fbcf53809c.jpg

通過這個實驗,我們可以觀察到 Quarkus 在 JVM 和原生版本的啟動時間方面幾乎比 Spring Boot 快一倍 。構建時間也快得多。在原生鏡像的情況下,構建耗時:9 分鐘(Quarkus)對 13 分鐘(Spring Boot),JVM 構建耗時:20 秒(Quarkus)對 39 秒(Spring Boot)。

Artifact(工件)的大小出現了同樣的情況,Quarkus 生成了更小的工件而再次領先。原生映像:75MB (Quarkus) 對 109MB (Spring Boot),以及JVM 版本:4KB (Quarkus) 對 26MB (Spring Boot)。

關于其他指標,結論并不是那么顯而易見。因此,我們需要更深入地了解一下。

CPU

我們看到 JVM 版本在預熱階段開始時消耗更多的 CPU 。之后CPU使用率趨于穩定,所有版本的消耗相對均等。

以下是 JVM 和 Native 版本中 Quarkus 的 CPU 消耗:

96db357a-7f69-11ee-939d-92fbcf53809c.jpg

JVM 版的 Quarkus

96ee95d4-7f69-11ee-939d-92fbcf53809c.jpg

Native 版的 Quarkus

內存

內存就更復雜了。首先,很明顯,兩個框架的 JVM 版本都為Heap(堆)預留了更多內存 。盡管如此,Quarkus 從一開始就預留了較少的內存 ,啟動期間的內存利用率也是如此。

然后,查看測試期間的利用率,我們可以觀察到Native版本似乎不像 JVM 版本那樣有效或頻繁地回收內存??梢酝ㄟ^調整一些參數來改善這一點,在這個比較中,我們使用了默認參數,并沒有對 GC、JVM 選項或任何其他參數進行更改。

讓我們看一下內存使用圖:

96f2c2c6-7f69-11ee-939d-92fbcf53809c.jpg

Spring Boot JVM

970066b0-7f69-11ee-939d-92fbcf53809c.jpg

Quarkus JVM

970ab372-7f69-11ee-939d-92fbcf53809c.jpg

Spring Boot 原生

971b516e-7f69-11ee-939d-92fbcf53809c.jpg

Quarkus 原生

在測試期間盡管Quarkus出現了更高的峰值,但確實消耗的內存資源更少。

響應時間

最后,關于響應時間和峰值使用的線程數,Spring Boot 似乎略微具有優勢 。它能夠使用更少的線程處理相同的負載,同時還具有更好的響應時間。

Spring Boot Native 版本在這種情況下表現出更好的性能。但是讓我們看看每個版本的響應時間分布:

97283276-7f69-11ee-939d-92fbcf53809c.jpg

Spring Boot JVM

盡管有更多異常值,但 Spring Boot JVM 版本隨著時間的推移取得了最好的進展,這很可能是由于 JIT 編譯器優化 [1]。

9732ce34-7f69-11ee-939d-92fbcf53809c.jpg

Quarkus JVM

97482c48-7f69-11ee-939d-92fbcf53809c.jpg

Spring Boot 原生

9754a6ee-7f69-11ee-939d-92fbcf53809c.jpg

Quarkus 原生

Quarkus 在低資源利用率方面表現出強大的實力。然而,至少在這個實驗中,Spring Boot 在吞吐量和響應能力方面與Quarkus旗鼓相當。

這兩個框架都能夠處理所有請求而沒有任何錯誤。不僅如此,他們的表現也十分相似,并沒有太大的差距。

總而言之

考慮到所有因素,在實現 Java 應用程序時,這兩個框架都是很好的選擇。

Native程序速度快且資源消耗低,是無服務器、短期(short-living)應用和資源消耗敏感環境的絕佳選擇。

另一方面,JVM 應用程序似乎有更多的開銷,但隨著時間的推移具有出色的穩定性和高吞吐量,非常適合健壯、長壽命的應用程序。

測試程序的代碼和用于測試它們的腳本可以在 GitHub 上找到 [2]。

6 從 Spring 轉換到 Quarkus

隨著K8s的興起,對原生應用支持良好的Quarkus框架也越來越受到關注很多開發人員在考慮從 Spring 轉換到 Quarkus。然而,開發人員在開始評估新的框架時通常必須擱置他們現有的知識。

幸運的是, Quarkus 不一樣,因為它是由一群在 Java 技術方面具有深厚專業知識的工程師創建的。這包括 Spring API 兼容性,創建Quarkus的工程師同時也是在 Red Hat Runtime 上為 Spring Boot 提供支持的工程師。

7 我是 Spring 開發者,為什么要選Quarkus?

越來越明顯的是,容器化,尤其是 Kubernetes,正在迫使人們重新評估 Java ,用于開發云原生應用程序。Kubernetes 是一種高度動態的共享基礎設施。由于集群中托管的應用程序數量的增長以及對應用程序生命周期變化的響應能力的提高(例如重新部署和向上/向下擴展),基礎設施的投入變得更加劃算。

傳統的 Java 云原生運行時在現有的棧上增加了新的分層,而沒有真正重新考慮底層。這導致更大的內存消耗和更慢的啟動時間,以至于現在很多公司為了從 Kubernetes 集群的大量投資中獲得更多價值,愿意放棄他們深厚的 Java 專業知識,為 Go 和 Node.js 重新培養人才和開發工具。

9761ecdc-7f69-11ee-939d-92fbcf53809c.jpg

傳統云原生 Java 棧

這正是 Quarkus 解決的問題。Quarkus 針對內存使用率和快速啟動時間進行了優化。與其他云原生 Java 棧相比,在 JVM 上運行的 Quarkus 應用可以在相同數量的RAM中提供近兩倍的應用程序實例,并且當打包為原生二進制文件時,實例數量增加了 7 倍。

這不僅僅是使用 SubstrateVM [3](GraalVM 的一個特性)簡單地編譯為原生二進制文件。

Quarkus 專為 Kubernetes 的基礎設施優化了傳統的 “高度動態”框架 ,從而降低了內存利用率并加快了初始啟動速度,結果是運行時效率的顯著提高。這些經過優化且文檔齊全的框架稱為“擴展 ”,由同類最佳的標準 API 組成。

976d0662-7f69-11ee-939d-92fbcf53809c.jpg

運行時效率

977a3b52-7f69-11ee-939d-92fbcf53809c.jpg

Quarkus 棧

我司為什么要從 Spring Boot 遷移到 Quarkus?

以我們公司為例,我司的舊系統基于 Spring 和 Tomcat。當我們維護和部署時,這個傳統的框架給我們帶來了一些困擾,基于以下原因我們決定遷移到Quarkus:

內存和 CPU 消耗:對于正在執行的操作,Spring 和 Tomcat 框架在應用的主要目的之外使用了過多的資源。

預熱時間:Spring 應用程序可能需要 10-20 秒的時間才能啟動,之后應用程序才可以開始預熱。

無用的代碼:作為開發人員,我們都討厭樣板代碼(boilerplate code)。

測試:Quarkus 讓編寫單元測試和集成測試變得非常容易。只需在那里打一個@QuarkusTest 注釋,它實際上會啟動整個應用程序以運行您的測試。

橫向擴展(Scale-out) vs. 縱向擴展(Scale-up):每個應用程序越?。ㄙY源方面),我們可以添加的越多。在這里橫向可擴展性勝出。

學習曲線:Quarkus 的在線文檔非常簡單易懂。

8 Spring 開發者可以活用哪些現有知識?

Quarkus 的 Spring API 兼容性包括 Spring DI、Spring Web 和 Spring Data JPA。同時也在計劃其他 Spring API,如 Spring Security 和 Spring Config。在 JVM 上運行時,Quarkus 應用程序幾乎可以利用任何 Java 庫。只要不使用 Java 反射 ,這些Java庫就可以編譯為原生。

例如,受 Spring 開發人員歡迎的 Lombok 庫就可以原生編譯。需要明確的是,Quarkus 中的 Spring API 兼容性并非為了作為一個完整的 Spring 平臺來重新托管現有的 Spring 應用程序。目的是為了讓基于 Quarkus 開發新應用程序成為一種自然的入門體驗。結合預先優化的擴展 ,Quarkus 為微服務開發提供了大量的功能。很多開發人員已成功將 Spring 應用程序遷移到 Quarkus。

Spring 框架本質上是高度動態的。為了解決這個問題,Quarkus的Spring 兼容性擴展將 Spring API 映射到現有擴展中的 API,這些擴展已經針對快速啟動、降低內存利用率和原生編譯進行了優化,例如 RestEasy 和 CDI。此外,Quarkus的Spring 兼容性擴展不使用 Spring 應用程序上下文。由于這些原因,嘗試使用額外的 Spring 庫可能不會奏效。

Quarkus Spring Web Example

importjava.util.List;
importjava.util.Optional;
importorg.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/person")
publicclassPersonController{
@GetMapping(path="/greet/{id}",produces="text/plain")
publicStringgreetPerson(@PathVariable(name="id")longid){
Stringname="";
//...
returnname;
}

@GetMapping(produces="application/json")
publicIterablefindAll(){
returnpersonRepository.findAll();
}

Quarkus Spring Repository Example

packageorg.acme.springmp;

importjava.util.List;
importorg.springframework.data.repository.CrudRepository;

publicinterfacePersonRepositoryextendsCrudRepository{
ListfindByAge(intage);
}

Quarkus Spring Service + MicroProfile Fault Tolerance Example

importorg.eclipse.microprofile.faulttolerance.Fallback;
importorg.eclipse.microprofile.faulttolerance.Timeout;
importorg.eclipse.microprofile.rest.client.inject.RestClient;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.stereotype.Service;

@Service//Spring
publicclassPersonService{

@Autowired//Spring
@RestClient//MicroProfile
SalutationMicroProfileRestClientsalutationRestClient;

@Value("${fallbackSalutation}")//Spring
StringfallbackSalutation;

@CircuitBreaker(delay=5000,failureRatio=.5)//MicroProfile
@Fallback(fallbackMethod="salutationFallback")//MicroProfile
publicStringgetSalutation(){
returnsalutationRestClient.getSalutation();
}

9 對Spring開發者有額外的好處嗎?

除了提高內存利用率和啟動時間外,Quarkus 還為 Spring 開發人員提供了以下好處:

功能即服務 (FaaS) 。當編譯為原生二進制文件時,Quarkus 應用程序可以在 0.0015 秒內啟動,從而可以將現有的 Spring 和 Java API 知識與 FaaS 功能結合使用。(Azure、AWS Lambda)

實時編碼 。從“Hello World”示例應用程序開始,然后將其轉換為復雜的微服務,而無需重新啟動應用程序。只需保存并重新加載瀏覽器即可查看沿途的變化。Quarkus 實時編碼“開箱即用”,與 IDE 無關。

支持反應式和命令式模型。 Quarkus 有一個反應式核心,支持傳統的命令式模型、反應式模型,或在同一應用程序中同時支持兩者。

早期檢測依賴注入錯誤。 Quarkus 在編譯期間而不是在運行時捕獲依賴項注入錯誤。

最佳框架和標準的結合 。Quarkus 在同一應用程序中支持 Spring API 兼容性、Eclipse Vert.x、MicroProfile(JAX-RS、CDI 等)、反應式流和消息傳遞等,可以在一個項目中同時使用 Spring 和 MicroProfile API。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    719

    瀏覽量

    41317
  • JAVA
    +關注

    關注

    19

    文章

    2909

    瀏覽量

    103203
  • SQL
    SQL
    +關注

    關注

    1

    文章

    740

    瀏覽量

    43530
  • 數據庫
    +關注

    關注

    7

    文章

    3618

    瀏覽量

    63639
  • JVM
    JVM
    +關注

    關注

    0

    文章

    152

    瀏覽量

    12139

原文標題:微服務框架之爭:Quarkus 是 SpringBoot 的替代品嗎?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    尋找松下TX2-12V的替代品

    松下的效益不行了,要搬場,繼電器要漲價,求替代品。哪位大俠可以幫助一下。謝謝。原來用的型號是TX2-12V。附件中是他的數據手冊。
    發表于 11-17 11:42

    尋求Ubuntu13系統下軟件替代品……

    下的kile軟件的替代品是什么?我在ubuntu軟件中心找到了一個kile,但是安裝后總感覺什么都沒有,模板也找不到,完全不會用,球大神給講解下……還有,Visual Studio的替代品,做fpga
    發表于 10-26 10:06

    如何尋找芯片IS61LV51216的替代品

    貼片,44腳的IS61LV51216是一個8M容量,結構為512K*16位字長的高速率SRAM,它的替代品有?碼庫網上沒查到呀?怎么去找呢?
    發表于 05-17 17:34

    MMBFJ176替代品??

    如題,需要尋找一個MMBFJ176替代品,用于保證電化學檢測器在斷電的情況下兩端電位不會偏差太大。附件為MMBFJ176規格書,望大神回復下,謝謝!
    發表于 07-21 08:33

    IF增益可控放大IC,即MC1350的替代品

    MC1350是MOTO的IF AMPLIFIER,中頻增益自動控制(AGC)芯片,但現在MOTO已經停產了,故本人想找它的替代品或升級版,據說MOTO 把MC1350授權給LANSDALE公司生產了(產品為ML1350),但價格翻了好幾倍,接受不了,不知有沒有知道替代品?
    發表于 08-22 14:10

    請問儀表放大器AD624有沒有便宜的完全兼容的替代品?

    儀表放大器AD624有沒有便宜的完全兼容的替代品?市場上這個芯片有點貴,還不太好買到,想找兼容替代品,性能稍低點也可以,能滿足要求就行,求大神推薦,謝謝。
    發表于 01-23 09:27

    電解電容廉價替代方案(尋找紅寶石電容替代品

    大家好公司boss讓我論證一下紅寶石電解電容的替代,主要是為了降低成本。請問這個器件有合適的替代品么,要做一些必要的驗證么?多謝
    發表于 04-27 08:30

    是否有TDA2003的替代品

    是否有TDA2003的替代品,或者任何人都可以推薦類似的音頻放大器,可以驅動低至1歐姆的負載? #TDA2003
    發表于 08-05 10:19

    如何使用ISP1763作為替代品?

    已經過時,ST-Ericson提供的下一個系列是ISP1763。 ISP1760采用128引腳配置,具有16地址線和32數據線。但新的ISP1763只是64引腳,有8個地址和32個數據引腳。我們如何使用ISP1763作為替代品?這有什么替代方案嗎?-謝謝
    發表于 09-04 07:00

    【資料分享】PISTORM for COMMODORE AMIGA(68000 CPU 替代品

    描述PISTORM for COMMODORE AMIGA(68000 CPU 替代品)4層PCB 項目信息: PiStorm 本身是一個適配器板,旨在與 Raspberry Pi Model
    發表于 06-17 09:41

    Commodore 6540 ROM的替代品

    的 6540 ROM 芯片組的直接替代品。我發現 D'Asaro 項目非常好且緊湊,但更難構建。此外,他僅以 PCBexpress 格式發布該項目,無法將其導出到 Gerber。由于
    發表于 09-02 07:26

    有沒有制作LIS2DH12TR這個內存的替代品?

    有沒有制作LIS2DH12TR這個內存的替代品?
    發表于 12-06 07:29

    請問有L6376PD的直接替代品嗎?

    有L6376PD的直接替代品
    發表于 12-26 10:02

    請問一下有stm32f429iit6的替代品嗎?

    有stm32f429iit6的替代品嗎?
    發表于 01-05 06:20

    MC908JL3ECDWE的替代品是什么?

    我正在尋找 8 位 MCU MC908JL3ECDWE 的替代品,因為不建議將其用于新設計(已過時)。為了最大限度地減少工作量,我們希望減少對 28 引腳 SOIC 封裝的替換和簡單的代碼更改
    發表于 06-05 06:17
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>