91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取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 的到來為開發(fā) Linux 容器和 kubernetes 原生 Java 微服務帶來了一個創(chuàng)新平臺。

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

2 SpringBoot

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

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

3 Quarkus

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

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

4 比較

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

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

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

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

測試應用

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

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

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

測試計劃

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

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

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

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

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

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

5 調查結果

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

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

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

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

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

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

CPU

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

以下是 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 版本那樣有效或頻繁地回收內存??梢酝ㄟ^調整一些參數(shù)來改善這一點,在這個比較中,我們使用了默認參數(shù),并沒有對 GC、JVM 選項或任何其他參數(shù)進行更改。

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

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出現(xiàn)了更高的峰值,但確實消耗的內存資源更少。

響應時間

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

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

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

Spring Boot JVM

盡管有更多異常值,但 Spring Boot JVM 版本隨著時間的推移取得了最好的進展,這很可能是由于 JIT 編譯器優(yōu)化 [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 在低資源利用率方面表現(xiàn)出強大的實力。然而,至少在這個實驗中,Spring Boot 在吞吐量和響應能力方面與Quarkus旗鼓相當。

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

總而言之

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

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

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

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

6 從 Spring 轉換到 Quarkus

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

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

7 我是 Spring 開發(fā)者,為什么要選Quarkus?

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

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

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

傳統(tǒng)云原生 Java 棧

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

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

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

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

運行時效率

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

Quarkus 棧

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

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

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

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

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

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

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

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

8 Spring 開發(fā)者可以活用哪些現(xiàn)有知識?

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

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

Spring 框架本質上是高度動態(tài)的。為了解決這個問題,Quarkus的Spring 兼容性擴展將 Spring API 映射到現(xiàn)有擴展中的 API,這些擴展已經(jīng)針對快速啟動、降低內存利用率和原生編譯進行了優(yōu)化,例如 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開發(fā)者有額外的好處嗎?

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

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

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

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

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

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







審核編輯:劉清

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

    關注

    2

    文章

    809

    瀏覽量

    43029
  • JAVA
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116426
  • SQL
    SQL
    +關注

    關注

    1

    文章

    789

    瀏覽量

    46700
  • 數(shù)據(jù)庫

    關注

    7

    文章

    4020

    瀏覽量

    68342
  • JVM
    JVM
    +關注

    關注

    0

    文章

    161

    瀏覽量

    13037

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    LM3080N的替代品有哪些?

    有這個芯片LM3080N的替代品沒? 幫人詢問呢。謝謝。
    發(fā)表于 09-14 08:46

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

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

    尋求Ubuntu13系統(tǒng)下軟件替代品……

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

    如何尋找芯片IS61LV51216的替代品

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

    MMBFJ176替代品??

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

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

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

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

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

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

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

    是否有TDA2003的替代品

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

    如何使用ISP1763作為替代品

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

    Commodore 6540 ROM的替代品

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

    MC908JL3ECDWE的替代品是什么?

    我正在尋找 8 位 MCU MC908JL3ECDWE 的替代品,因為不建議將其用于新設計(已過時)。為了最大限度地減少工作量,我們希望減少對 28 引腳 SOIC 封裝的替換和簡單的代碼更改
    發(fā)表于 06-05 06:17

    鈷鎳錳(三元)正極材料---鈷酸鋰的理想替代品

    鈷鎳錳(三元)正極材料---鈷酸鋰的理想替代品  鈷鎳錳(三元)正極材料---鈷酸鋰的理想替代品 產品特點
    發(fā)表于 10-29 11:59 ?2432次閱讀

    變速泵的更好電機替代品

    變速泵的更好電機替代品(視頻)
    的頭像 發(fā)表于 03-13 17:02 ?1530次閱讀
    變速泵的更好電機<b class='flag-5'>替代品</b>

    CFP – SMx封裝的高效替代品

    CFP – SMx封裝的高效替代品
    的頭像 發(fā)表于 12-05 10:58 ?1575次閱讀
    CFP – SMx封裝的高效<b class='flag-5'>替代品</b>