高效部署

解压可执行 Jar 包

您可以使用可执行 Jar 包运行应用程序,但从嵌套 Jar 包加载类会带来少量开销。根据 Jar 包的大小,从展开的结构运行应用程序更快,建议在生产环境中使用。某些 PaaS 实现也可能选择在运行之前提取存档。例如,Cloud Foundry 就是这样操作的。

Spring Boot 支持使用不同的布局将应用程序提取到目录中。默认布局效率最高,并且对 CDS 友好

在此布局中,库被提取到 lib/ 文件夹,应用程序 JAR 包含应用程序类和一个清单,该清单引用 lib/ 文件夹中的库。

$ java -Djarmode=tools -jar my-app.jar extract
$ java -jar my-app/my-app.jar

启动后,您不应该期望有任何差异。

运行 java -Djarmode=tools -jar my-app.jar help extract 查看所有可能的选项。

使用 CDS 优化启动时间

类数据共享 (CDS) 是一个 JVM 功能,可以帮助减少 Java 应用程序的启动时间和内存占用。

要使用它,您应该首先对应用程序进行训练运行,并以展开形式运行。

$ java -Djarmode=tools -jar my-app.jar extract --destination application
$ cd application
$ java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar my-app.jar

这将创建一个 application.jsa 文件,只要应用程序没有更新,就可以重复使用。

要使用缓存,您需要在启动应用程序时添加一个额外的参数。

$ java -XX:SharedArchiveFile=application.jsa -jar my-app.jar
有关 CDS 的更多详细信息,请参阅 Spring 框架参考文档

使用 JVM 的提前处理

使用 AOT 生成的初始化代码运行应用程序对启动时间有益。首先,您需要确保您正在构建的 jar 包含 AOT 生成的代码。

CDS 和 AOT 可以结合使用,进一步提高启动时间。

对于 Maven,这意味着您应该使用 -Pnative 构建以激活 native 配置文件。

$ mvn -Pnative package

对于 Gradle,您需要确保您的构建包含 org.springframework.boot.aot 插件。

构建 JAR 后,使用 spring.aot.enabled 系统属性设置为 true 运行它。例如

$ java -Dspring.aot.enabled=true -jar myapplication.jar

........ Starting AOT-processed MyApplication ...

请注意,使用提前处理有一些缺点。它意味着以下限制

  • 类路径在构建时是固定的,并且完全定义。

  • 应用程序中定义的 bean 无法在运行时更改,这意味着

    • Spring @Profile 注解和特定于配置文件的配置 存在限制

    • 如果创建 bean,则不支持更改的属性(例如,@ConditionalOnProperty.enable 属性)。

要了解有关提前处理的更多信息,请参阅 了解 Spring 提前处理部分

使用 JVM 的检查点和恢复

协调恢复检查点 (CRaC) 是一个 OpenJDK 项目,它定义了一个新的 Java API,允许您在 HotSpot JVM 上检查点和恢复应用程序。它基于 CRIU,该项目在 Linux 上实现了检查点/恢复功能。

原理如下:您几乎可以像往常一样启动您的应用程序,但使用启用了 CRaC 的 JDK 版本,例如 带有 CRaC 的 BellSoft Liberica JDK带有 CRaC 的 Azul Zulu JDK。然后,在某个时刻,可能是在执行所有常见代码路径以预热 JVM 的一些工作负载之后,您可以使用 API 调用、jcmd 命令、HTTP 端点或其他机制触发检查点。

运行中 JVM 的内存表示(包括其预热状态)将被序列化到磁盘,允许在稍后(可能在具有类似操作系统和 CPU 架构的另一台机器上)快速恢复。恢复后的进程保留了 HotSpot JVM 的所有功能,包括在运行时的进一步 JIT 优化。

基于 Spring Framework 提供的基础,Spring Boot 提供了对检查点和恢复应用程序的支持,并管理了资源(如套接字、文件和线程池)的生命周期 在有限范围内。其他依赖项以及可能处理此类资源的应用程序代码需要额外的生命周期管理。

您可以在 Spring Framework JVM 检查点恢复支持文档 中找到有关两种支持模式(“按需检查点/恢复正在运行的应用程序”和“启动时自动检查点/恢复”)、如何启用检查点和恢复支持以及一些指南的更多详细信息。