Quarkus vs Spring
Quarkus vs Spring
Quarkus和Spring都提供了用于构建现代Java应用程序的全面技术和工具堆栈。虽然Quarkus更符合Java EE标准(例如CDI和JAX-RS),但是Spring提供了围绕其核心容器的替代模块化体系结构。
本文包含内容
前言:GraalVM介绍
1 功能比较
2 性能比较
3 本地镜像支持
0 前言GraalVM介绍
GraalVM可作为GraalVM社区版和GraalVM 企业版提供。GraalVM社区版本基于OpenJDK版本1.8.262和OpenJDK版本11.0.8。GraalVM Enterprise版本基于Oracle JDK 1.8.0_261版和Oracle JDK 11.0.8版。GraalVM发行版可用于AMD64系统上的Linux,macOS和Windows平台以及AARCH64系统上的Linux平台。GraalVM是一款高性能运行时环境,可显着改善应用程序的性能和效率,非常适合微服务。它设计用于以Java、JavaScript、python,基于LLVM的语言(例如C和C ++)以及其他动态语言编写的应用程序。它消除了编程语言之间的隔离,并实现了共享运行时的互操作性。
与JVM的区别:
- JIT编译器
- 支持本地镜像,允许提前编译JAVA APP
- 支持多种语言运行时环境(基于Truffle Language)
1 功能比较
功能 | Quarkus | Spring |
---|---|---|
构建time类初始化 | 1 | 0 |
Kubernetes资源生成 | 1 | 0 |
GraalVM本地镜像支持 | 1 | 受限 |
依赖注入与容器管理 | CDI、Spring DI extension | Spring Core |
Web/ REST API 开发 | JAX-RS, Spring Web extension | Spring MVC, Spring WebFlux, JAX-RS |
Reactive / non-blocking web stack | Vert.x | Reactor Netty |
REST Clients | Vert.x WebClient, MicroProfile Rest Client | RestTemplate, WebClient, Feign |
JSON 序列化 | JSON-B, Jackson | Jackson, JSON-B |
Simplified data access | Panache, Spring Data JPA extension | Spring Data: JPA, JDBC, MongoDB, LDAP, KeyValue |
Reactive data access | Reactive SQL Clients, Reactive MongoDB Client | Spring Data R2DBC |
Hibernate支持 | 1 | 1 |
认证与授权 | Elytron Security | Spring Security |
应用监控 | MicroProfile Health, MicroProfile Metrics | Spring Boot Actuator |
Resilience & Fault tolerance | MicroProfile Fault Tolerance | Netflix Hystrix |
Kotlin支持 | 1 | 1 |
线上project生成 | https://code.quarkus.io/ | https://start.spring.io/ |
2 性能比较
描述:本部分主要比较Spring与Quarkus官网最简单demo启动时间,以及使用RESTEasy和Spring Boot Web应用程序对Quarkus应用程序进行GC后的堆使用情况,基于JDK 1.8.0_201
1启动时间与内存占用
Quarkus启动时间
Spring启动时间
Quarkus heap 内存占用
Spring heap内存占用
结论:Quarkus启动时间比Spring少一倍,占用内存差不多也少一倍
2首次请求访问所需时间
本测试采用node.js计算demo启动后首次访问所需时间,测试代码位置github repository.
quarkus
spring
3GraalVM本地性能
将Quarkus打包为GraalVM本机映像时,启动速度要快一个数量级,并且使用的堆要更小。
3GraalVM本地镜像支持
对于Spring,目前对于GraalVM本地镜像仅仅提供实验性支持,当Spring 5.3 时,将提供更成熟的方案。
对于Quarhus,已经提供了对GraalVM本机映像的开箱即用的支持,并且通过应用以下修改,可以轻松地规避Java本机映像的限制:
1反射
默认情况下,GraalVM删除所有未在调用树中直接使用的类/方法/字段。所以,有必要手动注册将使用反射操作的类(例如,需要使用使用反射的框架进行序列化的模型/域类),方法是使用@RegisterForReflection进行注释,或者当类无法被修改时,使用配置文件(例如第三方库)。当Quarkus可以在构建时通过分析代码自动推断出某些类时,不需要注册某些类以进行反射。(例如 REST 方法)
2类初始化
默认情况下,所有类都是由Quarkus在构建时初始化的。当必须在运行时完成类初始化时,可以使用–initialize-at-run-time = 构建参数。
3代理类
代理类必须在映像构建时通过使用build参数-H:DynamicProxyConfigurationResources = <逗号分隔的配置资源>指定它们实现的接口列表来定义
4resources存放
默认情况下,只有 META-INF/resources 下的资源文件能在本地可执行文件内找到,此外绑定更多的资源到本地可执行文件中,需要使用resources-config.json进行配置。