您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Native&Quarkus对比分析

时间:2023-08-25 12:26:49  来源:今日头条  作者:阿拉尔的阳光

概述

  • 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 等开源库的支持。

启动&构建指标对比

Spring Native&Quarkus对比分析

启动&构建指标对比

性能测试

资源版本

  • 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 Native&Quarkus对比分析

压测架构

  • 应用容器: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)

压测结果

Spring Native&Quarkus对比分析

压测结果

压测总结

  • 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


Tags:Spring   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  Search: Spring  点击:(52)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  Search: Spring  点击:(39)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: Spring  点击:(9)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  Search: Spring  点击:(84)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: Spring  点击:(86)  评论:(0)  加入收藏
Spring Boot2.0深度实践 核心原理拆解+源码分析
Spring Boot2.0深度实践:核心原理拆解与源码分析一、引言Spring Boot是一个基于Java的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用...【详细内容】
2024-01-15  Search: Spring  点击:(93)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: Spring  点击:(90)  评论:(0)  加入收藏
Spring Boot 3.0是什么?
Spring Boot 3.0是一款基于Java的开源框架,用于简化Spring应用程序的构建和开发过程。与之前的版本相比,Spring Boot 3.0在多个方面进行了改进和增强,使其更加易用、高效和灵活...【详细内容】
2024-01-11  Search: Spring  点击:(131)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11  Search: Spring  点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  Search: Spring  点击:(115)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(52)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(46)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(67)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(84)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条