Ship.Cars 利用 Quarkus 实现其目标

Ship.Cars 是汽车运输物流领域具有革命性的合作伙伴,提供专门定制的可定制软件解决方案,以满足您的所有汽车运输需求。我们的工具经过完美设计,可以增强您的业务能力,从而简化、自动化和组织整个汽车运输过程,从始至终。
通过各种产品的开发,Ship.Cars 帮助汽车物流行业转型进入现代。我们的行业解决方案,例如 LoadMate 和 LoadMate Pro,满足了经销商、汽车租赁公司和其他托运人的各种需求。同时,像我们的 SmartHaul TMS 和 SmartHaul APP 这样的创新已成为我们汽车运输商预订和管理货物的不可或缺的工具。
应对挑战
作为一个以产品为中心的组织,我们利用微服务范式通过众多不同的软件产品提供各种功能。到目前为止,我们已经开发了 50 多个微服务。这些服务不仅满足了必要的功能需求,而且还遵守严格的技术规范。这些规范确保了服务的无缝配置、负载下的一致性能以及任何出现问题的轻松识别和解决。
这些服务的构建在很长一段时间内依赖于各种框架,包括 Quarkus 、 Spring Boot 和 Django。每个框架都表现出其独特的优势和劣势,从细微的特征延伸开来。然而,随着时间的推移,我们确定 Quarkus 以最佳方式满足了我们的大部分需求。这就解释了我们目前从 Django 转移到 Quarkus 以进行大部分开发的原因。
由于 Ship.Cars 在 Google Cloud 平台内的 Kubernetes 上部署其微服务,因此我们不断寻求有效的方法来扩展我们的开发能力,同时节省云资源消耗。由于云资源消耗成本始终是优先事项,因此我们努力寻找有效的方法来优化云中的内存和处理器使用率。
-
降低云资源消耗:多个活动微服务会消耗大量的内存和 CPU,从而迅速增加成本。因此,有效地管理云资源至关重要。
-
更快的启动时间:在微服务架构中,服务停止、启动和扩展的速度非常重要。启动时间慢会对系统性能和响应能力产生严重影响。
-
简化的微服务开发:构建微服务并确保其互操作性可能很复杂,需要巧妙的管理和专门的工具。
-
弹性和容错性:微服务必须具有弹性,并能够从意外故障中快速恢复。但是,实施此类容错机制可能具有挑战性。
-
服务发现:随着服务数量的增加,在服务之间发现和通信的能力变得至关重要。传统的硬编码端点无法在这些场景中很好地扩展。
-
事件驱动的微服务:在微服务中实施事件驱动的架构模型使不同的服务可以异步通信。然而,协调起来可能很困难。
-
响应式和命令式编程:为云选择合适的编程模型,尤其是一个支持可伸缩性和系统响应能力的编程模型,可能会令人生畏。
-
降低云资源消耗:传统的 Java 应用程序以其高内存使用率而闻名,在资源需要花钱的云环境中可能会变得很昂贵。Quarkus 显着减少了应用程序的内存占用,从而实现了更高效的云资源管理。
-
更快的启动时间:缓慢的启动时间在传统的 Java 应用程序中很常见,这个问题在云中尤其严重,因为应用程序需要快速扩展和缩小。Quarkus 极大地提高了启动性能,应用程序通常可以在亚秒级时间内启动。
-
简化的微服务开发:Quarkus 旨在与流行的 Java 标准和技术(如
Eclipse MicroProfile
、Jakarta EE
、OpenTelemetry
、Hibernate
等)配合使用,从而简化了开发过程并减少了所花费的时间和复杂性。 -
弹性和容错性:Quarkus 采用
MicroProfile Fault Tolerance
规范来提供诸如超时、重试、bulkhead、断路器和回退之类的功能。这些功能使您的微服务更具弹性和容错性。 -
服务发现:Quarkus 本地支持 Kubernetes 服务发现,从而使服务能够以可靠的方式相互发现和通信。
-
事件驱动的微服务:Quarkus 支持事件驱动的架构,从而使服务可以通过事件进行通信,从而降低了服务之间的复杂性和耦合。
-
响应式和命令式编程:Quarkus 使开发人员可以自由地使用响应式或命令式编程模型,甚至可以在同一应用程序中组合两者,从而为可伸缩性和系统响应能力创建了一个完美的解决方案。
应对云资源消耗
对于像我们这样的企业来说,我们的组织目标之一是降低成本,同时又不牺牲平台的性能,以确保卓越的用户体验。但是,传统的 基于 JVM 的 服务通常会带来挑战,例如大量的内存占用、较长的启动时间和较高的 CPU 使用率。这些问题不仅影响技术方面,而且还具有财务影响,严重影响运行和维护软件解决方案的总体成本。
本机映像是独立的的可执行文件,其中包括应用程序代码和必要的运行时组件。随着 GraalVM 的出现,GraalVM 是一种高性能、多语言虚拟机,能够运行以不同编程语言编写的应用程序,本机映像的概念已广受欢迎。
-
更快的启动时间:作为预编译的实体,本机映像可以非常快速地启动,通常只需几毫秒。当应用程序需要几乎立即启动和停止时,此方面非常有利,例如在无服务器功能或基于云的微服务体系结构中。例如,我们的一个微服务
native powered by Quarkus 3.2.7.Final
仅需 0.677 秒即可启动。 -
更低的内存占用:由于本机映像仅包括应用程序实际使用的运行时组件,因此可以显着减少应用程序的内存占用。这种效率在云环境中非常重要,因为资源使用情况直接影响成本。
实际服务内存使用情况

-
更轻松的发行:作为独立的的可执行文件,本机映像可以轻松地在任何环境中分发和运行,而无需安装单独的运行时。
-
减小的容器大小:由于完全是独立的,因此本机映像的容器映像由于尺寸缩小而更易于分发。这会导致在 Kubernetes 等容器化环境中启动时间更快。例如,
Quarkus Native (85.1 MB)
、Quarkus Non-Native (648.4 MB)
和Spring Boot (861.9 MB)
之间的大小比较清楚地表明了它们之间资源效率的差异。
使用 Quarkus,您可以通过利用 GraalVM native-image 编译器将应用程序编译为本机映像,从而使您的 Java 应用程序能够在云平台、容器化和无服务器架构中体验这些优势,这归功于它们快速的启动时间和更低的资源消耗。
优化开发人员生产力
-
实时编码:无需构建时间和部署时间,开发人员可以立即测试对代码的更改。
-
使用 Dev Services 进行零配置:Quarkus 可以自动配置一些服务以进行开发和测试,从而提高效率。
-
持续测试:持续测试是通过命令行和 Dev UI 实现的,从而提高了最终产品的质量,而无需依赖第三方工具和流程。
-
Dev UI:开发人员可以轻松地配置扩展、监视应用程序和测试组件。
-
统一配置:应用程序的所有配置都整合在一个位置,从而提高了可访问性。
-
基于标准
拥抱 Quarkus 扩展
Quarkus 扩展是预配置的功能集,旨在简化应用程序开发过程中的几个常见任务。它们提供了一种有效的方法,可以用最少的精力在您的项目中吸收新功能或直接集成。
在我们的组织中,我们设法快速实施了内部扩展,从而有效地解决了我们在尝试创建本机映像时遇到的维护问题和配置不兼容问题。如今,我们受益于一个扩展中心,该中心消除了以前的所有疑虑并提高了我们的生产力。
虽然 Quarkus 扩展是功能强大的工具,可提供深度集成、优化和增强的开发人员体验,但权衡利弊并考虑标准 JAR 库等更简单的解决方案是否更适合该需求至关重要。
展望未来
在下面的图形表示中,我想说明采用 Quarkus 的过程与随后的结果之间固有的关系,随着时间的推移。

在“Y 轴”上,我们根据每个 sprint 的故事点来定义难度或成本,从而反映了功能实现所需的相对工作量。这也代表了采用 Quarkus 功能所花费的时间和资源方面的成本。同时,易用性/回报考虑了诸如减少调试时间、更快的功能开发以及成功实施后的团队生产力提高等指标。该图清楚地表明,在开始时(在“X 轴”上标记为“开始”),难度(以较高的故事点表示)和成本都处于最高水平,这表明具有挑战性的初始阶段。但是,随着我们从“开始”沿时间线移动到“中间”,然后再到“未来”,我们看到每个 sprint 的故事点显着下降,表明难度级别和成本降低。与此并行,易用性和回报的图表开始时在比较低的水平。当我们沿着时间线朝着“中间”和“未来”前进时,这些逐渐升级,表明从采用 Quarkus 功能并将其集成到我们的实践中可以切实提高生产力和其他收益。
到我们到达“未来”时,我们发现难度和成本大幅降低,而易用性和回报已大大提高。这种双重进展有效地突出了投资采用 Quarkus 的重大好处,尽管存在最初的挑战。投资 Quarkus 是一种战略性策略,旨在创建适用于云时代的高效、可扩展和现代应用程序。凭借其强大的功能和支持性社区,Quarkus 完全有能力引领云原生应用程序开发的未来。采用 Quarkus 的决定是朝着优化效率、可伸缩性和前沿应用程序性能迈出的重要一步,这将为我们在快速发展的技术领域提供可观的竞争优势。