容器优先

Quarkus 应用程序针对低内存使用和快速启动时间进行了优化。

Container image Container image

从一开始,Quarkus 就围绕容器优先的理念进行设计。具体而言,这意味着 Quarkus 应用程序在以下几个方面进行了优化,以实现低内存使用和快速启动时间:

Quarkus Build Time Principle Quarkus Build Time Principle

构建时处理

Quarkus 背后的核心思想是在构建时完成传统框架在运行时完成的工作:配置解析、类路径扫描、基于类加载的功能切换等等。

尽可能多的处理在构建时完成;因此,您的应用程序仅包含运行时使用的类。在传统框架中,执行初始应用程序部署所需的所有类都会在应用程序的生命周期内存在,即使它们只使用一次。使用 Quarkus,它们甚至不会加载到生产 JVM 中! Quarkus 不止于此。在构建时处理期间,它会准备应用程序使用的所有组件的初始化。由于所有元数据处理已经完成,因此可以减少内存使用并加快启动时间。

减少反射的使用

Quarkus 尽可能避免反射,从而减少启动时间和内存使用。在构建时处理期间,扩展可以分析应用程序代码和类路径上可用的类,并将反射调用替换为常规调用。通过在构建时生成自定义代理,也可以防止使用动态代理。

Arc 是 Quarkus 使用的依赖注入框架,它消除了所有反射调用并在构建时推断注入图。因此,当应用程序启动时,无需进行昂贵的查找;一切都已完成!

对 GraalVM Native Images 的一流支持

从一开始,GraalVM Native Executable 支持一直是 Quarkus 设计的重要组成部分。当应用程序被编译成原生可执行文件时,它的启动速度会快得多,并且可以比标准 JVM 以更小的堆运行。原生编译器使用积极的死代码消除技术,仅嵌入应用程序绝对需要的 JVM 和类的部分。Quarkus 使构建优化的原生可执行文件变得非常容易。构建时方法允许 Quarkus 收集足够的应用程序元数据来微调编译。无需 -H:+ReportUnsupportedElementsAtRuntime 标志,无需回退,无需妥协!

原生镜像预启动

我们在 Quarkus 应用程序的原生编译期间预启动尽可能多的框架。这意味着生成的原生可执行文件已经运行了大部分启动代码,并将结果序列化到可执行文件中:启动速度更快!

Kubernetes,但也包括裸机

允许减少内存使用并提供更快启动时间的所有技术不仅在容器中具有优势。即使在裸机上,它也会减少您的内存压力,并且不必等待 10 秒才能看到您的应用程序运行总是令人愉快的。

在设计 Quarkus 时,我们不仅关注容器,还关注在 Kubernetes 等容器编排器上部署 Quarkus 应用程序。Quarkus 构建时处理还会生成 Kubernetes 元数据,因此您的应用程序已准备好部署在 Kubernetes 上。健康检查和指标等运行时功能开箱即用。Quarkus 在构建时收集所有必需的元数据,以创建 Kubernetes 部署描述符并生成容器镜像。一条命令行即可将您的应用程序部署到您的 Kubernetes 集群中。