How dev mode differs from a production application

Intro

Quarkus 提供了一个 dev 模式(在 herehere 中更详细地解释),在开发期间极大地帮助了开发,但它 NEVER 不应用于生产。

Architectural differences

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

在 dev 模式下,Quarkus 使用类加载器层次结构(在 here 中详细解释),该层次结构允许开发者无需重建和重新启动应用程序即可实时重新加载用户代码。

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

Dev-mode features

为了秉持提供开发者乐趣的理念,Quarkus 在启用 dev 模式时提供了许多功能。最重要的功能有:

Live reload

这个极其重要的功能无需介绍,已在 architectural differences 段落中提及。

Dev UI

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

  • Changing configuration values

  • Running Database migration scripts

  • Clearing of caches

  • Running scheduled operations

  • Building a container

Quarkus 3.x 中已实现了一个新的 Dev UI。目前尚未提供所有功能。您仍然可以使用以下方法访问 Dev UI 的旧版本:[role="bare"][role="bare"]http://localhost:8080/q/dev-ui/.

Error pages

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

Database import scripts

当 Quarkus 在 dev 模式下运行时,quarkus-hibernate-orm 扩展将在 src/main/resources 中运行 import.sql 脚本。可以在 here 中找到更多详细信息。

Dev Services

在 dev 模式下测试或运行时,Quarkus 甚至可以立即为您提供零配置数据库,这是我们称为开发人员服务的功能。可以在 here 中找到更多信息。

Swagger UI

当 Quarkus 在 dev 模式下运行时,quarkus-smallrye-openapi 扩展将公开 Swagger UI。可以在 here 中找到更多信息。

GraphQL UI

当 Quarkus 在 dev 模式下运行时,quarkus-smallrye-graphql 扩展将公开 GraphQL UI。可以在 here 中找到更多详细信息。

Health UI

使用 Gemini 在 dev 模式下运行 Quarkus 时,quarkus-smallrye-health 扩展将展示运行状况 UI。This 部分提供了其他信息。

Mock mailer

在 dev 模式下运行 Quarkus 时,quarkus-mailer 扩展将启用内存模拟邮件服务器。有关详细信息,请参阅 this

gRPC

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

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

Others

可能有其他一些配置属性(取决于添加到应用程序中的扩展)在 dev 模式下无效。

Performance implications

在 dev 模式下,最大程度减少应用程序的运行时占用空间并非主要目标(尽管 Quarkus 仍然启动速度很快且占用内存少),主要目标是增强开发人员的喜悦感。因此,每次进行实时重新加载时,将加载更多类,并进行构建时操作。

相比之下,在生产应用程序中,Quarkus 的主要目标是用最少量的内存并尽可能快地启动。因此,在运行生产应用程序时,不会执行生成时操作(根据定义),并且生成时所需的各种基础结构类在运行时根本不存在。此外,fast-jar 包类型附带的专用 ClassLoader 可确保以尽可能快的速度进行类查找,同时还将内存中的 JAR 文件数保持在最少。

由于优化性能并不是 dev 模式的目标,为了加快启动速度,在 dev 模式下禁用 JVM 的 C2 编译器。

Security implications

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

Native executable

当创建本机可执行文件时(在 here 中详细说明),它是 always 从生产应用程序构建的。