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 等开源库的支持。
importhttpfrom'k6/http';import{check}from'k6';exportdefaultfunction(){constres=http.get(`${__ENV.url}`);check(res,{'is status 200':(r)=>r.status===200});}
压测指标
被压机器指标
CPU usage
Memory usage
被压机器性能指标
QPS
Avg Latency(ms)
P95(ms)
压测结果
Case
QPS
Avg Latency
P95
CPU usage
Memory usage
Quarkus Native,-u 50
1699.067212/s
29.41ms
50.07ms
136.91%
23.15MB
Quarkus Native,-u 100
1749.35664/s
57.14ms
89.9ms
148.9%
23.95MB
Quarkus Native,-u 200
1765.832527/s
113.23ms
167.43ms
156.17%
25.5MB
Spring Boot Native,-u 50
1114.946899/s
44.82ms
85.11ms
226.5%
86.23MB
Spring Boot Native,-u 100
1175.220721/s
85.06ms
137.26ms
236.07%
96.16MB
Spring Boot Native,-u 200
1094.461679/s
182.67ms
284.98ms
246.32%
143.3MB
Quarkus JVM,-u 50
2149.507697/s
23.24ms
39ms
111.99%
173.6MB
Quarkus JVM,-u 100
2186.80721/s
45.7m
69.6ms
126.62%
174.2MB
Quarkus JVM,-u 200
2211.63056/s
90.38ms
130.41ms
125.45%
180.1MB
Spring Boot JVM,-u 50
1472.76853/s
33.93ms
65.69ms
199.08%
426.8MB
Spring Boot JVM,-u 100
1624.997761/s
61.51ms
97.37ms
211.01%
427.2MB
Spring Boot JVM,-u 200
1611.01646/s
124.05ms
188.24ms
214.96%
428.1MB
压测总结
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 可以是一个不错的选择。
最佳框架和标准的结合:Quarkus 在同一应用程序中支持 Spring API 兼容性、Eclipse Vert.x、MicroProfile(JAX-RS、CDI 等)、反应式流和消息传递等。参考《Autowire MicroProfile into Spring Boot》,可以在一个项目中同时使用 Spring 和 MicroProfile API。