创建一个新的 com.polarbookshop.quoteservice.web 包,并添加一个 QuoteController 类来暴露以下三个端点:

  • 返回所有的引用
  • 返回一个随机引用
  • 返回给定流派的随机引用

然后配置嵌入式 Netty 服务器以监听 9101 端口,并定义应用程序名称。打开 application.yml 文件并添加以下配置。

最后,让我们使用第 8 章学到的相同技术编写一些集成测试。

当我们从 Spring Initializr 引导项目时,我们得到了一个自动生成的 QuoteServiceApplicationTests 类。让我们使用一些集成测试来检查由引用服务暴露的 REST API。

实现到此为止。接下来我们将执行自动测试并在 JVM 上运行应用程序。

到目前为止,引用服务是一个标准的 Spring Boot 应用程序,与我们在前几章中构建的任何其他应用程序没有区别。例如,我们可以使用 Gradle 运行自动测试并确保它的行为正确。打开一个终端窗口,导航到项目的根文件夹,并执行以下命令:

./gradlew bootRun

我们也可以在 JVM 上运行它或将其打包为 JAR 文件。从同一个终端窗口,执行以下命令来运行应用程序:

./gradlew bootJar
java -jar build/libs/quote-service-0.0.1-SNAPSHOT.jar

随时通过调用由引用服务暴露的端点来验证应用程序是否正常工作:

curl http://localhost:9101/quotes
curl http://localhost:9101/quotes/random
curl http://localhost:9101/quotes/random?genre=love

当您完成测试应用程序后,使用 Ctrl-C 停止进程。

如何将其编译为本机可执行文件并利用即时启动时间、即时峰值性能和减少内存消耗?这是下一节的主题。

将 Spring Boot 应用程序编译为本机可执行文件

将 Spring Boot 应用程序编译为本机可执行文件有两种方法。第一种选项明确使用 GraalVM,并生成一个特定于操作系统的可执行文件,直接在计算机上运行。第二种选项依赖于 Cloud Native Buildpacks,将本机可执行文件进行容器化,并在 Docker 等容器运行时上运行。我们将同时使用这两种方法。

使用 GraalVM

第一种选项需要在您的计算机上安装 GraalVM 运行时。您可以直接从网站 (www.graalvm.org) 安装它,或者使用 sdkman 等工具。您可以在附录 A 的 A.1 节中找到有关如何安装 sdkman 的说明。

在本章的示例中,我将使用编写时最新的 GraalVM 22.1 发行版,基于 OpenJDK 17。使用 sdkman,您可以按照以下方式安装 GraalVM:

$ sdk install java 22.2.r17-grl

在安装过程结束时,sdkman 会询问您是否要将该发行版设置为默认发行版。我建议您选择否,因为我们将在需要使用 GraalVM 而不是标准 OpenJDK 时明确指定。

然后打开一个终端窗口,导航到您的引用服务项目 (quote-service),配置 shell 以使用 GraalVM,并安装本机图像 GraalVM 组件,如下所示:

$ sdk use java 22.2.r17-grl
$ source $JAVA_HOME/bin/sdkman-java-env.sh
$ gu install native-image

当您初始化引用服务项目时,GraalVM Gradle/Maven 官方插件会自动包含在其中。这是提供使用 GraalVM Native Image 模式编译应用程序功能的插件。

以下 Gradle 任务要求 GraalVM 是当前的 Java 运行时。当使用 sdkman 时,您可以在要使用 GraalVM 的终端窗口中运行 sdk use java 22.2.r17-grl 来实现这一点。

请注意,GraalVM 应用程序的编译步骤较长,根据计算机上的计算资源而定,可能需要几分钟的时间。这是使用本机映像工作的缺点之一。此外,由于 Spring Native 仍处于实验阶段,您可能会收到几个调试日志和警告,但如果过程成功完成,那应该没问题。

从切换到 GraalVM 作为当前 Java 运行时的同一个终端窗口中,运行以下命令将应用程序编译为本机映像:

./gradlew bootBuildImage

该命令的结果是一个独立的二进制文件。由于它是一个本机可执行文件,因此在 macOS、Linux 和 Windows 上是不同的。您可以在本机上运行它,无需 JVM。在 Gradle 的情况下,本机可执行文件生成在 build/native/nativeCompile 文件夹中。请尝试运行它。

首先要注意的是启动时间,通常在使用 Spring Native 时小于 100 毫秒。这与使用 JVM 选项相比是一个令人印象深刻的改进,后者需要几秒钟的时间。最好的部分是,我们不需要编写任何代码来实现这一点!让我们发送一个请求来确保应用程序正常运行:

./build/native/nativeCompile/quote-service/quote-service

当您完成测试应用程序后,使用 Ctrl-C 停止进程。

您还可以将自动测试作为本机可执行文件运行,以使它们更可靠,因为它们将使用在生产中使用的实际运行时环境。但是,与在 JVM 上运行相比,编译步骤仍然需要更长的时间:

./gradlew bootBuildImage -Ptest.native

最后,您可以直接从 Gradle/Maven 运行 Spring Boot 应用程序作为本机映像:

./gradlew bootRun -Pspring.native.image.configuration.name=default

在进入下一节之前,请记住使用 Ctrl-C 停止应用程序进程,下一节将向您展示将 Spring Boot 应用程序编译为本机可执行文件的另一种选项。它不需要在计算机上安装 GraalVM,并使用 Cloud Native Buildpacks 生成一个容器化的本机可执行文件。

使用 Cloud Native Buildpacks

如果您不想在计算机上安装 GraalVM,或者更喜欢使用容器化的工作流,那么可以使用 Cloud Native Buildpacks。Buildpacks 是一组工具,可以将应用程序打包到容器镜像中,而无需手动编写 Dockerfile。

要使用 Buildpacks,您需要安装一个支持 Buildpacks 的容器运行时,例如 Docker 或 Podman。然后,您可以使用以下命令构建一个包含本机映像的容器镜像:

$ pack build image-name . --builder paketo-buildpacks/builder:full --buildpack paketo-buildpacks/graalvm-native-image --publish

此命令将创建一个名为 image-name 的容器镜像,其中包含使用 GraalVM 编译的应用程序。您可以使用以下命令运行该镜像:

$ docker run -p 9101:9101 image-name

Buildpacks 提供了一种灵活的方法来构建和部署容器化的 Spring Boot 应用程序,包括使用 GraalVM 创建本机映像。它消除了手动管理 Dockerfile 的需求,并简化了构建和部署过程。

总结

本指南介绍了如何将 Spring Boot 应用程序编译为本机可执行文件,利用 GraalVM 和 Cloud Native Buildpacks 的优势,以实现更快的启动时间、更高的性能和更低的内存消耗。您可以根据自己的需求选择最适合您的方法,并在需要时轻松切换到其他方法。

通过采用本机映像技术,您可以显著提升应用程序的性能,并为用户提供更快的响应时间和更流畅的用户体验。此外,本机映像还可以减少应用程序的内存消耗,从而降低运行成本并提高资源利用率。

希望本指南对您有所帮助,并祝您在构建高性能 Spring Boot 应用程序的旅程中一切顺利!


原文地址: https://www.cveoy.top/t/topic/qcnJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录