Payair Technologies 为什么切换到 Quarkus?

开发云就绪解决方案已成为行业标准,尤其是在企业界。您的应用程序迟早会面临横向扩展性差或内存使用率高的问题,我们都知道最好做好准备。

我们在 Payair 也明白这一点。当我们面临准备移动支付应用程序后端时,我们决定尽可能使用支持无服务器方法的框架。Quarkus 就是其中之一。

超音速亚原子 Java

正如该框架的创建者所描述的那样,Quarkus 是

一个 Kubernetes 原生 Java 堆栈,专为 OpenJDK HotSpot 和 GraalVM 量身定制,由最好的 Java 库和标准构建而成。

在 Quarkus 网站上,您可以找到有关其围绕“容器优先”理念设计的信息,这意味着它针对快速启动时间和低内存使用率进行了优化。因此,我们应该在容器编排平台中获得近乎即时的扩展和高密度内存利用率。

实现这一目标的方式可以概括如下

  • 构建时元数据处理。 尽可能多的处理被移动到构建过程中,例如,所有执行初始应用程序部署所需的类都会被使用并在构建时删除。它们不会加载到最终的 JAR(和 JVM)或原生可执行文件中。您可以说,该框架是为您每次按下构建按钮时量身定制的,而不会影响声明性方法的有效性。

  • 减少反射使用。 考虑到以上几点,生成的应用程序仅包含直接调用。所有未被直接调用的字段、方法和类都会被有目的地删除。这同样适用于依赖项。有一种方法可以包含此类调用(将其注册为反射),但 Quarkus 会温和地警告您,您可能会偏离框架的真正目的。

  • 原生镜像预启动。 Quarkus 支持可以使用 GraalVM 运行的原生可执行文件。实际上,Quarkus 的创建者表示,该框架旨在作为原生镜像运行。提前编译减少了动态扫描并将类加载到 JVM 中的需要。

  • GraalVM。 GraalVM 是一个原生代码生成器,它会将您的项目编译成可以在没有 JVM 的情况下运行的可执行文件。您可以在这里阅读更多关于这个卓越项目的信息:https://graalvm.java.net.cn

下面您可以看到示例应用程序的内存使用情况和启动时间的比较

Performance Chart

进化,而非革命

关于这个框架有趣的是它不是革命性的。由于 Payair 的一些开发人员主要有 Spring 经验,我们担心他们很难“转换阵营”。事实证明,我们对未知的恐惧是完全没有根据的。Quarkus 利用了一些古老的 Jakarta EE 标准,所有 Java 开发人员都熟悉这些标准。我们不必学习一大堆新的 API,这些 API 被宣传为“创建 REST 端点的最佳方式”或“重新发明的数据库访问”。相反,Quarkus 使用 Context Dependency Injection 来管理 beans,使用 JAX-RS 来管理 RESTful web 服务,使用 JPA 来管理数据库访问等等。

最重要的是,Quarkus 扩展了可用的 Jakarta EE 功能,以响应现代世界开发人员的需求。这些被称为 Quarkus 扩展,为了列举一些,它们包含对反应式编程(但使用声明性方法)、事件消息传递等的支持。

除了各种可用的扩展之外,还可以根据您选择的库创建自己的扩展。但请记住,如果您想保留 Quarkus 提供的那些剧烈优化,您也必须手动将它们应用于您的扩展。

向 MicroProfile 致敬

我想在这里停顿一下,向 Eclipse MicroProfile 倡议致敬。它指定了一组 API 和技术,形成快速有效地创建企业 Java 微服务的基线。MicroProfile 的目标是定义构建微服务的规范,并在多个运行时实现中交付可移植的应用程序。

优化企业 Java 以适应微服务架构是一项具有挑战性的任务,在我看来,MicroProfile 处理得很好。作为一名长期的 Spring 开发人员,我意识到 Spring 正在慢慢变成它发誓要摧毁的东西。Spring 最初的前提(基本上可以概括为 Jakarta EE 的轻量级替代方案)现在已经过期了。Spring 是无可争议的重量级冠军,可以处理您能想象的一切,但不是您快速轻型服务的最佳选择。这同样适用于 Spring Boot。

开发者的喜悦

值得一提的是 Quarkus 应用程序的开发过程是什么样的。首先,您不必从第一天就开始使用原生镜像。正常的 JVM 构建仍然可用。生成的 JAR 不像原生镜像那样快,但仍然比您正常的企业应用程序快。

这使我们想到最重要的事情:开发模式。特殊的 Maven 插件允许您在编辑类时快速重新加载类,给人一种热部署的印象。更改功能并立即进行测试,而无需进一步的操作,这是一种真正的乐趣。没有更多令人分心的构建和无休止的上下文切换。纯开发模式,因此插件的名称。

快速启动时间还有另一个好处。编写 RESTful 应用程序需要在 API 级别进行大量的集成测试。借助 Quarkus,运行它们会给人一种单元测试般的顺畅感,如果您是 TDD 的轻微爱好者,您会体会到其中的不同。

当我从 Spring 切换到基于 Jakarta EE 的东西时,我个人担心的是缺少 Spring Data JPA。我真的很喜欢这个模块提供的简单性和功能性的结合。但事实证明,Quarkus 在这方面也支持我。有一个名为 Hibernate ORM with Panache 的扩展。它是 Hibernate ORM 之上的一个层,专注于最大限度地简化 ORM,而不会影响 ORM 提供的实际功能。Panache 设法找到了一个最佳点,使其能够轻松地处理简单的实体,而不会放弃处理复杂用例场景的可能性。向 Panache 致敬,向 Spring Data 再见!

简化维护?

我们尚未将 Payair 的 Quarkus 应用程序的第一个版本部署到我们的生产环境中。根据我们在较低级别环境中的经验,我们迫不及待地想这样做!CI/CD 并不比任何其他框架复杂。我们只需要在设置原生构建脚本时保持警惕。JVM 和 GraalVM 运行时之间的差异可以忽略不计。此外,我们最初的性能测试看起来非常有希望。

另一方面,Payair 有许多要求苛刻的客户,他们恰好是金融机构。多年来,我们了解到他们期望我们的产品具有全球覆盖、高性能和高可用性。我们的解决方案必须经过彻底的测试、可靠且万无一失。我们身处一个非常厌恶风险的行业,尽管我们知道其他人已经在生产中使用 Quarkus(https://quarkus.net.cn/blog/tag/user-story),但我们需要自己验证这一点,因为该框架仍然被认为是市场上的新参与者。

下一步是将我们的 Quarkus 实现推向极限,以了解它在真实和重负载下的行为。目前,我们相信一切都会比我们预期的更好。我们会让您知道结果如何。

有关 Payair Technologies 的更多信息,请访问我们的网站:https://www.payair.com

有关 Quarkus 的更多信息