教程:将 Dapr 服务调用用于微服务通信

在基于微服务的应用程序中,可以使用分布式应用程序运行时(Dapr)来提高微服务之间的通信的安全性和可靠性。 为了加密传输中的数据, Dapr 服务调用 API 使用自动相互传输层安全性(mTLS)。 为了可靠性,此 API 提供复原功能,可在调用失败和暂时性错误后执行自动重试。

本教程使用包含以下组件的示例服务调用项目:

  • 调用checkout方服务,该服务在循环中使用 HTTP 代理,通过 Dapr 服务调用 API 向order-processor服务发出请求。
  • 通过 order-processor Dapr 服务调用 API 从 checkout 服务接收请求的被调用方服务

结帐和订单处理器服务之间的通信关系图。通信通过 Dapr 流动,并使用 mTLS 加密和重试。

在本教程中,你将:

  • 创建使用 Dapr 服务调用 API 进行通信的两个微服务。
  • 在本地运行应用程序。
  • 使用示例项目中提供的 Azure 开发人员 CLI 和 Bicep 文件将应用程序部署到 Azure 容器应用。

先决条件

在本地运行 Node.js 应用程序

将应用程序部署到容器应用之前,请执行以下部分中的步骤,使用 Dapr 在本地运行 order-processor 和服务 checkout

准备项目

  1. 示例应用程序克隆到本地计算机。

    git clone https://github.com/Azure-Samples/svc-invoke-dapr-nodejs.git
    
  2. 转到示例根目录。

    cd svc-invoke-dapr-nodejs
    

使用 Dapr CLI 运行应用程序

执行以下步骤运行 order-processor 服务和 checkout 服务。

  1. 从示例根目录转到 订单处理器 目录。

    cd order-processor
    
  2. 安装依赖项。

    npm install
    
  3. 运行 order-processor 服务。

    dapr run --app-port 5001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- npm start
    
  4. 在新终端窗口中,转到示例根目录,然后转到 签出 目录。

    cd checkout
    
  5. 安装依赖项。

    npm install
    
  6. 运行 checkout 服务。

    dapr run  --app-id checkout --app-protocol http --dapr-http-port 3500 -- npm start
    

预期输出

checkout 终端中,checkout 服务向 order-processor 服务发送 20 个订单的信息,然后暂时暂停。

== APP == Order passed: {"orderId":1}
== APP == Order passed: {"orderId":2}
== APP == Order passed: {"orderId":3}
== APP == Order passed: {"orderId":4}
== APP == Order passed: {"orderId":5}
== APP == Order passed: {"orderId":6}
== APP == Order passed: {"orderId":7}
== APP == Order passed: {"orderId":8}
== APP == Order passed: {"orderId":9}
== APP == Order passed: {"orderId":10}
== APP == Order passed: {"orderId":11}
== APP == Order passed: {"orderId":12}
== APP == Order passed: {"orderId":13}
== APP == Order passed: {"orderId":14}
== APP == Order passed: {"orderId":15}
== APP == Order passed: {"orderId":16}
== APP == Order passed: {"orderId":17}
== APP == Order passed: {"orderId":18}
== APP == Order passed: {"orderId":19}
== APP == Order passed: {"orderId":20}

order-processor 终端中,服务 order-processor 接收有关 20 个订单的信息,然后暂时暂停。

== APP == Order received: { orderId: 1 }
== APP == Order received: { orderId: 2 }
== APP == Order received: { orderId: 3 }
== APP == Order received: { orderId: 4 }
== APP == Order received: { orderId: 5 }
== APP == Order received: { orderId: 6 }
== APP == Order received: { orderId: 7 }
== APP == Order received: { orderId: 8 }
== APP == Order received: { orderId: 9 }
== APP == Order received: { orderId: 10 }
== APP == Order received: { orderId: 11 }
== APP == Order received: { orderId: 12 }
== APP == Order received: { orderId: 13 }
== APP == Order received: { orderId: 14 }
== APP == Order received: { orderId: 15 }
== APP == Order received: { orderId: 16 }
== APP == Order received: { orderId: 17 }
== APP == Order received: { orderId: 18 }
== APP == Order received: { orderId: 19 }
== APP == Order received: { orderId: 20 }

停止应用程序

在两个终端中选择 Cmd/Ctrl+C 以停止服务到服务调用。

使用 Azure 开发人员 CLI 部署应用程序模板

若要使用 azd 命令将应用程序部署到容器应用,请执行以下步骤。

准备项目

在新终端窗口中,转到 示例 根目录。

cd svc-invoke-dapr-nodejs

使用 Azure 开发人员 CLI 创建和部署

  1. 运行 azd init 以初始化项目。

    azd init
    

    在终端中出现提示时,输入唯一的环境名称。 该命令将此名称用作创建用于保存所有 Azure 资源的资源组的前缀。

  2. 运行 azd up 以准备基础结构,并在单个命令中将应用程序部署到容器应用。

    azd up
    

    当终端中出现提示时,请提供以下参数。

    参数 说明
    Azure 位置 Azure 资源的位置
    Azure 订阅 您资源的 Azure 订阅

    此过程可能需要一些时间来完成。 azd up运行命令时,输出会显示两个可用于监视部署进度的 Azure 门户链接。 输出还演示了如何使用 azd up

    • 使用 ./infra 目录中的 Bicep 文件通过 azd provision 创建和配置所有必要的 Azure 资源。 在 Azure 开发人员 CLI 部署这些资源后,可以使用 Azure 门户访问它们。 用于配置 Azure 资源的文件包括:
      • main.parameters.json
      • main.bicep.
      • 按功能组织的 应用 资源目录。
      • 包含模板使用的 Bicep 模块的核心引用库。
    • 使用 azd deploy 来部署代码。

    如果此步骤导致 错误 BCP420,请转到克隆的存储库,打开 svc-invoke-dapr-nodejs/infra/core/host/container-apps.bicep 文件,并将第 28 行替换为以下行:

    scope: resourceGroup(!empty(containerRegistryResourceGroupName) ? containerRegistryResourceGroupName : resourceGroup().name)
    

预期输出

azd init 命令显示类似于以下行的输出:

Initializing an app to run on Azure (azd init)

? Enter a unique environment name: [? for help] <environment-name>

? Enter a unique environment name: <environment-name>

SUCCESS: Initialized environment <environment-name>.

azd up 命令显示类似于以下行的输出:

? Select an Azure Subscription to use:  3. <subscription-name> (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e)
? Enter a value for the 'location' infrastructure parameter: 51. (US) China East 2 (chinaeast2)

Packaging services (azd package)

  (✓) Done: Packaging service api
  - Container: service-invoke-dapr-node-aca/api-<environment-name>:azd-deploy-1765226976

  (✓) Done: Packaging service worker
  - Container: service-invoke-dapr-node-aca/worker-<environment-name>:azd-deploy-1765226992

Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.

Subscription: <subscription-name> (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e)
Location: China East 2

  You can view detailed progress in the Azure portal:
  https://portal.azure.cn/#view/HubsExtension/DeploymentDetailsBlade/~/overview/id/%2Fsubscriptions%2Faaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e%2Fproviders%2FMicrosoft.Resources%2Fdeployments%2F<environment-name>-1765226998

  (✓) Done: Resource group: rg-<environment-name> (2.341s)
  (✓) Done: Log Analytics workspace: log-a1bc2de3fh4ij (25.882s)
  (✓) Done: Application Insights: appi-a1bc2de3fh4ij (1.314s)
  (✓) Done: Portal dashboard: dash-a1bc2de3fh4ij (1.833s)
  (✓) Done: Container Registry: cra1bc2de3fh4ij (17.672s)
  (✓) Done: Container Apps Environment: cae-a1bc2de3fh4ij (1m53.997s)
  (✓) Done: Container App: ca-checkout-a1bc2de3fh4ij (27.995s)
  (✓) Done: Container App: ca-order-processor-a1bc2de3fh4ij (22.651s)

Deploying services (azd deploy)

  (✓) Done: Deploying service api
  - Endpoint: https://ca-order-processor-a1bc2de3fh4ij.wittymeadow-c2de3fh4.chinaeast2.azurecontainerapps.io/

  (✓) Done: Deploying service worker
  - Endpoint: https://ca-checkout-a1bc2de3fh4ij.wittymeadow-c2de3fh4.chinaeast2.azurecontainerapps.io/

SUCCESS: Your up workflow to provision and deploy to Azure completed in 5 minutes 31 seconds.

确认部署是否成功

若要验证 checkout 服务是否将订单传递给 order-processor 服务,请执行以下步骤。

  1. 在终端输出中复制checkout容器应用名称。

  2. 登录到 Azure 门户,然后按名称搜索容器应用资源。

  3. 在“容器应用 概述 ”页上,选择“ 监视>日志流”。

    Azure 门户端面板的屏幕截图。在“监视”下,突出显示了日志流。

  4. “日志流 ”页上的 “容器”旁边,选择 “签出”。

    结账容器应用程序的日志流页面屏幕截图。容器列表中已将结账容器突出显示。

  5. 确认 checkout 容器记录的输出是否与前面在终端中显示的输出相同。

    Connecting to stream...
    2025-12-09T14:04:33.45953  Connecting to the container 'checkout'...
    2025-12-09T14:04:33.53740  Successfully Connected to container: 'checkout' [Revision: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010-e3fh4ij5kl-6mn7o']
    2025-12-09T14:04:24.125429697Z Order passed: {"orderId":1}
    2025-12-09T14:04:25.132356280Z Order passed: {"orderId":2}
    2025-12-09T14:04:26.138280828Z Order passed: {"orderId":3}
    2025-12-09T14:04:27.143795525Z Order passed: {"orderId":4}
    2025-12-09T14:04:28.149049451Z Order passed: {"orderId":5}
    2025-12-09T14:04:29.155266540Z Order passed: {"orderId":6}
    2025-12-09T14:04:30.160579732Z Order passed: {"orderId":7}
    2025-12-09T14:04:31.165857030Z Order passed: {"orderId":8}
    2025-12-09T14:04:32.171575903Z Order passed: {"orderId":9}
    2025-12-09T14:04:33.176673433Z Order passed: {"orderId":10}
    2025-12-09T14:04:34.183728937Z Order passed: {"orderId":11}
    2025-12-09T14:04:35.191018777Z Order passed: {"orderId":12}
    2025-12-09T14:04:36.196886189Z Order passed: {"orderId":13}
    2025-12-09T14:04:37.203280592Z Order passed: {"orderId":14}
    2025-12-09T14:04:38.209860731Z Order passed: {"orderId":15}
    2025-12-09T14:04:39.230493897Z Order passed: {"orderId":16}
    2025-12-09T14:04:40.236164211Z Order passed: {"orderId":17}
    2025-12-09T14:04:41.242369482Z Order passed: {"orderId":18}
    2025-12-09T14:04:42.249403792Z Order passed: {"orderId":19}
    2025-12-09T14:04:43.255729366Z Order passed: {"orderId":20}
    
  6. order-processor 服务执行类似的步骤。

    Connecting to stream...
    2025-12-09T14:04:40.56424  Connecting to the container 'order-processor'...
    2025-12-09T14:04:40.58332  Successfully Connected to container: 'order-processor' [Revision: 'ca-order-processor-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-order-processor-a1bc2de3fh4ij--azd-1010101010-8qr9st0uv1wx2y']
    2025-12-09T14:04:24.116375837Z Order received: { orderId: 1 }
    2025-12-09T14:04:25.128718200Z Order received: { orderId: 2 }
    2025-12-09T14:04:26.134766577Z Order received: { orderId: 3 }
    2025-12-09T14:04:27.140414040Z Order received: { orderId: 4 }
    2025-12-09T14:04:28.145763273Z Order received: { orderId: 5 }
    2025-12-09T14:04:29.152026156Z Order received: { orderId: 6 }
    2025-12-09T14:04:30.157316984Z Order received: { orderId: 7 }
    2025-12-09T14:04:31.162593847Z Order received: { orderId: 8 }
    2025-12-09T14:04:32.168252075Z Order received: { orderId: 9 }
    2025-12-09T14:04:33.173389844Z Order received: { orderId: 10 }
    2025-12-09T14:04:34.178499336Z Order received: { orderId: 11 }
    2025-12-09T14:04:35.186679161Z Order received: { orderId: 12 }
    2025-12-09T14:04:36.193541819Z Order received: { orderId: 13 }
    2025-12-09T14:04:37.200040677Z Order received: { orderId: 14 }
    2025-12-09T14:04:38.206379653Z Order received: { orderId: 15 }
    2025-12-09T14:04:39.227185042Z Order received: { orderId: 16 }
    2025-12-09T14:04:40.232518266Z Order received: { orderId: 17 }
    2025-12-09T14:04:41.239199248Z Order received: { orderId: 18 }
    2025-12-09T14:04:42.245578021Z Order received: { orderId: 19 }
    2025-12-09T14:04:43.252568045Z Order received: { orderId: 20 }
    

了解 azd up,请参阅相关技术文档以获取详细信息

azd up命令成功运行时:

  • Azure 开发人员 CLI 会在指定的 Azure 订阅中的 示例项目 ./infra 目录中 创建引用的 Azure 资源。 可以在 Azure 门户中找到这些 Azure 资源。
  • 应用程序已部署到 Container Apps。 在 Azure 门户中,可以访问功能齐全的应用。

在本地运行 Python 应用程序

将应用程序部署到容器应用之前,请执行以下部分中的步骤,使用 Dapr 在本地运行 order-processor 和服务 checkout

准备项目

  1. 示例应用程序克隆到本地计算机。

    git clone https://github.com/Azure-Samples/svc-invoke-dapr-python.git
    
  2. 转到示例根目录。

    cd svc-invoke-dapr-python
    

使用 Dapr CLI 运行应用程序

执行以下步骤运行 order-processor 服务和 checkout 服务。

  1. 从示例根目录转到 订单处理器 目录。

    cd order-processor
    
  2. 安装依赖项。

    pip3 install -r requirements.txt
    
  3. 运行 order-processor 服务。

    dapr run --app-port 8001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- python app.py
    

  1. 在新终端窗口中,转到示例根目录,然后转到 签出 目录。

    cd checkout
    
  2. 安装依赖项。

    pip3 install -r requirements.txt
    
  3. 运行 checkout 服务。

    dapr run  --app-id checkout --app-protocol http --dapr-http-port 3500 -- python app.py
    

预期输出

checkout 终端,checkout 服务向 order-processor 服务发送有关 19 个订单的信息,然后暂时暂停。

== APP == Order passed: {"orderId": 1}
== APP == Order passed: {"orderId": 2}
== APP == Order passed: {"orderId": 3}
== APP == Order passed: {"orderId": 4}
== APP == Order passed: {"orderId": 5}
== APP == Order passed: {"orderId": 6}
== APP == Order passed: {"orderId": 7}
== APP == Order passed: {"orderId": 8}
== APP == Order passed: {"orderId": 9}
== APP == Order passed: {"orderId": 10}
== APP == Order passed: {"orderId": 11}
== APP == Order passed: {"orderId": 12}
== APP == Order passed: {"orderId": 13}
== APP == Order passed: {"orderId": 14}
== APP == Order passed: {"orderId": 15}
== APP == Order passed: {"orderId": 16}
== APP == Order passed: {"orderId": 17}
== APP == Order passed: {"orderId": 18}
== APP == Order passed: {"orderId": 19}

order-processor 终端中,服务 order-processor 接收有关 19 个订单的信息,然后暂时暂停。

== APP == Order received : {"orderId": 1}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:08] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 2}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:09] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 3}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:10] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 4}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:11] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 5}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:12] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 6}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:13] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 7}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:14] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 8}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:15] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 9}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:16] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 10}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:17] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 11}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:18] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 12}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:19] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 13}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:20] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 14}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:21] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 15}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:22] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 16}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:23] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 17}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:24] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 18}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:25] "POST /orders HTTP/1.1" 200 -
== APP == Order received : {"orderId": 19}
== APP == 127.0.0.1 - - [08/Dec/2025 16:42:26] "POST /orders HTTP/1.1" 200 -

停止应用程序

在两个终端中选择 Cmd/Ctrl+C 以停止服务到服务调用。

使用 Azure 开发人员 CLI 部署应用程序模板

若要使用 azd 命令将应用程序部署到容器应用,请执行以下步骤。

准备项目

在新终端窗口中,转到 示例 根目录。

cd svc-invoke-dapr-python

使用 Azure 开发人员 CLI 创建和部署

  1. 运行 azd init 以初始化项目。

    azd init
    

    在终端中出现提示时,输入唯一的环境名称。 该命令将此名称用作创建用于保存所有 Azure 资源的资源组的前缀。

  2. 运行 azd up 以准备基础结构,并在单个命令中将应用程序部署到容器应用。

    azd up
    

    当终端中出现提示时,请提供以下参数。

    参数 说明
    Azure 位置 Azure 资源的位置
    Azure 订阅 您资源的 Azure 订阅

    此过程可能需要一些时间来完成。 azd up运行命令时,输出会显示两个可用于监视部署进度的 Azure 门户链接。 输出还演示了如何使用 azd up

    • 使用 ./infra 目录中的 Bicep 文件通过 azd provision 创建和配置所有必要的 Azure 资源。 在 Azure 开发人员 CLI 部署这些资源后,可以使用 Azure 门户访问它们。 用于配置 Azure 资源的文件包括:
      • main.parameters.json
      • main.bicep.
      • 按功能组织的 应用 资源目录。
      • 包含模板使用的 Bicep 模块的核心引用库。
    • 使用 azd deploy 来部署代码。

预期输出

azd init 命令显示类似于以下行的输出:

Initializing an app to run on Azure (azd init)

? Enter a unique environment name: [? for help] <environment-name>

? Enter a unique environment name: <environment-name>

SUCCESS: Initialized environment <environment-name>.

azd up 命令显示类似于以下行的输出:

? Select an Azure Subscription to use:  3. <subscription-name> (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e)
? Enter a value for the 'location' infrastructure parameter: 51. (US) China East 2 (chinaeast2)

Packaging services (azd package)

  (✓) Done: Packaging service api
  - Container: service-invoke-dapr-node-aca/api-<environment-name>:azd-deploy-1765230378

  (✓) Done: Packaging service worker
  - Container: service-invoke-dapr-node-aca/worker-<environment-name>:azd-deploy-1765230379

Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.

Subscription: <subscription-name> (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e)
Location: China East 2

  You can view detailed progress in the Azure portal:
  https://portal.azure.cn/#view/HubsExtension/DeploymentDetailsBlade/~/overview/id/%2Fsubscriptions%2Faaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e%2Fproviders%2FMicrosoft.Resources%2Fdeployments%2F<environment-name>-1765230385

  (✓) Done: Resource group: rg-<environment-name> (1.633s)
  (✓) Done: Log Analytics workspace: log-a1bc2de3fh4ij (21.209s)
  (✓) Done: Application Insights: appi-a1bc2de3fh4ij (1.32s)
  (✓) Done: Portal dashboard: dash-a1bc2de3fh4ij (430ms)
  (✓) Done: Container Registry: cra1bc2de3fh4ij (20.632s)
  (✓) Done: Container Apps Environment: cae-a1bc2de3fh4ij (1m53.401s)
  (✓) Done: Container App: ca-order-processor-a1bc2de3fh4ij (49.189s)
  (✓) Done: Container App: ca-checkout-a1bc2de3fh4ij (47.751s)

Deploying services (azd deploy)

  (✓) Done: Deploying service api
  - Endpoint: https://ca-order-processor-a1bc2de3fh4ij.livelyriver-c2de3fh4.chinaeast2.azurecontainerapps.io/

  (✓) Done: Deploying service worker

SUCCESS: Your up workflow to provision and deploy to Azure completed in 5 minutes 22 seconds.

确认部署是否成功

若要验证 checkout 服务是否将订单传递给 order-processor 服务,请执行以下步骤。

  1. 在终端输出中复制checkout容器应用名称。

  2. 登录到 Azure 门户,然后按名称搜索容器应用资源。

  3. 在“容器应用 概述 ”页上,选择“ 监视>日志流”。

    Azure 门户中侧面板的屏幕截图。在“监视”下,突出显示了日志流。

  4. “日志流 ”页上的 “容器”旁边,选择 “签出”。

    结账容器应用程序日志流页面的屏幕截图。在“容器”列表中,“结账”被突出显示并选中。

  5. 确认 checkout 容器记录的输出是否与前面在终端中显示的输出相同。

    Connecting to stream...
    2025-12-08T21:52:13.30188  Connecting to the container 'checkout'...
    2025-12-08T21:52:13.32059  Successfully Connected to container: 'checkout' [Revision: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010-e3fh4ij5kl-6mn7o']
    2025-12-08T21:51:50.336588427Z Order passed: {"orderId": 1}
    2025-12-08T21:51:51.344226554Z Order passed: {"orderId": 2}
    2025-12-08T21:51:52.352458279Z Order passed: {"orderId": 3}
    2025-12-08T21:51:53.359545509Z Order passed: {"orderId": 4}
    2025-12-08T21:51:54.367664737Z Order passed: {"orderId": 5}
    2025-12-08T21:51:55.375686968Z Order passed: {"orderId": 6}
    2025-12-08T21:51:56.384068096Z Order passed: {"orderId": 7}
    2025-12-08T21:51:57.392023627Z Order passed: {"orderId": 8}
    2025-12-08T21:51:58.400084856Z Order passed: {"orderId": 9}
    2025-12-08T21:51:59.407839688Z Order passed: {"orderId": 10}
    2025-12-08T21:52:00.415796718Z Order passed: {"orderId": 11}
    2025-12-08T21:52:01.423684349Z Order passed: {"orderId": 12}
    2025-12-08T21:52:02.431038891Z Order passed: {"orderId": 13}
    2025-12-08T21:52:03.438415598Z Order passed: {"orderId": 14}
    2025-12-08T21:52:04.445862305Z Order passed: {"orderId": 15}
    2025-12-08T21:52:05.454030709Z Order passed: {"orderId": 16}
    2025-12-08T21:52:06.462323213Z Order passed: {"orderId": 17}
    2025-12-08T21:52:07.469778904Z Order passed: {"orderId": 18}
    2025-12-08T21:52:08.478176259Z Order passed: {"orderId": 19}
    
  6. order-processor 服务执行类似的步骤。

    Connecting to stream...
    2025-12-08T21:52:21.69283  Connecting to the container 'order-processor'...
    2025-12-08T21:52:21.71200  Successfully Connected to container: 'order-processor' [Revision: 'ca-order-processor-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-order-processor-a1bc2de3fh4ij--azd-1010101010-8qr9st0uv1wx2y']
    2025-12-08T21:52:08.466641579Z 127.0.0.1 - - [08/Dec/2025 21:52:08] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:19.484297503Z Order received : {"orderId": 1}
    2025-12-08T21:52:19.484712607Z 127.0.0.1 - - [08/Dec/2025 21:52:19] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:20.492919969Z Order received : {"orderId": 2}
    2025-12-08T21:52:20.493318072Z 127.0.0.1 - - [08/Dec/2025 21:52:20] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:21.501517134Z Order received : {"orderId": 3}
    2025-12-08T21:52:21.501881937Z 127.0.0.1 - - [08/Dec/2025 21:52:21] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:22.509507378Z Order received : {"orderId": 4}
    2025-12-08T21:52:22.510107685Z 127.0.0.1 - - [08/Dec/2025 21:52:22] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:23.518153270Z Order received : {"orderId": 5}
    2025-12-08T21:52:23.519026380Z 127.0.0.1 - - [08/Dec/2025 21:52:23] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:24.526933360Z Order received : {"orderId": 6}
    2025-12-08T21:52:24.528534270Z 127.0.0.1 - - [08/Dec/2025 21:52:24] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:25.536263633Z Order received : {"orderId": 7}
    2025-12-08T21:52:25.536895737Z 127.0.0.1 - - [08/Dec/2025 21:52:25] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:26.544453199Z Order received : {"orderId": 8}
    2025-12-08T21:52:26.545099303Z 127.0.0.1 - - [08/Dec/2025 21:52:26] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:27.552418814Z Order received : {"orderId": 9}
    2025-12-08T21:52:27.552886419Z 127.0.0.1 - - [08/Dec/2025 21:52:27] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:28.560536453Z Order received : {"orderId": 10}
    2025-12-08T21:52:28.560978457Z 127.0.0.1 - - [08/Dec/2025 21:52:28] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:29.569267098Z Order received : {"orderId": 11}
    2025-12-08T21:52:29.569883405Z 127.0.0.1 - - [08/Dec/2025 21:52:29] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:30.577652340Z Order received : {"orderId": 12}
    2025-12-08T21:52:30.578145945Z 127.0.0.1 - - [08/Dec/2025 21:52:30] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:31.585742379Z Order received : {"orderId": 13}
    2025-12-08T21:52:31.586148183Z 127.0.0.1 - - [08/Dec/2025 21:52:31] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:32.593496421Z Order received : {"orderId": 14}
    2025-12-08T21:52:32.594131028Z 127.0.0.1 - - [08/Dec/2025 21:52:32] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:33.602273111Z Order received : {"orderId": 15}
    2025-12-08T21:52:33.604202631Z 127.0.0.1 - - [08/Dec/2025 21:52:33] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:34.610559896Z Order received : {"orderId": 16}
    2025-12-08T21:52:34.610927600Z 127.0.0.1 - - [08/Dec/2025 21:52:34] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:35.618588379Z Order received : {"orderId": 17}
    2025-12-08T21:52:35.619991693Z 127.0.0.1 - - [08/Dec/2025 21:52:35] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:36.628053075Z Order received : {"orderId": 18}
    2025-12-08T21:52:36.628608981Z 127.0.0.1 - - [08/Dec/2025 21:52:36] "POST /orders HTTP/1.1" 200 -
    2025-12-08T21:52:37.638211579Z Order received : {"orderId": 19}
    2025-12-08T21:52:37.638144079Z 127.0.0.1 - - [08/Dec/2025 21:52:37] "POST /orders HTTP/1.1" 200 -
    

了解 azd up,请参阅相关技术文档以获取详细信息

azd up命令成功运行时:

  • Azure 开发人员 CLI 会在指定的 Azure 订阅中的 示例项目 ./infra 目录中 创建引用的 Azure 资源。 可以在 Azure 门户中找到这些 Azure 资源。
  • 应用程序已部署到 Container Apps。 在 Azure 门户中,可以访问功能齐全的应用。

在本地运行 .NET 应用程序

将应用程序部署到容器应用之前,请执行以下部分中的步骤,使用 Dapr 在本地运行 order-processor 和服务 checkout

准备项目

  1. 示例应用程序克隆到本地计算机。

    git clone https://github.com/Azure-Samples/svc-invoke-dapr-csharp.git
    
  2. 转到示例根目录。

    cd svc-invoke-dapr-csharp
    

使用 Dapr CLI 运行应用程序

执行以下步骤运行 order-processor 服务和 checkout 服务。

  1. 从示例根目录转到 订单处理器 目录。

    cd order-processor
    
  2. 安装依赖项。

    dotnet build
    
  3. 运行 order-processor 服务。

    dapr run --app-port 7001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- dotnet run
    
  4. 在新终端窗口中,转到示例根目录,然后转到 签出 目录。

    cd checkout
    
  5. 安装依赖项。

    dotnet build
    
  6. 运行 checkout 服务。

    dapr run  --app-id checkout --app-protocol http --dapr-http-port 3500 -- dotnet run
    

预期输出

checkout 终端中,checkout 服务向 order-processor 服务发送 20 个订单的信息,然后暂时暂停。

== APP == Order passed: Order { OrderId = 1 }
== APP == Order passed: Order { OrderId = 2 }
== APP == Order passed: Order { OrderId = 3 }
== APP == Order passed: Order { OrderId = 4 }
== APP == Order passed: Order { OrderId = 5 }
== APP == Order passed: Order { OrderId = 6 }
== APP == Order passed: Order { OrderId = 7 }
== APP == Order passed: Order { OrderId = 8 }
== APP == Order passed: Order { OrderId = 9 }
== APP == Order passed: Order { OrderId = 10 }
== APP == Order passed: Order { OrderId = 11 }
== APP == Order passed: Order { OrderId = 12 }
== APP == Order passed: Order { OrderId = 13 }
== APP == Order passed: Order { OrderId = 14 }
== APP == Order passed: Order { OrderId = 15 }
== APP == Order passed: Order { OrderId = 16 }
== APP == Order passed: Order { OrderId = 17 }
== APP == Order passed: Order { OrderId = 18 }
== APP == Order passed: Order { OrderId = 19 }
== APP == Order passed: Order { OrderId = 20 }

order-processor 终端中,服务 order-processor 接收有关 20 个订单的信息,然后暂时暂停。

== APP == Order received : Order { orderId = 1 }
== APP == Order received : Order { orderId = 2 }
== APP == Order received : Order { orderId = 3 }
== APP == Order received : Order { orderId = 4 }
== APP == Order received : Order { orderId = 5 }
== APP == Order received : Order { orderId = 6 }
== APP == Order received : Order { orderId = 7 }
== APP == Order received : Order { orderId = 8 }
== APP == Order received : Order { orderId = 9 }
== APP == Order received : Order { orderId = 10 }
== APP == Order received : Order { orderId = 11 }
== APP == Order received : Order { orderId = 12 }
== APP == Order received : Order { orderId = 13 }
== APP == Order received : Order { orderId = 14 }
== APP == Order received : Order { orderId = 15 }
== APP == Order received : Order { orderId = 16 }
== APP == Order received : Order { orderId = 17 }
== APP == Order received : Order { orderId = 18 }
== APP == Order received : Order { orderId = 19 }
== APP == Order received : Order { orderId = 20 }

停止应用程序

在两个终端中选择 Cmd/Ctrl+C 以停止服务到服务调用。

使用 Azure 开发人员 CLI 部署应用程序模板

使用 azd 将应用程序部署到 Azure 容器应用。

准备项目

在新终端窗口中,转到 示例 根目录。

cd svc-invoke-dapr-csharp

使用 Azure 开发人员 CLI 创建和部署

  1. 运行 azd init 以初始化项目。

    azd init
    

    在终端中出现提示时,输入唯一的环境名称。 该命令将此名称用作创建用于保存所有 Azure 资源的资源组的前缀。

  2. 运行 azd up 以准备基础结构,并在单个命令中将应用程序部署到容器应用。

    azd up
    

    当终端中出现提示时,请提供以下参数。

    参数 说明
    Azure 位置 Azure 资源的位置
    Azure 订阅 您资源的 Azure 订阅

    此过程可能需要一些时间来完成。 azd up运行命令时,输出会显示两个可用于监视部署进度的 Azure 门户链接。 输出还演示了如何使用 azd up

    • 使用 ./infra 目录中的 Bicep 文件通过 azd provision 创建和配置所有必要的 Azure 资源。 在 Azure 开发人员 CLI 部署这些资源后,可以使用 Azure 门户访问它们。 用于配置 Azure 资源的文件包括:
      • main.parameters.json
      • main.bicep.
      • 按功能组织的 应用 资源目录。
      • 包含模板使用的 Bicep 模块的核心引用库。
    • 使用 azd deploy 来部署代码。

    如果此步骤导致 错误 BCP420,请转到克隆的存储库,打开 svc-invoke-dapr-csharp/infra/core/host/container-apps.bicep 文件,并将第 28 行替换为以下行:

    scope: resourceGroup(!empty(containerRegistryResourceGroupName) ? containerRegistryResourceGroupName : resourceGroup().name)
    

预期输出

azd init 命令显示类似于以下行的输出:

Initializing an app to run on Azure (azd init)

? Enter a unique environment name: [? for help] <environment-name>

? Enter a unique environment name: <environment-name>

SUCCESS: Initialized environment <environment-name>.

azd up 命令显示类似于以下行的输出:

? Select an Azure Subscription to use:  3. <subscription-name> (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e)
? Enter a value for the 'location' infrastructure parameter: 51. (US) China East 2 (chinaeast2)

Packaging services (azd package)

  (✓) Done: Packaging service api
  - Container: service-invoke-dapr-dotnet-aca/api-<environment-name>:azd-deploy-1765290820

  (✓) Done: Packaging service worker
  - Container: service-invoke-dapr-dotnet-aca/worker-<environment-name>:azd-deploy-1765290828

Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.

Subscription: <subscription-name> (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e)
Location: China East 2

  You can view detailed progress in the Azure portal:
  https://portal.azure.cn/#view/HubsExtension/DeploymentDetailsBlade/~/overview/id/%2Fsubscriptions%2Faaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e%2Fproviders%2FMicrosoft.Resources%2Fdeployments%2F<environment-name>-1765290834

  (✓) Done: Resource group: rg-<environment-name> (1.95s)
  (✓) Done: Log Analytics workspace: log-a1bc2de3fh4ij (21.073s)
  (✓) Done: Application Insights: appi-a1bc2de3fh4ij (3.339s)
  (✓) Done: Portal dashboard: dash-a1bc2de3fh4ij (1.791s)
  (✓) Done: Container Registry: cra1bc2de3fh4ij (18.521s)
  (✓) Done: Container Apps Environment: cae-a1bc2de3fh4ij (1m54.347s)
  (✓) Done: Container App: ca-order-processor-a1bc2de3fh4ij (20.447s)
  (✓) Done: Container App: ca-checkout-a1bc2de3fh4ij (19.159s)

Deploying services (azd deploy)

  (✓) Done: Deploying service api
  - Endpoint: https://ca-order-processor-a1bc2de3fh4ij.blackmoss-c2de3fh4.chinaeast2.azurecontainerapps.io/

  (✓) Done: Deploying service worker

SUCCESS: Your up workflow to provision and deploy to Azure completed in 5 minutes 14 seconds.

确认部署是否成功

若要验证 checkout 服务是否将订单传递给 order-processor 服务,请执行以下步骤。

  1. 在终端输出中复制checkout容器应用名称。

  2. 登录到 Azure 门户,然后按名称搜索容器应用资源。

  3. 在“容器应用 概述 ”页上,选择“ 监视>日志流”。

    Azure 门户的屏幕截图。在侧面板的“监视”下,突出显示了日志流。

  4. “日志流 ”页上的 “容器”旁边,选择 “签出”。

    结帐容器应用日志流页面的屏幕截图。在日志流上方的容器列表中,结帐被突出显示。

  5. 确认 checkout 容器记录的输出是否与前面在终端中显示的输出相同。

    Connecting to stream...
    2025-12-09T15:10:41.47802  Connecting to the container 'checkout'...
    2025-12-09T15:10:41.51661  Successfully Connected to container: 'checkout' [Revision: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010-e3fh4ij5kl-6mn7o']
    2025-12-09T15:10:35.970525383Z Order passed: Order { OrderId = 1 }
    2025-12-09T15:10:36.974299140Z Order passed: Order { OrderId = 2 }
    2025-12-09T15:10:37.977372717Z Order passed: Order { OrderId = 3 }
    2025-12-09T15:10:38.980052480Z Order passed: Order { OrderId = 4 }
    2025-12-09T15:10:39.983760836Z Order passed: Order { OrderId = 5 }
    2025-12-09T15:10:40.987032666Z Order passed: Order { OrderId = 6 }
    2025-12-09T15:10:41.990514871Z Order passed: Order { OrderId = 7 }
    2025-12-09T15:10:42.993271242Z Order passed: Order { OrderId = 8 }
    2025-12-09T15:10:43.996447160Z Order passed: Order { OrderId = 9 }
    2025-12-09T15:10:44.999515468Z Order passed: Order { OrderId = 10 }
    2025-12-09T15:10:46.003606414Z Order passed: Order { OrderId = 11 }
    2025-12-09T15:10:47.006857265Z Order passed: Order { OrderId = 12 }
    2025-12-09T15:10:48.012116293Z Order passed: Order { OrderId = 13 }
    2025-12-09T15:10:49.015322253Z Order passed: Order { OrderId = 14 }
    2025-12-09T15:10:50.018667962Z Order passed: Order { OrderId = 15 }
    2025-12-09T15:10:51.019739902Z Order passed: Order { OrderId = 16 }
    2025-12-09T15:10:52.021675650Z Order passed: Order { OrderId = 17 }
    2025-12-09T15:10:53.024514318Z Order passed: Order { OrderId = 18 }
    2025-12-09T15:10:54.028031299Z Order passed: Order { OrderId = 19 }
    2025-12-09T15:10:55.031371921Z Order passed: Order { OrderId = 20 }
    
  6. order-processor 服务执行类似的步骤。

    Connecting to stream...
    2025-12-09T15:01:47.03912  Connecting to the container 'order-processor'...
    2025-12-09T15:01:47.07513  Successfully Connected to container: 'order-processor' [Revision: 'ca-order-processor-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-order-processor-a1bc2de3fh4ij--azd-1010101010-e3fh4ij5kl6mn7']
    2025-12-09T15:10:35.961828162Z Order received : Order { orderId = 1 }
    2025-12-09T15:10:36.971520049Z Order received : Order { orderId = 2 }
    2025-12-09T15:10:37.974663292Z Order received : Order { orderId = 3 }
    2025-12-09T15:10:38.977375837Z Order received : Order { orderId = 4 }
    2025-12-09T15:10:39.980547949Z Order received : Order { orderId = 5 }
    2025-12-09T15:10:40.984127518Z Order received : Order { orderId = 6 }
    2025-12-09T15:10:41.987422901Z Order received : Order { orderId = 7 }
    2025-12-09T15:10:42.990385188Z Order received : Order { orderId = 8 }
    2025-12-09T15:10:43.993530965Z Order received : Order { orderId = 9 }
    2025-12-09T15:10:44.996506444Z Order received : Order { orderId = 10 }
    2025-12-09T15:10:46.000838163Z Order received : Order { orderId = 11 }
    2025-12-09T15:10:47.004060023Z Order received : Order { orderId = 12 }
    2025-12-09T15:10:48.007760527Z Order received : Order { orderId = 13 }
    2025-12-09T15:10:49.012628202Z Order received : Order { orderId = 14 }
    2025-12-09T15:10:50.016058393Z Order received : Order { orderId = 15 }
    2025-12-09T15:10:51.016443730Z Order received : Order { orderId = 16 }
    2025-12-09T15:10:52.018312472Z Order received : Order { orderId = 17 }
    2025-12-09T15:10:53.021307966Z Order received : Order { orderId = 18 }
    2025-12-09T15:10:54.025018485Z Order received : Order { orderId = 19 }
    2025-12-09T15:10:55.028189928Z Order received : Order { orderId = 20 }
    

了解 azd up,请参阅相关技术文档以获取详细信息

azd up命令成功运行时:

  • Azure 开发人员 CLI 会在指定的 Azure 订阅中的 示例项目 ./infra 目录中 创建引用的 Azure 资源。 可以在 Azure 门户中找到这些 Azure 资源。
  • 应用程序已部署到 Container Apps。 在 Azure 门户中,可以访问功能齐全的应用。

清理资源

如果不打算继续使用此应用程序,请运行以下命令以删除创建的 Azure 资源:

azd down