TomEE、Spring Boot与Quarkus比较 - Baptista


Java世界中有一个新的框架:Quarkus。我决定比较它与Apache TomEESpring 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的在线资源很少,有大量的试验和错误。