编辑此页面

开发模式与生产应用程序的不同之处

本文档解释了 Quarkus 中的 dev 模式与生产应用程序的区别。

简介

Quarkus 提供了一个 dev 模式(在此处和此处有更详细的解释),这在开发过程中非常有帮助,但切勿在生产环境中使用。

架构差异

除了功能集,在 dev 模式下运行的 Quarkus 应用程序在架构上与生产应用程序(即使用 java -jar …​ 运行的应用程序)不同。

在 dev 模式下,Quarkus 使用类加载器层次结构(此处有详细解释),该层次结构支持用户代码的实时重新加载,而无需重新构建和重启应用程序。

在生产应用程序中,上述类加载器基础结构完全不存在 - 只有一个专门构建的类加载器,用于加载(几乎)所有类和依赖项。

Dev 模式功能

为了实现“开发者愉悦”的宗旨,Quarkus 在启用 dev 模式时提供了许多功能。最重要的功能是

实时重新加载

这项至关重要的功能无需介绍,已在“架构差异”部分中提及。

Dev UI

Quarkus 提供了一个非常实用的 UI,可以通过浏览器访问 /q/dev-ui。这个 UI 允许开发者查看应用程序的状态,还可以访问各种可以更改该状态的操作(取决于存在的扩展)。此类操作的示例包括

  • 更改配置值

  • 运行数据库迁移脚本

  • 清除缓存

  • 运行计划任务

  • 构建容器

错误页面

为了使开发错误易于诊断,Quarkus 在 dev 模式下运行时提供了各种详细的错误页面。

数据库导入脚本

当 Quarkus 在 dev 模式下运行时,quarkus-hibernate-orm 扩展会运行 src/main/resources 中的 import.sql 脚本。更多详细信息请参见此处。

开发服务

在测试或 dev 模式下运行时,Quarkus 甚至可以提供零配置数据库,我们称之为 Dev Services。更多信息请参见此处。

Swagger UI

当 Quarkus 在 dev 模式下运行时,quarkus-smallrye-openapi 扩展会公开 Swagger UI。更多信息请参见此处。

GraphQL UI

当 Quarkus 在 dev 模式下运行时,quarkus-smallrye-graphql 扩展会公开 GraphQL UI。更多详细信息请参见此处。

Health UI

当 Quarkus 在 dev 模式下运行时,quarkus-smallrye-health 扩展会公开 Health UI。本节提供更多信息。

Mock Mailer

当 Quarkus 在 dev 模式下运行时,quarkus-mailer 扩展将启用一个内存中的 mock 邮件服务器。更多详细信息请参见此处。

gRPC

  • gRPC 反射服务在 dev 模式下默认启用。这允许您使用 grpcurl 等工具。在生产模式下,反射服务是禁用的。您可以使用 quarkus.grpc-server.enable-reflection-service=true 显式启用它。

  • 在 dev 模式下,quarkus.grpc.server.instances 无效。

其他

可能还有其他配置属性(取决于添加到应用程序中的扩展)在 dev 模式下不起作用。

性能影响

在 dev 模式下,最小化应用程序的运行时占用空间不是主要目标(尽管 Quarkus 仍然启动得足够快并且内存消耗很少)- 主要目标是实现开发者愉悦。因此,每次执行实时重新加载时,都会加载更多的类并执行构建时操作。

相比之下,在生产应用程序中,Quarkus 的主要目标是消耗最少的内存和启动时间。因此,在运行生产应用程序时,(根据定义)不会执行构建时操作,并且在运行时根本不存在构建时所需的各种基础结构类。此外,fast-jar 包类型附带的专门构建的类加载器可确保类查找尽可能快,同时保持内存中的类加载器数量最少。

由于优化性能从未是 dev 模式的目标,为了改善启动时间,JVM 的 C2 编译器在 dev 模式下是禁用的。

安全影响

也许 dev 模式应用程序不应在生产环境中运行的最重要原因是,dev 模式允许读取可能包含机密信息(通过 Dev-UI),同时也允许访问可能具有破坏性的操作(通过暴露不应在生产应用程序中提供的端点,或通过 Dev-UI)。

原生可执行文件

当创建原生可执行文件时(此处有详细解释),它始终是从生产应用程序构建的。

相关内容