概述
- Quarkus首頁放出的標語:超音速亞原子的JAVA(Supersonic Subatomic Java),它是為OpenJDK HotSpot和GraalVM量身定制的Kube.NETes Native Java框架,基于同類最佳的 Java 庫和標準制作而成。
- Quarkus的到來為開發linux容器和 kubernetes 原生Java微服務帶來了一個創新平臺。
- Spring Boot是一個基于Java的框架,專注于企業應用,它可以簡單使用所有Spring項目,并集成了許多開箱即用的功能,來幫助開發人員提高生產力。
- Spring Boot由于其約定優于配置方法,它根據依賴項自動注冊默認配置,大大縮短了Java應用程序的開發周期。
- Java生態中新興的技術體系:
Spring Reactive(Spring WebFlux) → 背靠 Pivotal → 歸屬 VMware → 歸屬戴爾
Quarkus 和 Vert.x → 背靠 Eclipse 基金會 → 主要由 Red Hat 支持
Helidon → 背靠 Oracle
Micronaut → 背靠 Object Computing(GrAIls、OpenDDS)
Lagom → 背靠 Lightbend(Akka)
- 本文重點關注比較熱門的Spring Reactive和Quarkus在原生鏡像方面的差異。
對比分析
- 創新和生態系統: Spring 有著長期的歷史和豐富的生態系統,許多開發者對其已經非常熟悉。Spring Native 是 Spring 團隊為了更好地適應云原生環境(如 Kubernetes)而推出的新項目。相比之下,Quarkus 較新,但它在設計上就考慮了現代云原生和微服務架構,因此在某些方面可能更具創新性。
- 性能和資源利用: Quarkus 和 Spring Native 都聲稱可以提供更快的啟動時間和減少的內存占用。然而,實際表現可能會因應用程序的具體情況以及你如何使用這些框架而變化。
- 開發體驗: Quarkus 提供的開發模式(live coding)允許開發者在不重啟應用的情況下實時看到代碼改變的效果,這可能會提高開發效率。Spring Native 則繼承了 Spring Boot 的開發體驗,使得許多開發者能夠很快上手。
- 兼容性: Spring Native 對于 Spring 生態中的部分庫可能還存在兼容性問題,需要按照官方給出的指引進行調整。而 Quarkus 在設計時就盡可能考慮了廣泛的兼容性,包括對于 Hibernate,Apache Camel,Eclipse MicroProfile 等開源庫的支持。
啟動&構建指標對比

啟動&構建指標對比
性能測試
資源版本
- MySQL: 8.0.32-1.el8
- Quarkus: 3.2.2.Final
- Spring Boot: 3.1.2
- JDK: 17.0.8
- Docker Engine: 24.0.5
- Docker Resource: 4C/8G
壓測源碼&鏡像
- 壓測源碼:Github - guanyang/spring-project-samples: 基于springboot3.0及jdk17構建常用示例工程
native-sample: 基于spring native構建原生鏡像示例
quarkus-sample: 基于quarkus構建原生鏡像示例
- 鏡像資源
Quarkus Native Image: guanyangsunlight/spring-project-samples:quarkus-sample-0.0.1-SNAPSHOT
Quarkus JVM Image: guanyangsunlight/spring-project-samples:quarkus-sample-0.0.1-SNAPSHOT-jvm
Spring Boot Native Image: guanyangsunlight/spring-project-samples:native-sample-0.0.1-SNAPSHOT
Spring Boot JVM Image: guanyangsunlight/spring-project-samples:native-sample-0.0.1-SNAPSHOT-jvm
MySQL Image: guanyangsunlight/spring-project-samples:sample-mysql-8.0.32
- Docker Compose文件
quarkus-sample: quarkus-sample/src/main/docker/docker-compose.yml
native-sample: native-sample/src/main/docker/docker-compose.yml
壓測架構

壓測架構
- 應用容器:Spring Boot Native,Quarkus Native,Spring Boot JVM,Quarkus JVM每個一個實例
- MySQL容器:Mysql8.0容器實例一個
- K6施壓機: 2.2 GHz 四核Intel Core i7,16 GB 1600 MHz DDR3
- K6參考鏈接:k6 Documentation
壓測場景case
- Spring Boot Native: 性能指標(QPS、RT),機器指標(CPU、內存)
- Quarkus Native: 性能指標(QPS、RT),機器指標(CPU、內存)
- Spring Boot JVM: 性能指標(QPS、RT),機器指標(CPU、內存)
- Quarkus JVM: 性能指標(QPS、RT),機器指標(CPU、內存)
壓測服務接口
- 接口地址:${host}/api/test/get/{id}
- 接口說明:根據id查詢數據庫記錄,host為服務地址,id為數據庫記錄主鍵
- 響應示例:
{
"code": 200,
"message": "OK",
"data": {
"id": 4,
"version": 1,
"deleted": 0,
"createBy": "admin",
"updateBy": "admin",
"createTime": 1695312514000,
"updateTime": 1695312532000,
"username": "test41"
}
}
壓測腳本
- 總請求時長300s,并發從50開始,并按照50步長增長,命令如下:
k6 run -u 50 --duration 300s -e url=http://127.0.0.1:8082/api/test/get/4 simple-test.js
-i:指定請求數量
-u:模擬并發數量
--duration:請求時長定義,例如:60s,1m
-e url:指定環境變量url,用于實際場景替換
- 腳本輸出樣例
scenarIOS: (100.00%) 1 scenario, 50 max VUs, 36s max duration (incl. graceful stop):
* default: 50 looping VUs for 6s (gracefulStop: 30s)
? is status 200
checks.........................: 100.00% ? 7761 ? 0
data_received..................: 1.9 MB 324 kB/s
data_sent......................: 730 kB 121 kB/s
http_req_blocked...............: avg=12.22µs min=1µs med=3µs max=3.26ms p(90)=5µs p(95)=6µs
http_req_connecting............: avg=7.1µs min=0s med=0s max=2.19ms p(90)=0s p(95)=0s
http_req_duration..............: avg=38.56ms min=7.55ms med=34.26ms max=216.77ms p(90)=58.96ms p(95)=68.51ms
{ expected_response:true }...: avg=38.56ms min=7.55ms med=34.26ms max=216.77ms p(90)=58.96ms p(95)=68.51ms
http_req_failed................: 0.00% ? 0 ? 7761
http_req_receiving.............: avg=52.57µs min=19µs med=46µs max=680µs p(90)=81µs p(95)=97µs
http_req_sending...............: avg=19.87µs min=7µs med=16µs max=1.27ms p(90)=27µs p(95)=38µs
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=38.49ms min=7.51ms med=34.18ms max=216.58ms p(90)=58.89ms p(95)=68.46ms
http_reqs......................: 7761 1288.780058/s
iteration_duration.............: avg=38.7ms min=7.76ms med=34.4ms max=218.51ms p(90)=59.08ms p(95)=68.64ms
iterations.....................: 7761 1288.780058/s
vus............................: 50 min=50 max=50
vus_max........................: 50 min=50 max=50
- simple-test.js腳本說明
import http from 'k6/http';
import { check } from 'k6';
export default function () {
const res = http.get(`${__ENV.url}`);
check(res, {
'is status 200': (r) => r.status === 200
});
}
壓測指標
被壓機器指標
- CPU usage
- Memory usage
被壓機器性能指標
- QPS
- Avg Latency(ms)
- P95(ms)
壓測結果

壓測結果
壓測總結
- Quarkus Native相較于Spring Boot Native資源消耗更低,性能更好。
- Quarkus JVM相較于Spring Boot JVM模式資源消耗更低,性能更好。
- Native原生相較于JVM模式整體資源消耗更低,啟動更快,構建鏡像更小。
優缺點及選型總結
Quarkus優缺點
- 優點高度優化的運行時性能和內存管理;對于開發者友好的開發模式,如實時編程(live coding);廣泛的兼容性,支持許多主流的 Java 開源庫;面向云原生應用的設計。
- 缺點相對于 Spring,其社區規模還較小,可能在某些問題上找不到即時的幫助;盡管有廣泛的兼容性,但并不包括所有的 Java 庫。
Spring Boot Native優缺點
- 優點建立在 Spring 生態系統之上,易于為已經使用 Spring 的團隊接受;與 Spring Boot 無縫集成,并且借助 GraalVM 提供媲美本機語言的啟動速度和內存占用。支持 AOT(Ahead-of-Time Compilation)編譯,可以提高啟動速度。
- 缺點使用 Spring Boot Native 需要適應其構建過程中將應用程序轉化為本地應用程序的復雜性;構建完成的應用程序雖然啟動速度快、內存消耗低,但CPU使用率高于普通 JVM 程序。
技術選型思考
- 項目需求:如果項目需要快速啟動,低內存消耗,那么兩者都可以滿足。如果已經在使用 Spring Stack,并且想要繼續保持使用它,那么 Spring Boot Native 會更加合適。如果項目對開發效率有高要求,那么 Quarkus 可能更符合需求。
- 團隊技能:如果團隊成員已經非常熟悉 Spring Stack,那么采用 Spring Boot Native 可能可以減少學習曲線。反之,如果團隊愿意嘗試新的技術,并且對響應式編程和函數式編程有興趣,那么選擇 Quarkus 可以是一個不錯的選擇。
- 社區支持和文檔:Spring 社區非常活躍,有大量的教程和指南。雖然 Quarkus 比較新,但也在積極擴大其社區,并提供了詳細的文檔。
在實際決策過程中,最好能夠根據具體情況進行技術選型,可能的話,可以在小規模的項目或者原型中嘗試并評估這些框架。
Quarkus對Spring開發者的額外好處
- 功能即服務 (FaaS):當編譯為原生二進制文件時,Quarkus 應用程序可以在 0.0015 秒內啟動,從而可以將現有的 Spring 和 Java API 知識與 FaaS 功能結合使用。(Azure Functions - Quarkus,AWS Lambda - Quarkus)
- 實時編碼:從“Hello World”示例應用程序開始,然后將其轉換為復雜的微服務,而無需重新啟動應用程序。只需保存并重新加載瀏覽器即可查看沿途的變化。 Quarkus 實時編碼“開箱即用”,與 IDE 無關。
- 支持反應式和命令式模型:Quarkus有一個反應式核心,支持傳統的命令式模型、反應式模型,或在同一應用程序中同時支持兩者。
- 早期檢測依賴注入錯誤:Quarkus 在編譯期間而不是在運行時捕獲依賴項注入錯誤。
- 最佳框架和標準的結合:Quarkus 在同一應用程序中支持 Spring API 兼容性、Eclipse Vert.x、MicroProfile(JAX-RS、CDI 等)、反應式流和消息傳遞等。參考《Autowire MicroProfile into Spring with Quarkus | Red Hat Developer》,可以在一個項目中同時使用 Spring 和 MicroProfile API。
參考文檔
- Quarkus vs. Spring Boot | LogicMonitor
- Quarkus for Spring Developers - Quarkus
- Guides - Latest - Quarkus
- Get Started - Quarkus
- Quarkus - Start coding with code.quarkus.io
- Spring Boot Maven Plugin Documentation
- GraalVM Native Image Support
- Getting Started | Building a Reactive RESTful Web Service