<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          微服務(wù)框架之爭:Quarkus 是 SpringBoot 的替代品嗎?

          共 13082字,需瀏覽 27分鐘

           ·

          2023-11-10 17:37

          胖虎和朋友原創(chuàng)的視頻教程有興趣的可以看看


          (文末附課程大綱)


          ??2024 最新,Java成神之路,架構(gòu)視頻(點擊查看)


          ??超全技術(shù)棧的Java入門+進(jìn)階+實戰(zhàn)!(點擊查看)

          1概述

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

          它是為 OpenJDK HotSpot 和 GraalVM 量身定制的 Kubernetes Native Java 框架,基于同類最佳的 Java 庫和標(biāo)準(zhǔn)制作而成。Quarkus 的到來為開發(fā) Linux 容器和 kubernetes 原生 Java 微服務(wù)帶來了一個創(chuàng)新平臺。

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

          2SpringBoot

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

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

          3Quarkus

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

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

          4比較

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

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

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

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

          2024最新架構(gòu)課程,對標(biāo)培訓(xùn)機(jī)構(gòu)

          ??點擊查看:Java成神之路-進(jìn)階架構(gòu)視頻!

          測試應(yīng)用

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

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

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

          測試計劃

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

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

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

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

          5調(diào)查結(jié)果

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

          在指標(biāo)方面,我們有如下結(jié)果:

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

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

          關(guān)于其他指標(biāo),結(jié)論并不是那么顯而易見。因此,我們需要更深入地了解一下。

          CPU

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

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

          JVM 版的 Quarkus ↑↑↑
          Native 版的 Quarkus ↑↑↑

          內(nèi)存

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

          然后,查看測試期間的利用率,我們可以觀察到Native版本似乎不像 JVM 版本那樣有效或頻繁地回收內(nèi)存。可以通過調(diào)整一些參數(shù)來改善這一點,在這個比較中,我們使用了默認(rèn)參數(shù),并沒有對 GC、JVM 選項或任何其他參數(shù)進(jìn)行更改。

          讓我們看一下內(nèi)存使用圖:

          Spring Boot JVM ↑↑↑
          Quarkus JVM ↑↑↑
          Spring Boot 原生 ↑↑↑
          Quarkus 原生 ↑↑↑

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

          響應(yīng)時間

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

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

          Spring Boot JVM ↑↑↑

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

          Quarkus JVM ↑↑↑
          Spring Boot 原生 ↑↑↑
          Quarkus 原生 ↑↑↑

          Quarkus 在低資源利用率方面表現(xiàn)出強(qiáng)大的實力。然而,至少在這個實驗中,Spring Boot 在吞吐量和響應(yīng)能力方面與Quarkus旗鼓相當(dāng)。

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

          總而言之

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

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

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

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

          6從 Spring 轉(zhuǎn)換到 Quarkus

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

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

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

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

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

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

          這正是 Quarkus 解決的問題。Quarkus 針對內(nèi)存使用率和快速啟動時間進(jìn)行了優(yōu)化。與其他云原生 Java 棧相比,在 JVM 上運行的 Quarkus 應(yīng)用可以在相同數(shù)量的RAM中提供近兩倍的應(yīng)用程序?qū)嵗⑶耶?dāng)打包為原生二進(jìn)制文件時,實例數(shù)量增加了 7 倍。

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

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

          運行時效率  ↑↑↑
          Quarkus 棧 ↑↑↑

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

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

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

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

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

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

          • 橫向擴(kuò)展(Scale-out) vs. 縱向擴(kuò)展(Scale-up):每個應(yīng)用程序越小(資源方面),我們可以添加的越多。在這里橫向可擴(kuò)展性勝出。

          • 學(xué)習(xí)曲線:Quarkus 的在線文檔非常簡單易懂。

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

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

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

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

          Quarkus Spring Web Example

          import java.util.List;
          import java.util.Optional;
          import org.springframework.web.bind.annotation.*;

          @RestController
          @RequestMapping("/person")
          public class PersonController {
              @GetMapping(path = "/greet/{id}", produces = "text/plain")
              public String greetPerson(@PathVariable(name = "id") long id) {
                  String name="";
                  // ...
                  return name;
              }

              @GetMapping(produces = "application/json")
              public Iterable<Person> findAll() {
                  return personRepository.findAll();
              }

          Quarkus Spring Repository Example

          package org.acme.springmp;

          import java.util.List;
          import org.springframework.data.repository.CrudRepository;

          public interface PersonRepository extends CrudRepository<PersonLong{
              List<Person> findByAge(int age);
          }

          Quarkus Spring Service + MicroProfile Fault Tolerance Example

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

          @Service                                            // Spring
          public class PersonService {

              @Autowired                                      // Spring
              @RestClient                                     // MicroProfile
              SalutationMicroProfileRestClient salutationRestClient;

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

              @CircuitBreaker(delay=5000, failureRatio=.5)    // MicroProfile
              @Fallback(fallbackMethod = "salutationFallback")// MicroProfile
              public String getSalutation() {
                  return salutationRestClient.getSalutation();
              }

          9對Spring開發(fā)者有額外的好處嗎?

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

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

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

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

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

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

          10Spring開發(fā)者如何開始學(xué)習(xí)Quarkus?

          推薦的步驟包括:

          • 參看入門指南[4]作為 Quarkus 的一般介紹。

          • 參看 Spring DI[5]Spring Web[6] 和 Spring Data JPA[7] 的指南。

          • 使用 code.quarkus.io[8] 創(chuàng)建一個新應(yīng)用。

          參考資料

          [1]

          JIT 編譯器優(yōu)化: https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit.html

          [2]

          在 GitHub 上找到: https://github.com/eugenp/tutorials/tree/master/quarkus-vs-springboot

          [3]

          SubstrateVM: https://github.com/oracle/graal/tree/master/substratevm

          [4]

          入門指南: https://quarkus.io/get-started/

          [5]

          Spring DI: https://quarkus.io/guides/spring-di-guide

          [6]

          Spring Web: https://quarkus.io/guides/spring-web-guide

          [7]

          Spring Data JPA: https://quarkus.io/guides/spring-data-jpa-guide

          [8]

          code.quarkus.io: https://code.quarkus.io/

          [9]

          https://www.baeldung.com/spring-boot-vs-quarkus: https://www.baeldung.com/spring-boot-vs-quarkus

          [10]

          https://quarkus.io/blog/quarkus-for-spring-developers/: https://quarkus.io/blog/quarkus-for-spring-developers/

          [11]

          https://www.logicmonitor.com/blog/quarkus-vs-spring: https://www.logicmonitor.com/blog/quarkus-vs-spring

          來源:juejin.cn/post/7023317351563001886

          END



               
               

          胖虎聯(lián)合兩位大佬朋友,一位是知名培訓(xùn)機(jī)構(gòu)講師和科大訊飛架構(gòu),聯(lián)合打造了《Java架構(gòu)師成長之路》的視頻教程。完全對標(biāo)外面2萬左右的培訓(xùn)課程。

          除了基本的視頻教程之外,還提供了超詳細(xì)的課堂筆記,以及源碼等資料包..


          課程階段:

          1. Java核心 提升閱讀源碼的內(nèi)功心法
          2. 深入講解企業(yè)開發(fā)必備技術(shù)棧,夯實基礎(chǔ),為跳槽加薪增加籌碼
          3. 分布式架構(gòu)設(shè)計方法論。為學(xué)習(xí)分布式微服務(wù)做鋪墊
          4. 學(xué)習(xí)NetFilx公司產(chǎn)品,如Eureka、Hystrix、Zuul、Feign、Ribbon等,以及學(xué)習(xí)Spring Cloud Alibabba體系
          5. 微服務(wù)架構(gòu)下的性能優(yōu)化
          6. 中間件源碼剖析
          7. 元原生以及虛擬化技術(shù)
          8. 從0開始,項目實戰(zhàn) SpringCloud Alibaba電商項目

          點擊下方超鏈接查看詳情(或者點擊文末閱讀原文):

          (點擊查看)  2024年,最新Java架構(gòu)師成長之路 視頻教程!

          以下是課程大綱,大家可以雙擊打開原圖查看

          瀏覽 1040
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久国产精品久久久 | 成人网站在线视频三级 | 国产美女丝袜足交视频 | 三级大香焦 | 99热超碰 |