Efficient deployments

Unpacking the Executable JAR

如果你的应用程序在容器中运行,你可以使用可执行 jar,但将其解包并以不同的方式运行,通常也更有利。某些 PaaS 实现也可能会在运行前解包归档文件。比如,Cloud Foundry 就是这样操作的。按以下方式启动相应的启动器,是运行解包归档文件的一种方法:

$ jar -xf myapp.jar
$ java org.springframework.boot.loader.launch.JarLauncher

实际上,这种方式的启动速度会稍微快一些(根据 jar 的大小),而不是从未解包的归档文件启动。启动之后,你就不应再期望有任何差异。

在解压 JAR 文件后,还可以通过使用该应用程序的“自然”main 方法,而不是 `JarLauncher`来运行该应用程序,从而获得额外的启动时间加速。例如:

$ jar -xf myapp.jar
$ java -cp "BOOT-INF/classes:BOOT-INF/lib/*" com.example.MyApplication

在应用程序的 main 方法上使用 `JarLauncher`可以额外获得可预测的类路径顺序。该 jar 包含一个 `classpath.idx`文件,`JarLauncher`在构建类路径时会使用该文件。

Using Ahead-of-time Processing With the JVM

使用 AOT 生成的初始化代码来运行应用程序,对启动时间非常有帮助。首先,你需要确保你编译的 jar 包中包括 AOT 生成的代码。

对于 Maven,这意味着你应该使用 `-Pnative`编译以激活 `native`配置文件:

$ mvn -Pnative package

对于 Gradle,你需要确保编译中包括 `org.springframework.boot.aot`插件。

当编译完成后,使用设置了 `true`的 `spring.aot.enabled`系统属性运行该应用程序。例如:

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

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

请注意,使用提前处理存在缺点。这意味着以下限制:

  • 类路径在编译时已固定并得到完全定义

  • 应用程序中定义的 Bean 在运行时不可更改,这意味着:

    • Spring @Profile 注解和特定于概要文件的配置 have limitations

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

如需了解有关提前处理的更多信息,请参阅 Understanding Spring Ahead-of-Time Processing section

Checkpoint and Restore With the JVM

Coordinated Restore at Checkpoint (CRaC) 是一个 OpenJDK 项目,它定义了一个新的 Java API,使你能够在 HotSpot JVM 上检查点和恢复应用程序。它基于 CRIU,一个在 Linux 上实现检查点/恢复功能的项目。

原则是:你按通常的方式启动应用程序,但需使用 CRac 启用的 JDK 版本,比如 BellSoft Liberica JDK with CRaCAzul Zulu JDK with CRaC。然后在某个时间点,可能在通过执行所有通用代码路径预热 JVM 的一些工作负载之后,你可以使用 API 调用(`jcmd`命令、HTTP 端点或其他机制)触发一个检查点。

然后,正在运行的 JVM 的内存表示(包括其热度)序列化到磁盘中,这允许在稍后的时间点进行快速恢复,甚至可以在具有类似操作系统和 CPU 架构的另一台计算机上进行恢复。已恢复的进程保留了 HotSpot JVM 的所有功能,包括在运行时进行进一步 JIT 优化。

Spring Boot 在 Spring Framework 提供的基础上,为检查点和恢复应用程序提供支持,并开箱即用地管理资源的生命周期,例如套接字、文件和线程池 on a limited scope。针对其他依赖项以及可能处理此类资源的应用程序代码,预计会进行额外的生命周期管理。

你可以在 {url-spring-framework-docs}/integration/checkpoint-restore.html[Spring Framework JVM 检查点恢复支持文档] 中找到有关支持的两种模式(“正在运行应用程序的按需检查点/恢复”和“启动时的自动检查点/恢复”)的更多详细信息,以及如何启用检查点和恢复支持以及一些指南。