将 Spring Data 与 Azure Cosmos DB for Apache Cassandra API 配合使用
本文将指导你完成在 Linux 上的 Azure 应用服务中生成、配置、部署、故障排除和缩放 Java Web 应用的过程。
它将演示以下组件的用法:
先决条件
若要执行本文中的步骤,需要满足以下先决条件:
- 若要将 Java Web 应用部署到云,需要一个 Azure 订阅。 如果还没有 Azure 订阅,可以激活 MSDN 订阅者权益或注册免费 Azure 帐户。
- Azure CLI 2.0
- Java 8 JDK
- Maven 3
重要
完成本文中的步骤需要 Spring Boot 2.5 或更高版本。
克隆示例 Java Web 应用存储库
在本练习中,你将使用 Spring Todo 应用,这是使用 Spring Boot生成的 Java 应用程序,适用于 Azure Cosmos DB 的 Spring Data,Azure Cosmos DB。
克隆 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
将目录更改为克隆存储库中的以下文件夹:
cd initial\spring-todo-app
从 Azure CLI 创建 Azure Cosmos DB
以下过程使用 CLI 创建 Azure Cosmos DB 数据库。
登录到 Azure CLI 并设置订阅 ID。
az login
根据需要设置订阅 ID。
az account set -s <your-subscription-id>
创建 Azure 资源组,并保存资源组名称供以后使用。
az group create \ --name <your-azure-group-name> \ --location <your-resource-group-region>
创建 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
获取 Azure Cosmos DB 密钥,记录
primaryMasterKey
值以供以后使用。az cosmosdb keys list \ --resource-group <your-azure-group-name> \ --name <your-azure-COSMOSDB-name>
在本地生成并运行应用
以下过程在开发计算机上运行应用程序。
在所选控制台中,使用前面在本文中收集的 Azure 和 Azure Cosmos DB 连接信息配置以下代码部分中所示的环境变量。 需要为 WEBAPP_NAME 提供唯一名称,并为 REGION 变量提供一个值。
对于 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 模板,可以复制并用作起点。
使用以下命令更改目录:
cd initial/spring-todo-app
使用以下命令在本地运行 Spring Todo 应用:
mvn package spring-boot:run
应用程序启动后,可以通过访问此处的 Spring Todo 应用来验证部署:
http://localhost:8080/
。
部署到 Linux 版应用服务上
以下过程将应用程序部署到 Azure 上的 Linux。
打开之前复制到存储库的 initial/spring-todo-app 目录的 pom.xml 文件。 确保 Azure 应用服务 的
Maven 插件包含在以下 pom.xml 文件中。 如果版本未设置为 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>
部署到 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] ------------------------------------------------------------------------
请访问在 Linux 版应用服务中的 Java SE 上运行的 Web 应用:
https://<WEBAPP_NAME>.azurewebsites.net
通过查看日志排查 Azure 上的 Spring Todo 应用问题
以下过程将在 Azure 上打开日志文件。
在 Linux 的 Azure 应用服务中为部署的 Java Web 应用配置日志:
az webapp log config \ --name ${WEBAPP_NAME} \ --resource-group ${RESOURCEGROUP_NAME} \ --web-server-logging filesystem
从本地计算机打开 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 应用
使用以下流程扩展应用程序。
使用 Azure CLI 横向扩展 Java Web 应用:
az appservice plan update \ --number-of-workers 2 \ --name ${WEBAPP_PLAN_NAME} \ --resource-group ${RESOURCEGROUP_NAME}
后续步骤
- Linux 版应用服务中的 Java 开发指南
- Azure for Java 开发人员 若要详细了解 Spring 和 Azure,请继续访问 Azure 上的 Spring 文档中心。
另请参阅
有关在 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 应用程序。