你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用 Azure 资源管理器或 Bicep 模板将 Dapr 应用程序部署到 Azure 容器应用
Dapr (Distributed Application Runtime) 是一种运行时,可帮助构建可复原、无状态和有状态的微服务。 在本教程中,示例 Dapr 解决方案通过 Azure 资源管理器 (ARM) 或 Bicep 模板部署到 Azure 容器应用。
学习如何:
- 创建用作 Dapr 状态存储的 Azure Blob 存储
- 部署容器应用环境来托管容器应用
- 部署两个启用了 dapr 的容器应用:一个用于生成订单,另一个使用订单并存储它们
- 将用户分配的标识分配给容器应用,并向其提供适当的角色分配来向 Dapr 状态存储进行身份验证
- 验证两项微服务之间的交互情况。
使用 Azure 容器应用,你可以在生成微服务时获得完全托管的 Dapr API 版本。 在 Azure 容器应用中使用 Dapr 时,可以让挎斗在提供一组丰富功能的微服务旁边运行。
在本教程中,你将通过 Dapr Hello World 快速入门部署解决方案。
此应用程序包括:
- 用于生成消息的客户端 (Python) 容器应用。
- 一个服务(节点)容器应用,用于在状态存储中消费和持久化这些消息
下面的体系结构关系图说明了构成本教程的组件:
先决条件
设置
首先,登录到 Azure。
az login
确保通过 upgrade 命令运行最新版本的 CLI,然后安装 Azure CLI 的 Azure 容器应用扩展。
az upgrade
az extension add --name containerapp --upgrade
安装当前扩展或模块后,注册 Microsoft.App
命名空间。
az provider register --namespace Microsoft.App
接下来,设置以下环境变量:
RESOURCE_GROUP="my-container-apps"
LOCATION="centralus"
CONTAINERAPPS_ENVIRONMENT="my-environment"
定义这些变量后,可创建一个资源组来整理本教程需要的服务。
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
准备 GitHub 存储库
转到包含用于部署解决方案的 ARM 和 Bicep 模板的存储库。
选择存储库顶部的“创建分支”按钮,在你的帐户中创建该存储库的分支。
现在,可克隆该分支以在本地使用它。
使用以下 git 命令将分支存储库克隆到 acadapr-templates 目录。
git clone https://github.com/$GITHUB_USERNAME/Tutorial-Deploy-Dapr-Microservices-ACA.git acadapr-templates
部署
模板会部署以下内容:
- 一个容器应用环境
- 一个与容器应用环境关联的 Log Analytics 工作区
- 一个用于分布式跟踪的 Application Insights 资源
- 一个 Blob 存储帐户和一个默认的存储容器
- 一个用于 Blob 存储帐户的 Dapr 组件
- 节点 - 已启用 Dapr 的容器应用,具有用户分配的托管标识:hello-k8s-node
- python - 已启用 Dapr 的容器应用:hello-k8s-python
- 节点应用的 Active Directory 角色分配,供 Dapr 组件用来建立与 Blob 存储的连接
导航到 acadapr-templates 目录并运行以下命令:
az deployment group create \
--resource-group "$RESOURCE_GROUP" \
--template-file ./azuredeploy.json \
--parameters environment_name="$CONTAINERAPPS_ENVIRONMENT"
可能会出现 (BCP081) 警告。 此警告对应用程序的成功部署没有影响。
az deployment group create \
--resource-group "$RESOURCE_GROUP" \
--template-file ./azuredeploy.bicep \
--parameters environment_name="$CONTAINERAPPS_ENVIRONMENT"
此命令部署以下内容:
- 容器应用环境和关联的 Log Analytics 工作区,用于托管 hello world Dapr 解决方案
- 一个 Application Insights 实例,用于 Dapr 分布式跟踪
- 已启用 Dapr 并使用
"appId": "nodeapp"
和"appPort": 3000
配置的targetPort: 3000
上运行的nodeapp
应用服务器,以及通过“存储数据参与者”角色分配有权访问 Azure Blob 存储的用户分配的标识 - 范围为
"type": "state.azure.blobstorage"
的 Dapr 组件,供nodeapp
用来存储状态 - 已启用 Dapr 的无外设
pythonapp
,它使用 Dapr 服务调用来调用nodeapp
服务
验证结果
确认状态持久性是否成功
可以通过查看 Azure 存储帐户中的数据来确认服务是否正常工作。
在浏览器中,打开 Azure 门户。
转到资源组中新创建的存储帐户。
从左侧的菜单中选择“容器”。
选择创建的容器。
验证是否可以在容器中看到名为
order
的文件。选择文件。
选择“编辑”选项卡。
选择“刷新”按钮以查看更新。
查看日志
通过容器应用记录的数据存储在 Log Analytics 工作区的 ContainerAppConsoleLogs_CL
自定义表中。 可以通过 Azure 门户或命令行查看日志。 分析结果第一次到达要等待几分钟,然后才能查询记录的数据。
使用以下命令在 bash 或 PowerShell 中查看日志。
LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`
az monitor log-analytics query \
--workspace "$LOG_ANALYTICS_WORKSPACE_CLIENT_ID" \
--analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | take 5" \
--out table
以下输出演示了期望从命令获得的响应类型。
ContainerAppName_s Log_s TableName TimeGenerated
-------------------- ------------------------------- ------------- ------------------------
nodeapp Got a new order! Order ID: 61 PrimaryResult 2021-10-22T21:31:46.184Z
nodeapp Successfully persisted state. PrimaryResult 2021-10-22T21:31:46.184Z
nodeapp Got a new order! Order ID: 62 PrimaryResult 2021-10-22T22:01:57.174Z
nodeapp Successfully persisted state. PrimaryResult 2021-10-22T22:01:57.174Z
nodeapp Got a new order! Order ID: 63 PrimaryResult 2021-10-22T22:45:44.618Z
清理资源
完成后,运行以下命令以删除你的资源组以及你在本教程中创建的所有资源。
az group delete \
--resource-group $RESOURCE_GROUP
注意
由于 pythonapp
通过持久保存在配置的状态存储中的消息持续调用 nodeapp
,因此请务必完成这些清理步骤,以免计费操作持续进行。
提示
遇到问题? 在 Azure 容器应用存储库中提交问题,告知我们有关 GitHub 的信息。