How dev mode differs from a production application
此文档解释了 Quarkus 中的 dev 模式与生产应用程序有何不同。
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/. |
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。
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 从生产应用程序构建的。