将 Spring Data 与 Azure Cosmos DB for Apache Cassandra API 配合使用

本文将详细介绍如何在 Linux 上的 Azure 应用服务中生成、配置、部署和缩放 Java Web 应用并对其进行故障排除。

本文将演示如何使用以下组件:

先决条件

为遵循本文介绍的步骤,需要以下先决条件:

重要

完成本文中的步骤需要 Spring Boot 2.5 或更高版本。

克隆示例 Java Web 应用存储库

在本练习中,你将使用 Spring Todo 应用,这是使用 Spring BootSpring Data for Azure Cosmos DBAzure Cosmos DB 生成的 Java 应用程序。

  1. 克隆 Spring Todo 应用并复制 .prep 文件夹的内容,以便初始化项目:

    对于 Bash:

    git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
    yes | cp -rf .prep/* .
    

    对于 Windows:

    git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
    cd e2e-java-experience-in-app-service-linux-part-2
    xcopy .prep /f /s /e /y
    
  2. 将目录转到已克隆存储库中的以下文件夹:

    cd initial\spring-todo-app
    

通过 Azure CLI 创建 Azure Cosmos DB

以下过程使用 CLI 创建 Azure Cosmos DB 数据库。

  1. 登录到 Azure CLI 并设置订阅 ID。

    az login
    
  2. 根据需要设置订阅 ID。

    az account set -s <your-subscription-id>
    
  3. 创建 Azure 资源组,并记下资源组名称供以后使用。

    az group create \
        --name <your-azure-group-name> \
        --location <your-resource-group-region>
    
  4. 创建 Azure Cosmos DB,并将类型指定为 GlobalDocumentDB。 Azure Cosmos DB 的名称只能使用小写字母。 请务必记下响应中的 documentEndpoint 字段。 稍后需要用到此值。

    az cosmosdb create \
        --resource-group <your-resource-group-name> \
        --name <your-azure-COSMOS-DB-name-in-lower-case-letters> \
        --kind GlobalDocumentDB
    
  5. 获取 Azure Cosmos DB 密钥,记录 primaryMasterKey 值供以后使用。

    az cosmosdb keys list \
        --resource-group <your-azure-group-name> \
        --name <your-azure-COSMOSDB-name>
    

在本地生成并运行应用

以下过程在开发计算机上运行该应用程序。

  1. 在所选控制台中,使用前面在本文中收集的 Azure 和 Azure Cosmos DB 连接信息配置以下代码部分中所示的环境变量。 需要为 REGION 变量提供WEBAPP_NAME的唯一名称和

    对于 Linux (Bash):

    export COSMOS_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
    export COSMOS_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
    export COSMOS_DATABASE=<put-your-COSMOS-DATABASE-name-here>
    export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
    export WEBAPP_NAME=<put-your-Webapp-name-here>
    export REGION=<put-your-REGION-here>
    export SUBSCRIPTION_ID=<put-your-SUBSCRIPTION_ID-here>
    

    对于 Windows(命令提示符):

    set COSMOS_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
    set COSMOS_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
    set COSMOS_DATABASE=<put-your-COSMOS-DATABASE-name-here>
    set RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
    set WEBAPP_NAME=<put-your-Webapp-name-here>
    set REGION=<put-your-REGION-here>
    set SUBSCRIPTION_ID=<put-your-SUBSCRIPTION_ID-here>
    

    注意

    若要通过脚本来预配这些变量,可以复制 .prep 目录中一个用于 Bash 的模板,从其着手进行操作。

  2. 使用以下命令更改目录:

    cd initial/spring-todo-app
    
  3. 使用以下命令在本地运行 Spring Todo 应用:

    mvn package spring-boot:run
    
  4. 应用程序启动后,可以通过访问此处的 Spring Todo 应用来验证部署: http://localhost:8080/

    Spring app running locally

部署到应用服务 Linux

以下过程将应用程序部署到 Azure 上的 Linux。

  1. 打开之前复制到存储库的初始/spring-todo-app 目录的 pom.xml 文件。 确保包含以下 pom.xml 文件中所示的用于Azure App 服务Maven 插件。 如果版本未设置为 1.14.0,请更新该值。

    <plugins> 
    
        <!--*************************************************-->
        <!-- Deploy to Java SE in App Service Linux           -->
        <!--*************************************************-->
    
        <plugin>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-webapp-maven-plugin</artifactId>
            <version>1.14.0</version>
            <configuration>
                <schemaVersion>v2</schemaVersion>
                <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
                <!-- Web App information -->
                <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
                <appName>${WEBAPP_NAME}</appName>
                <region>${REGION}</region>
                <pricingTier>P1v2</pricingTier>
                <!-- Java Runtime Stack for Web App on Linux-->
                <runtime>
                    <os>Linux</os>
                    <javaVersion>Java 8</javaVersion>
                    <webContainer>Java SE</webContainer>
                </runtime>
                <deployment>
                    <resources>
                        <resource>
                            <directory>${project.basedir}/target</directory>
                            <includes>
                                <include>*.jar</include>
                            </includes>
                        </resource>
                    </resources>
                </deployment>
                <appSettings>
                    <property>
                        <name>COSMOS_URI</name>
                        <value>${COSMOS_URI}</value>
                    </property>
                    <property>
                        <name>COSMOS_KEY</name>
                        <value>${COSMOS_KEY}</value>
                    </property>
                    <property>
                        <name>COSMOS_DATABASE</name>
                        <value>${COSMOS_DATABASE}</value>
                    </property>
                    <property>
                        <name>JAVA_OPTS</name>
                        <value>-Dserver.port=80</value>
                    </property>
                </appSettings>
    
            </configuration>
        </plugin>            
        ...
    </plugins>
    
  2. 部署到应用服务 Linux 中的 Java SE

    mvn azure-webapp:deploy
    
    // Deploy
    bash-3.2$ mvn azure-webapp:deploy
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------< com.azure.spring.samples:spring-todo-app >--------
    [INFO] Building spring-todo-app 2.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- azure-webapp-maven-plugin:1.14.0:deploy (default-cli) @ spring-todo-app ---
    Auth type: AZURE_CLI
    Default subscription: Consoto Subscription(subscription-id-xxx)
    Username: user@contoso.com
    [INFO] Subscription: Consoto Subscription(subscription-id-xxx)
    [INFO] Creating app service plan...
    [INFO] Successfully created app service plan asp-spring-todo-app.
    [INFO] Creating web app spring-todo-app...
    [INFO] Successfully created Web App spring-todo-app.
    [INFO] Trying to deploy artifact to spring-todo-app...
    [INFO] Successfully deployed the artifact to https://spring-todo-app.azurewebsites.net
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  02:05 min
    [INFO] Finished at: 2021-05-28T09:43:19+08:00
    [INFO] ------------------------------------------------------------------------
    
  3. 浏览到在应用服务 Linux 中的 Java SE 上运行的 Web 应用:

    https://<WEBAPP_NAME>.azurewebsites.net
    

Spring app running in App Service on Linux

通过查看日志,排查 Azure 上的 Spring Todo 应用的问题

以下过程打开 Azure 上的日志文件。

  1. 为 Linux 中的 Azure 应用服务中部署的 Java Web 应用配置日志:

    az webapp log config \
        --name ${WEBAPP_NAME} \
        --resource-group ${RESOURCEGROUP_NAME} \
        --web-server-logging filesystem
    
  2. 从本地计算机打开 Java Web 应用远程日志流:

    az webapp log tail \
        --name ${WEBAPP_NAME} \
        --resource-group ${RESOURCEGROUP_NAME}
    
    bash-3.2$ az webapp log tail --name ${WEBAPP_NAME}  --resource-group ${RESOURCEGROUP_NAME}
    2021-05-28T01:46:08.000655632Z   _____                               
    2021-05-28T01:46:08.000701432Z   /  _  \ __________ _________   ____  
    2021-05-28T01:46:08.000708133Z  /  /_\  \___   /  |  \_  __ \_/ __ \ 
    2021-05-28T01:46:08.000711733Z /    |    \/    /|  |  /|  | \/\  ___/ 
    2021-05-28T01:46:08.000714933Z \____|__  /_____ \____/ |__|    \___  >
    2021-05-28T01:46:08.000718233Z         \/      \/                  \/ 
    2021-05-28T01:46:08.000721333Z A P P   S E R V I C E   O N   L I N U X
    2021-05-28T01:46:08.000724233Z Documentation: http://aka.ms/webapp-linux
    ...
    ...
    2021-05-28T01:46:18.925044188Z   .   ____          _            __ _ _
    2021-05-28T01:46:18.925481392Z  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    2021-05-28T01:46:18.926004297Z ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    2021-05-28T01:46:18.926587603Z  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
    2021-05-28T01:46:18.926599403Z   '  |____| .__|_| |_|_| |_\__, | / / / /
    2021-05-28T01:46:18.926841806Z  =========|_|==============|___/=/_/_/_/
    2021-05-28T01:46:18.931157849Z  :: Spring Boot ::                (v2.4.5)
    ...
    ...
    2021-05-28T01:46:29.842553633Z 2021-05-28 01:46:29.842  INFO 124 --- [           main] c.azure.spring.   samples.TodoApplication   : Started TodoApplication in 12.635 seconds (JVM running for 17.664)
    2021-05-28T01:46:30.477951594Z 2021-05-28 01:46:30.477  INFO 124 --- [p-nio-80-exec-1] o.a.c.c.C.   [Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
    2021-05-28T01:46:30.483316162Z 2021-05-28 01:46:30.483  INFO 124 --- [p-nio-80-exec-1] o.s.web.   servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
    2021-05-28T01:46:30.485411088Z 2021-05-28 01:46:30.484  INFO 124 --- [p-nio-80-exec-1] o.s.web.   servlet.DispatcherServlet        : Completed initialization in 0 ms
    2021-05-28T01:47:19.683003828Z 2021-05-28 01:47:19.682  INFO 124 --- [p-nio-80-exec-9] c.a.s.s.   controller.TodoListController    : GET request access '/api/todolist' path.
    2021-05-28T01:47:26.069984388Z 2021-05-28 01:47:26.069  INFO 124 --- [-nio-80-exec-10] c.a.s.s.   controller.TodoListController    : POST request access '/api/todolist' path with item: Milk
    2021-05-28T01:47:26.649080678Z 2021-05-28 01:47:26.648  INFO 124 --- [p-nio-80-exec-1] c.a.s.s.   controller.TodoListController    : GET request access '/api/todolist' path.
    

横向扩展 Spring Todo 应用

使用以下过程缩放应用程序。

  1. 使用 Azure CLI 横向扩展 Java Web 应用:

    az appservice plan update \
        --number-of-workers 2 \
        --name ${WEBAPP_PLAN_NAME} \
        --resource-group ${RESOURCEGROUP_NAME}
    

后续步骤

另请参阅

有关使用 Azure 上的 Spring Boot 应用程序的详细信息,请参阅以下文章:

有关如何将 Azure 与 Java 配合使用的详细信息,请参阅面向 Java 开发人员的 Azure使用 Azure DevOps 和 Java

Spring Framework 是一种开放源代码解决方案,可帮助 Java 开发人员创建企业级应用程序。 基于该平台构建的其中一个更常用的项目是 Spring Boot,该项目提供了一种用于创建独立 Java 应用程序的简化方法。 为帮助开发人员开始使用 Spring Boot,https://github.com/spring-guides/ 上提供了几个 Spring Boot 示例。 除了从基本的 Spring Boot 项目列表中选择之外,Spring Initializr 也可帮助开发人员开始创建自定义 Spring Boot 应用程序