Java世界中有一个新的框架: Quarkus 。我决定比较它与 Apache TomEE 和 Spring Boot相关的行为方式 。我将在使用Java 8和Maven时测量伪像大小,编译,测试和部署时间。
为了比较框架,我将创建一个具有一组现实功能的应用程序。它将使用REST端点,Fault Tolerance和内存数据库与JPA。源代码可以在 Java-framework-compare 项目的Github上找到。
每个项目的起点:
Apache TomEE 8.0.0-M2 Microprofile风格来自 MicroProfile Starter ,它选择Config和Fault Tolerance API。
Spring Boot 2.1.3应用程序来自 Spring Initializr 页面,它添加了web,jpa和H2依赖项。
Quarkus 0.11.0应用程序的起点更加明显。它来自 quarkus-quickstarts 捆绑中捆绑的rest-json示例。
基线
所有入门项目都具有不同的捆绑依赖项。只是出于好奇,这些是开箱即用的大小,构建和启动时间,没有运行应用程序:
平台 构建时间 启动时间 大小(MB) Apache TomEE 8.0.0-M2 5454 3,789 44 Spring-boot 2.1.3 2248 2936 16,7 Quarkus0.11.0 1890 0623 10,5
在实际项目中,这对于稍后评估我们的更改对基线的影响非常重要。
加入应用程序
首先,我使用了来自Quarkus rest-json快速启动示例的实现。这捆绑了一组测试和REST端点,我能够成功移植到SpringBoot和TomEE。
集成测试使用的是RestAssured和JUnit 5 Jupiter,在3个项目中是等效的。他们需要对SpringBoot进行一些调整。获取随机端口并配置RestAssured序列化并不明显。
在TomEE上我必须使用JUnit 4,因为Arquillian,那里常用的集成测试框架,还不支持JUnit 5。
我已经为方法添加了Timeout和Fallback Fault tolerance功能。在使用MicroProfile的Quarkus和TomEE以及使用Netflix的Hystrix的SpringBoot上。在SpringBoot中常用的Hystrix处于维护模式我不知道Spring方面的替代品。作为比较,Microprofile Spec增加了对CompletionStage的支持,并将尽快解决反应代码问题。
我试图将JPA与H2数据库一起使用,但是无法在Quarkus中使用它,所以我也把它放在其他的但保留了所有依赖项。文档仍然是粗略的,我需要更多的研究时间。
平台 构建时间 通过测试构建时间 启动时间 大小(MB) Apache TomEE 8.0.0-M2 6,178 15304 4,993 44 Spring-boot 2.1.3 3,358 13,348 6,799 46,9 Quarkus0.11 2,533 7153 0767 23.4
在所有项目中,没有测试的构建时间增加了约1秒。
使用Quarkus进行测试的构建需要花费一半的时间,大小也是其他两个版本的大小的一半。启动时间几乎 是一个数量级。这非常重要。请注意,使用GraalVM的本机代码可以进一步减少此开始时间。
当您向其添加实际功能时,SpringBoot启动时间和超级war大小会显着增加(> 2x)。
TomEE的启动速度比SpringBoot快,而且这个用例的超级jar大小非常稳定。没变。
如果与TomEE或SpringBoot相比,Quarkus的在线资源很少,有大量的试验和错误。