你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:在 Azure Spring Apps 中部署你的第一个 Java 本机映像应用程序

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用

本文适用于:❌ 基本版/标准版 ✔️ 企业版

本快速入门演示如何将 Spring Boot 应用程序作为本机映像部署到 Azure Spring Apps。

本机映像功能使你能够将 Java 应用程序编译为独立的可执行文件,称为本机映像。 与传统 JVM(Java 虚拟机)相比,这些可执行文件可提供显著的优势,包括更快的启动时间和更低的运行时内存开销。

示例项目是 Spring Petclinic 应用程序。 以下屏幕截图显示了该应用程序:

Azure Spring Apps 中 Spring Petclinic 应用程序的屏幕截图。

1.先决条件

2. 准备 Spring Petclinic 项目

使用以下步骤在本地克隆和运行应用。

  1. 使用以下命令从 GitHub 克隆 Spring Petclinic 项目:

    git clone https://github.com/Azure-Samples/spring-petclinic.git
    
  2. 使用以下命令生成 Spring Petclinic 项目:

    cd spring-petclinic
    ./mvnw clean package -DskipTests -Pnative package
    
  3. 使用以下命令通过 Maven 运行 Spring Petclinic 应用程序:

    java -jar target/spring-petclinic-3.1.0-SNAPSHOT.jar
    
  4. 在浏览器中转到 http://localhost:8080 以访问 Spring Petclinic 应用程序。

3. 准备云环境

运行 Spring Petclinic 应用程序所需的主要资源是 Azure Spring Apps 实例。 本部分提供创建该资源的步骤。

3.1. 提供每个资源的名称

使用以下命令创建变量以保存资源名称。 请务必将占位符替换为你自己的值。

export RESOURCE_GROUP=<resource-group-name>
export LOCATION=<location>
export AZURE_SPRING_APPS_NAME=<Azure-Spring-Apps-service-instance-name>
export NATIVE_BUILDER=native-builder
export JAR_APP_NAME=jar-app
export NATIVE_APP_NAME=native-app
export JAR_PATH=target/spring-petclinic-3.1.0-SNAPSHOT.jar

3.2. 创建新的资源组

按照以下步骤创建新的资源组:

  1. 使用以下命令登录到 Azure CLI:

    az login
    
  2. 使用以下命令设置默认位置:

    az configure --defaults location=${LOCATION}
    
  3. 使用以下命令列出所有可用的订阅,以确定要使用的订阅 ID:

    az account list --output table
    
  4. 使用以下命令设置默认订阅:

    az account set --subscription <subscription-ID>
    
  5. 使用以下命令来创建资源组:

    az group create --resource-group ${RESOURCE_GROUP}
    
  6. 使用以下命令将新创建的资源组设置为默认资源组:

    az configure --defaults group=${RESOURCE_GROUP}
    

3.3. 创建 Azure Spring Apps 实例

Azure Spring Apps 用于托管 Spring Petclinic 应用。 使用以下步骤创建一个 Azure Spring Apps 实例,并在其内创建两个应用程序:

  1. 使用以下命令创建 Azure Spring Apps 服务实例。 本机映像生成在映像生成期间需要 16 Gi 内存,因此请将生成池大小配置为 S7。

    az spring create \
        --name ${AZURE_SPRING_APPS_NAME} \
        --sku enterprise \
        --build-pool-size S7
    
  2. 在当前目录中创建 builder-native.json 文件,然后添加以下内容:

    {
       "stack": {
         "id": "io.buildpacks.stacks.jammy",
         "version": "tiny"
       },
       "buildpackGroups": [
         {
           "name": "default",
           "buildpacks": [
             {
               "id": "tanzu-buildpacks/java-native-image"
             }
           ]
         }
       ]
     }  
    
  3. 使用以下命令创建自定义生成器以生成本机映像应用程序:

    az spring build-service builder create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_BUILDER} \
        --builder-file builder-native.json
    
  4. 使用以下命令在 Azure Spring Apps 实例中创建一个应用程序,在其中将 Spring Petclinic 应用程序部署为 JAR 文件。 将内存限制配置为 1 Gi。

    az spring app create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${JAR_APP_NAME} \
        --cpu 1 \
        --memory 1Gi \
        --assign-endpoint true
    
  5. 使用以下命令在 Azure Spring Apps 实例中创建一个应用程序,在其中将 Spring Petclinic 应用程序部署为本机映像:

    az spring app create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME} \
        --cpu 1 \
        --memory 1Gi \
        --assign-endpoint true
    

4. 将应用部署到 Azure Spring Apps

云环境准备就绪后,即可部署应用程序。

使用以下命令将 Spring Petclinic 应用程序部署为 JAR 文件:

az spring app deploy \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME} \
    --artifact-path ${JAR_PATH} \
    --build-env BP_JVM_VERSION=17

使用以下命令将 Spring Petclinic 应用程序部署为本机映像:

az spring app deploy \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME} \
    --builder ${NATIVE_BUILDER} \
    --build-cpu 8 \
    --build-memory 16Gi \
    --artifact-path ${JAR_PATH} \
    --build-env BP_JVM_VERSION=17 BP_NATIVE_IMAGE=true

5. 验证本机映像应用

现在,你可以访问部署的本机映像应用以查看它是否正常工作。 按照以下步骤来验证:

  1. 部署完成后,可以运行以下命令来获取应用 URL:

    az spring app show \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME} \
        --output table
    

    可以使用输出中显示的 URL Public Url 来访问该应用。 页面应如你在 localhost 中看到的那样显示。

  2. 使用以下命令检查应用程序的日志,以调查任何部署问题:

    az spring app logs \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME}
    

6. 比较 JAR 和本机映像的性能

以下部分介绍如何比较 JAR 与本机映像部署之间的性能。

服务器启动时间

使用以下命令检查应用的日志 Started PetClinicApplication in XXX seconds,以获取 JAR 应用的服务器启动时间:

az spring app logs \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME}

JAR 应用的服务器启动时间约为 25 秒。

使用以下命令检查应用的日志,以获取本机映像应用的服务器启动时间:

az spring app logs \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME}

本机映像应用的服务器启动时间小于 0.5 秒。

内存使用率

使用以下命令将本机映像应用的内存大小纵向缩减为 512 Mi:

az spring app scale \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME} \
    --memory 512Mi

命令输出应显示本机映像应用已成功启动。

使用以下命令将 JAR 应用的内存大小纵向缩减为 512 Mi:

az spring app scale \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME} \
    --memory 512Mi

命令输出应显示 JAR 应用由于内存不足而无法启动。 输出消息应类似于以下示例:Terminating due to java.lang.OutOfMemoryError: Java heap space

下图显示了本机映像部署的优化内存使用情况,该部署的恒定工作负载为每秒 400 个请求进入 Petclinic 应用程序。 内存使用量大约是其等效 JAR 部署占用的内存的 1/5。

Azure Spring Apps 中本机映像部署的优化内存使用情况的屏幕截图。

与传统 Java 虚拟机 (JVM) 相比,本机映像具有更快的启动时间和更低的运行时内存开销。

7.清理资源

如果打算继续使用后续的快速入门和教程,则可能需要保留这些资源。 如果不再需要这些资源,可通过删除资源组将其删除。 使用以下命令删除资源组:

az group delete --name ${RESOURCE_GROUP}

8.后续步骤

有关详细信息,请参阅以下文章: