共用方式為


教學:使用 Dapr 發佈並訂閱微服務通訊

在發佈/訂閱(pub/sub)系統中,你可以使用 分散式應用程式執行時(Distributed Application Runtime,DAPR) 來簡化並標準化微服務與訊息代理之間的通訊。

  • 出版商應用程式透過 Dapr 側車發佈訊息。 側車負責與代理的實際溝通。
  • 訂閱應用程式透過 Dapr 副車接收訊息。 Sidecar 會從代理程式接收訊息,並以訊息承載來調用訂閱者應用程式的端點。

這個教學會用一個範例專案來示範如何運行 Dapr 發佈/訂閱系統。 此範例包括:

  • 一個訊息產生 checkout 器服務(發布者),能產生特定主題的訊息。
  • 一個 order-processor 服務(訂閱者)會監聽來自 checkout 特定主題服務的訊息。

圖示顯示訊息流程:從結帳應用程式透過 Dapr 傳送至服務匯流排,然後從服務匯流排透過 Dapr 傳送至訂單處理應用程式。

在本教學課程中,您會:

  • 建立一個發佈微服務和一個訂閱微服務,利用 Dapr 發佈/訂閱 API 來發送和接收事件驅動架構的訊息。
  • 使用範例專案中提供的 Azure Developer CLI 和 Bicep 檔案,將應用程式部署到 Azure 容器應用。

先決條件

在本機執行 Node.js 應用程式

在將應用程式部署到 Container Apps 之前,請按照以下章節的步驟,透過 Dapr 和 Azure Service Bus 在本地執行 order-processor and checkout 服務。

準備專案

  1. 範例應用程式複製到您的本機。

    git clone https://github.com/Azure-Samples/pubsub-dapr-nodejs-servicebus.git
    
  2. 前往範例根目錄。

    cd pubsub-dapr-nodejs-servicebus
    

透過使用 Dapr CLI 執行應用程式

請採取以下步驟來執行 order-processor 訂閱服務與 checkout 出版商服務。

  1. 從範例根目錄,前往 order-processor 目錄。

    cd order-processor
    
  2. 安裝相依性。

    npm install
    
  3. 執行 order-processor 服務。

    dapr run --app-port 5001 --app-id order-processing --app-protocol http --dapr-http-port 3501 --resources-path ../components -- npm run start
    
  4. 在新的終端機視窗中,前往範例根目錄,然後再進入 結帳 目錄。

    cd checkout
    
  5. 安裝相依性。

    npm install
    
  6. 執行 checkout 服務。

    dapr run --app-id checkout --app-protocol http --resources-path ../components -- npm run start
    

預期的輸出

checkout 終端機中, checkout 服務會發布 20 則訊息,然後暫時暫停。

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

order-processor 終端機中, order-processor 服務會接收 20 則訊息。

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

停止申請

要停止應用程式,請開啟獨立終端機並執行以下指令:

dapr stop --app-id checkout
dapr stop --app-id order-processor

請使用 Azure Developer CLI 部署應用程式範本

要透過 azd 指令部署應用程式到容器應用程式,請依以下章節步驟進行。

準備專案

在新的終端機視窗中,前往 範例 根目錄。

cd pubsub-dapr-nodejs-servicebus

透過使用 Azure Developer CLI 建立與部署

  1. 執行 azd init 以初始化專案。

    azd init
    

    當終端機顯示提示時,輸入一個唯一的環境名稱。 指令會用這個名稱作為它建立的資源群組前綴,用來存放所有 Azure 資源。

  2. azd up執行以準備基礎架構,並以單一指令部署應用程式至容器應用程式。

    azd up
    

    當終端機中提示時,輸入以下參數的值:

    參數 描述
    Azure 訂用帳戶 您的資源所使用的 Azure 訂用帳戶
    Azure 位置 資源的 Azure 位置

    這個過程可能需要一些時間才能完成。 當指令執行時 azd up ,輸出會顯示兩個 Azure 入口網站連結,你可以用來監控部署進度。 輸出也示範 azd up 如何運作:

    • 透過 ./infra 目錄中的 Bicep 檔案建立並配置所有必要的 Azure 資源,使用 azd provision. Azure Developer 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) East US 2 (eastus2)

Packaging services (azd package)

  (✓) Done: Packaging service checkout
  - Container: pubsub-dapr-javascript-servicebus-aca/checkout-<environment-name>:azd-deploy-1764784418


  (✓) Done: Packaging service orders
  - Container: pubsub-dapr-javascript-servicebus-aca/orders-<environment-name>:azd-deploy-1764784420


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

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

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

  (✓) Done: Resource group: rg-<environment-name> (2.805s)
  (✓) Done: Service Bus Namespace: sb-a1bc2de3fh4ij (17.866s)
  (✓) Done: Log Analytics workspace: log-a1bc2de3fh4ij (23.262s)
  (✓) Done: Application Insights: appi-a1bc2de3fh4ij (3.167s)
  (✓) Done: Portal dashboard: dash-a1bc2de3fh4ij (1.858s)
  (✓) Done: Container Registry: cra1bc2de3fh4ij (20.097s)
  (✓) Done: Container Apps Environment: cae-a1bc2de3fh4ij (1m39.71s)
  (✓) Done: Container App: ca-orders-a1bc2de3fh4ij (19.927s)
  (✓) Done: Container App: ca-checkout-a1bc2de3fh4ij (20.213s)

Deploying services (azd deploy)

  (✓) Done: Deploying service checkout

  (✓) Done: Deploying service orders
  - Endpoint: https://ca-orders-a1bc2de3fh4ij.gentlebeach-c2de3fh4.eastus2.azurecontainerapps.io/


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

確認部署成功

請採取以下步驟確認 checkout 服務確實將訊息發佈到服務匯流排主題,且 order-processor 服務確實接收到訊息。

  1. 在終端機輸出中,複製 checkout 容器應用程式名稱。

  2. 登入 Azure 入口網站,然後依名稱搜尋容器應用程式資源。

  3. 在容器應用程式 的概覽 頁面,選擇 監控>日誌串流

    Azure Portal 側邊面板的截圖。在監控中,日誌串流會被標示出來。

  4. 在「Log stream」頁面,於容器旁邊,選擇「檢視」

    結帳容器應用程式的日誌串流頁面截圖。在容器清單中,結帳會被標示出來。

  5. 確認 checkout 容器記錄與先前在終端機中的輸出相同。

    Connecting to stream...
    2025-12-03T17:59:44.86984  Connecting to the container 'checkout'...
    
    2025-12-03T17:59:44.88762  Successfully Connected to container: 'checkout' [Revision: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010-e3fh4ij5kl-6mn7o']
    2025-12-03T17:59:20.110076973Z Published data: {"orderId":1}
    2025-12-03T17:59:21.122761423Z Published data: {"orderId":2}
    2025-12-03T17:59:22.134562301Z Published data: {"orderId":3}
    2025-12-03T17:59:23.148699507Z Published data: {"orderId":4}
    2025-12-03T17:59:24.160779162Z Published data: {"orderId":5}
    2025-12-03T17:59:25.176694795Z Published data: {"orderId":6}
    2025-12-03T17:59:26.189284846Z Published data: {"orderId":7}
    2025-12-03T17:59:27.201353592Z Published data: {"orderId":8}
    2025-12-03T17:59:28.217884685Z Published data: {"orderId":9}
    2025-12-03T17:59:29.229885611Z Published data: {"orderId":10}
    2025-12-03T17:59:30.242877567Z Published data: {"orderId":11}
    2025-12-03T17:59:31.255062497Z Published data: {"orderId":12}
    2025-12-03T17:59:32.270373602Z Published data: {"orderId":13}
    2025-12-03T17:59:33.283227059Z Published data: {"orderId":14}
    2025-12-03T17:59:34.297275983Z Published data: {"orderId":15}
    2025-12-03T17:59:35.309770245Z Published data: {"orderId":16}
    2025-12-03T17:59:36.324099049Z Published data: {"orderId":17}
    2025-12-03T17:59:37.337279276Z Published data: {"orderId":18}
    2025-12-03T17:59:38.351045429Z Published data: {"orderId":19}
    2025-12-03T17:59:39.364701033Z Published data: {"orderId":20}
    
  6. order-processor 服務採取類似步驟。

    Connecting to stream...
    2025-12-03T17:59:54.59128  Connecting to the container 'orders'...
    
    2025-12-03T17:59:54.62517  Successfully Connected to container: 'orders' [Revision: 'ca-orders-h4ij5kl6mn7op--azd-1010101010', Replica: 'ca-orders-h4ij5kl6mn7op--azd-1010101010-8qr9st0uv1-wx2yz']
    2025-12-03T17:59:20.121003257Z Subscriber received: {"orderId":1}
    2025-12-03T17:59:21.134397375Z Subscriber received: {"orderId":2}
    2025-12-03T17:59:22.145897352Z Subscriber received: {"orderId":3}
    2025-12-03T17:59:23.159802356Z Subscriber received: {"orderId":4}
    2025-12-03T17:59:24.173394595Z Subscriber received: {"orderId":5}
    2025-12-03T17:59:25.188890235Z Subscriber received: {"orderId":6}
    2025-12-03T17:59:26.200088846Z Subscriber received: {"orderId":7}
    2025-12-03T17:59:27.212526588Z Subscriber received: {"orderId":8}
    2025-12-03T17:59:28.236604126Z Subscriber received: {"orderId":9}
    2025-12-03T17:59:29.242356323Z Subscriber received: {"orderId":10}
    2025-12-03T17:59:30.253994680Z Subscriber received: {"orderId":11}
    2025-12-03T17:59:31.267712900Z Subscriber received: {"orderId":12}
    2025-12-03T17:59:32.282449416Z Subscriber received: {"orderId":13}
    2025-12-03T17:59:33.296803973Z Subscriber received: {"orderId":14}
    2025-12-03T17:59:34.308987729Z Subscriber received: {"orderId":15}
    2025-12-03T17:59:35.321011193Z Subscriber received: {"orderId":16}
    2025-12-03T17:59:36.336338712Z Subscriber received: {"orderId":17}
    2025-12-03T17:59:37.347838169Z Subscriber received: {"orderId":18}
    2025-12-03T17:59:38.370022121Z Subscriber received: {"orderId":19}
    2025-12-03T17:59:39.377157717Z Subscriber received: {"orderId":20}
    

理解 azd up 的功能與用法

當指令成功執行時:azd up

  • Azure Developer CLI 會建立你指定的 Azure 訂閱中範例 專案 ./infra 目錄 中引用的 Azure 資源。 你可以在 Azure 入口網站找到那些 Azure 資源。
  • 該應用程式已部署於容器應用程式。 在 Azure 入口網站中,你可以存取功能完整的應用程式。

在本機執行 Python 應用程式

在將應用程式部署到 Container Apps 之前,請按照以下章節的步驟,透過 Dapr 和 Azure Service Bus 在本地執行 order-processor and checkout 服務。

準備專案

  1. 範例應用程式複製到您的本機。

    git clone https://github.com/Azure-Samples/pubsub-dapr-python-servicebus.git
    
  2. 前往範例根目錄。

    cd pubsub-dapr-python-servicebus
    

透過使用 Dapr CLI 執行應用程式

請採取以下步驟來執行 order-processor 訂閱服務與 checkout 出版商服務。

  1. 從範例根目錄,前往 order-processor 目錄。

    cd order-processor
    
  2. 安裝相依性。

    pip3 install -r requirements.txt
    
  3. 執行 order-processor 服務。

    dapr run --app-id order-processor --resources-path ../components/ --app-port 5001 -- python app.py
    

  1. 在新的終端機視窗中,前往範例根目錄,然後再進入 結帳 目錄。

    cd checkout
    
  2. 安裝相依性。

    pip3 install -r requirements.txt
    
  3. 執行 checkout 服務。

    dapr run --app-id checkout --resources-path ../components/ -- python app.py
    

預期的輸出

checkout 終端機中, checkout 服務會發布 19 則訊息,然後暫時暫停。

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

order-processor 終端機中, order-processor 服務接收19則訊息。

== APP == Subscriber received : 1
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:28] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 2
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:29] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 3
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:30] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 4
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:31] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 5
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:32] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 6
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:33] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 7
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:34] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 8
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:35] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 9
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:36] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 10
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:37] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 11
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:38] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 12
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:39] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 13
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:40] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 14
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:41] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 15
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:42] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 16
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:43] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 17
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:44] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 18
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:45] "POST /orders HTTP/1.1" 200 -
== APP == Subscriber received : 19
== APP == 127.0.0.1 - - [03/Dec/2025 15:37:46] "POST /orders HTTP/1.1" 200 -

停止申請

要停止應用程式,請開啟獨立終端機並執行以下指令:

dapr stop --app-id checkout
dapr stop --app-id order-processor

請使用 Azure Developer CLI 部署應用程式範本

要透過 azd 指令部署應用程式到容器應用程式,請依以下章節步驟進行。

準備專案

在新的終端機視窗中,前往 範例 根目錄。

cd pubsub-dapr-python-servicebus

透過使用 Azure Developer CLI 建立與部署

  1. 執行 azd init 以初始化專案。

    azd init
    

    當終端機顯示提示時,輸入一個唯一的環境名稱。 指令會用這個名稱作為它建立的資源群組前綴,用來存放所有 Azure 資源。

  2. azd up執行以準備基礎架構,並以單一指令部署應用程式至容器應用程式。

    azd up
    

    當終端機中提示時,輸入以下參數的值:

    參數 描述
    Azure 訂用帳戶 您的資源所使用的 Azure 訂用帳戶
    Azure 位置 資源的 Azure 位置

    這個過程可能需要一些時間才能完成。 當指令執行時 azd up ,輸出會顯示兩個 Azure 入口網站連結,你可以用來監控部署進度。 輸出也示範 azd up 如何運作:

    • 透過 ./infra 目錄中的 Bicep 檔案建立並配置所有必要的 Azure 資源,使用 azd provision. Azure Developer 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) East US 2 (eastus2)

Packaging services (azd package)

  (✓) Done: Packaging service checkout
  - Container: pubsub-dapr-python-servicebus-aca/checkout-<environment-name>:azd-deploy-1764794878


  (✓) Done: Packaging service orders
  - Container: pubsub-dapr-python-servicebus-aca/orders-<environment-name>:azd-deploy-1764794880


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

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

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

  (✓) Done: Resource group: rg-<environment-name> (2.444s)
  (✓) Done: Service Bus Namespace: sb-a1bc2de3fh4ij (19.857s)
  (✓) Done: Log Analytics workspace: log-a1bc2de3fh4ij (21.144s)
  (✓) Done: Application Insights: appi-a1bc2de3fh4ij (1.154s)
  (✓) Done: Portal dashboard: dash-a1bc2de3fh4ij (573ms)
  (✓) Done: Container Registry: cra1bc2de3fh4ij (19.595s)
  (✓) Done: Container Apps Environment: cae-a1bc2de3fh4ij (1m26.226s)
  (✓) Done: Container App: ca-orders-a1bc2de3fh4ij (27.124s)
  (✓) Done: Container App: ca-checkout-a1bc2de3fh4ij (28.109s)

Deploying services (azd deploy)

  (✓) Done: Deploying service checkout

  (✓) Done: Deploying service orders
  - Endpoint: https://ca-orders-a1bc2de3fh4ij.icytree-c2de3fh4.eastus2.azurecontainerapps.io/


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

確認部署成功

請採取以下步驟確認 checkout 服務確實將訊息發佈到服務匯流排主題,且 order-processor 服務確實接收到訊息。

  1. 在終端機輸出中,複製 checkout 容器應用程式名稱。

  2. 登入 Azure 入口網站,然後依名稱搜尋容器應用程式資源。

  3. 在容器應用程式 的概覽 頁面,選擇 監控>日誌串流

    Azure 入口網站側邊面板的截圖。在監控中,日誌串流被標示出來。

  4. 在「Log stream」頁面,於容器旁邊,選擇「檢視」

    結帳容器應用程式的日誌串流頁面截圖。在容器清單中,結帳會被高亮並選取。

  5. 確認 checkout 容器記錄與先前在終端機中的輸出相同。

    Connecting to stream...
    2025-12-03T20:56:10.89517  Connecting to the container 'checkout'...
    
    2025-12-03T20:56:10.92655  Successfully Connected to container: 'checkout' [Revision: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010-e3fh4ij5kl-6mn7o']
    2025-12-03T20:55:54.971898941Z INFO:root:Published data: {"orderId": 1}
    2025-12-03T20:55:55.985395409Z INFO:root:Published data: {"orderId": 2}
    2025-12-03T20:55:57.002043502Z INFO:root:Published data: {"orderId": 3}
    2025-12-03T20:55:58.017690382Z INFO:root:Published data: {"orderId": 4}
    2025-12-03T20:55:59.032269801Z INFO:root:Published data: {"orderId": 5}
    2025-12-03T20:56:00.045075250Z INFO:root:Published data: {"orderId": 6}
    2025-12-03T20:56:01.058436708Z INFO:root:Published data: {"orderId": 7}
    2025-12-03T20:56:02.073213603Z INFO:root:Published data: {"orderId": 8}
    2025-12-03T20:56:03.088542130Z INFO:root:Published data: {"orderId": 9}
    2025-12-03T20:56:04.102553097Z INFO:root:Published data: {"orderId": 10}
    2025-12-03T20:56:05.116147371Z INFO:root:Published data: {"orderId": 11}
    2025-12-03T20:56:06.131053744Z INFO:root:Published data: {"orderId": 12}
    2025-12-03T20:56:07.144493474Z INFO:root:Published data: {"orderId": 13}
    2025-12-03T20:56:08.158381479Z INFO:root:Published data: {"orderId": 14}
    2025-12-03T20:56:09.175048175Z INFO:root:Published data: {"orderId": 15}
    2025-12-03T20:56:10.188971144Z INFO:root:Published data: {"orderId": 16}
    2025-12-03T20:56:11.202891285Z INFO:root:Published data: {"orderId": 17}
    2025-12-03T20:56:12.217084672Z INFO:root:Published data: {"orderId": 18}
    2025-12-03T20:56:13.229771418Z INFO:root:Published data: {"orderId": 19}
    
  6. order-processor 服務採取類似步驟。

    Connecting to stream...
    2025-12-03T20:56:18.74960  Connecting to the container 'orders'...
    
    2025-12-03T20:56:18.76913  Successfully Connected to container: 'orders' [Revision: 'ca-orders-h4ij5kl6mn7op--azd-1010101010', Replica: 'ca-orders-h4ij5kl6mn7op--azd-1010101010-8qr9st0uv1-wx2yz']
    2025-12-03T20:56:24.260129668Z Subscriber received : 1
    2025-12-03T20:56:24.260504460Z 127.0.0.1 - - [03/Dec/2025 20:56:24] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:25.286774893Z Subscriber received : 2
    2025-12-03T20:56:25.287837138Z 127.0.0.1 - - [03/Dec/2025 20:56:25] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:26.302102842Z Subscriber received : 3
    2025-12-03T20:56:26.302508442Z 127.0.0.1 - - [03/Dec/2025 20:56:26] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:27.316271178Z Subscriber received : 4
    2025-12-03T20:56:27.317288756Z 127.0.0.1 - - [03/Dec/2025 20:56:27] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:28.329865261Z Subscriber received : 5
    2025-12-03T20:56:28.330863461Z 127.0.0.1 - - [03/Dec/2025 20:56:28] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:29.342843607Z Subscriber received : 6
    2025-12-03T20:56:29.343687271Z 127.0.0.1 - - [03/Dec/2025 20:56:29] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:30.357753094Z Subscriber received : 7
    2025-12-03T20:56:30.358124513Z 127.0.0.1 - - [03/Dec/2025 20:56:30] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:31.380741546Z Subscriber received : 8
    2025-12-03T20:56:31.381553667Z 127.0.0.1 - - [03/Dec/2025 20:56:31] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:32.391023392Z Subscriber received : 9
    2025-12-03T20:56:32.391420895Z 127.0.0.1 - - [03/Dec/2025 20:56:32] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:33.405031572Z Subscriber received : 10
    2025-12-03T20:56:33.405412361Z 127.0.0.1 - - [03/Dec/2025 20:56:33] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:34.420146848Z Subscriber received : 11
    2025-12-03T20:56:34.420589649Z 127.0.0.1 - - [03/Dec/2025 20:56:34] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:35.432973524Z Subscriber received : 12
    2025-12-03T20:56:35.434080392Z 127.0.0.1 - - [03/Dec/2025 20:56:35] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:36.451629817Z Subscriber received : 13
    2025-12-03T20:56:36.452061763Z 127.0.0.1 - - [03/Dec/2025 20:56:36] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:37.467384128Z Subscriber received : 14
    2025-12-03T20:56:37.467686070Z 127.0.0.1 - - [03/Dec/2025 20:56:37] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:38.480558316Z Subscriber received : 15
    2025-12-03T20:56:38.481147786Z 127.0.0.1 - - [03/Dec/2025 20:56:38] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:39.493898658Z Subscriber received : 16
    2025-12-03T20:56:39.494203912Z 127.0.0.1 - - [03/Dec/2025 20:56:39] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:40.508312320Z Subscriber received : 17
    2025-12-03T20:56:40.508685327Z 127.0.0.1 - - [03/Dec/2025 20:56:40] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:41.534284222Z Subscriber received : 18
    2025-12-03T20:56:41.534598586Z 127.0.0.1 - - [03/Dec/2025 20:56:41] "POST /orders HTTP/1.1" 200 -
    2025-12-03T20:56:42.559478561Z Subscriber received : 19
    2025-12-03T20:56:42.559954290Z 127.0.0.1 - - [03/Dec/2025 20:56:42] "POST /orders HTTP/1.1" 200 -
    

理解 azd up 的功能與用法

當指令成功執行時:azd up

  • Azure Developer CLI 會建立你指定的 Azure 訂閱中範例 專案 ./infra 目錄 中引用的 Azure 資源。 你可以在 Azure 入口網站找到那些 Azure 資源。
  • 該應用程式已部署於容器應用程式。 在 Azure 入口網站中,你可以存取功能完整的應用程式。

在本機執行 .NET 應用程式

在將應用程式部署到 Container Apps 之前,請按照以下章節的步驟,透過 Dapr 和 Azure Service Bus 在本地執行 order-processor and checkout 服務。

準備專案

  1. 範例應用程式複製到您的本機。

    git clone https://github.com/Azure-Samples/pubsub-dapr-csharp-servicebus.git
    
  2. 前往範例根目錄。

    cd pubsub-dapr-csharp-servicebus
    

透過使用 Dapr CLI 執行應用程式

請採取以下步驟來執行 order-processor 訂閱服務與 checkout 出版商服務。

  1. 從範例根目錄,前往 order-processor 目錄。

    cd order-processor
    
  2. 安裝相依性。

    dotnet build
    
  3. 執行 order-processor 服務。

    dapr run --app-id order-processor --resources-path ../components/ --app-port 7001 -- dotnet run --project .
    
  4. 在新的終端機視窗中,前往範例根目錄,然後再進入 結帳 目錄。

    cd checkout
    
  5. 安裝相依性。

    dotnet build
    
  6. 執行 checkout 服務。

    dapr run --app-id checkout --resources-path ../components/ -- dotnet run --project .
    

預期的輸出

checkout 終端機中, checkout 服務會發布 20 則訊息,然後暫時暫停。

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

order-processor 終端機中, order-processor 服務會接收 20 則訊息。

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

停止申請

要停止應用程式,請開啟獨立終端機並執行以下指令:

dapr stop --app-id checkout
dapr stop --app-id order-processor

請使用 Azure Developer CLI 部署應用程式範本

要透過 azd 指令部署應用程式到容器應用程式,請依以下章節步驟進行。

準備專案

在新的終端機視窗中,前往 範例 根目錄。

cd pubsub-dapr-csharp-servicebus

透過使用 Azure Developer CLI 建立與部署

  1. 執行 azd init 以初始化專案。

    azd init
    

    當終端機顯示提示時,輸入一個唯一的環境名稱。 指令會用這個名稱作為它建立的資源群組前綴,用來存放所有 Azure 資源。

  2. azd up執行以準備基礎架構,並以單一指令部署應用程式至容器應用程式。

    azd up
    

    當終端機中提示時,輸入以下參數的值:

    參數 描述
    Azure 訂用帳戶 您的資源所使用的 Azure 訂用帳戶
    Azure 位置 資源的 Azure 位置

    這個過程可能需要一些時間才能完成。 當指令執行時 azd up ,輸出會顯示兩個 Azure 入口網站連結,你可以用來監控部署進度。 輸出也示範 azd up 如何運作:

    • 透過 ./infra 目錄中的 Bicep 檔案建立並配置所有必要的 Azure 資源,使用 azd provision. Azure Developer 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) East US 2 (eastus2)

Packaging services (azd package)

  (✓) Done: Packaging service checkout
  - Container: pubsub-dapr-csharp-servicebus/checkout-<environment-name>:azd-deploy-1764796559


  (✓) Done: Packaging service orders
  - Container: pubsub-dapr-csharp-servicebus/orders-<environment-name>:azd-deploy-1764796569


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

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

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

  (✓) Done: Resource group: rg-<environment-name> (1.727s)
  (✓) Done: Service Bus Namespace: sb-a1bc2de3fh4ij (18.228s)
  (✓) Done: Log Analytics workspace: log-a1bc2de3fh4ij (23.214s)
  (✓) Done: Application Insights: appi-a1bc2de3fh4ij (1.006s)
  (✓) Done: Portal dashboard: dash-a1bc2de3fh4ij (2.077s)
  (✓) Done: Container Registry: cra1bc2de3fh4ij (18.492s)
  (✓) Done: Container Apps Environment: cae-a1bc2de3fh4ij (1m53.753s)
  (✓) Done: Container App: ca-orders-a1bc2de3fh4ij (40.053s)
  (✓) Done: Container App: ca-checkout-a1bc2de3fh4ij (29.412s)

Deploying services (azd deploy)

  (✓) Done: Deploying service checkout

  (✓) Done: Deploying service orders
  - Endpoint: https://ca-orders-a1bc2de3fh4ij.whitecoast-c2de3fh4.eastus2.azurecontainerapps.io/


SUCCESS: Your up workflow to provision and deploy to Azure completed in 6 minutes 15 seconds.

確認部署成功

請採取以下步驟確認 checkout 服務確實將訊息發佈到服務匯流排主題,且 order-processor 服務確實接收到訊息。

  1. 從終端機輸出中複製 checkout 容器應用程式名稱。

  2. 登入 Azure 入口網站並依名稱搜尋容器應用程式資源。

  3. 在 Container Apps 儀表板中,選取監視>記錄串流

    Azure 入口網站的截圖。在側邊面板的監控下,日誌串流被高亮顯示。

  4. 在「Log stream」頁面,於容器旁邊,選擇「檢視」

    結帳容器應用程式的日誌串流頁面截圖。在日誌串流上方的容器清單中,結帳會被高亮顯示。

  5. 確認 checkout 容器記錄與先前在終端機中的輸出相同。

    Connecting to stream...
    2025-12-03T21:22:38.59199  Connecting to the container 'checkout'...
    
    2025-12-03T21:22:38.61294  Successfully Connected to container: 'checkout' [Revision: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010', Replica: 'ca-checkout-a1bc2de3fh4ij--azd-1010101010-e3fh4ij5kl-6mn7o']
    2025-12-03T21:22:25.764173919Z Published data: Order { OrderId = 1 }
    2025-12-03T21:22:26.775186594Z Published data: Order { OrderId = 2 }
    2025-12-03T21:22:27.785402134Z Published data: Order { OrderId = 3 }
    2025-12-03T21:22:28.795885226Z Published data: Order { OrderId = 4 }
    2025-12-03T21:22:29.818661172Z Published data: Order { OrderId = 5 }
    2025-12-03T21:22:30.833916028Z Published data: Order { OrderId = 6 }
    2025-12-03T21:22:31.847722919Z Published data: Order { OrderId = 7 }
    2025-12-03T21:22:32.858583147Z Published data: Order { OrderId = 8 }
    2025-12-03T21:22:33.868997259Z Published data: Order { OrderId = 9 }
    2025-12-03T21:22:34.879750628Z Published data: Order { OrderId = 10 }
    2025-12-03T21:22:35.889718195Z Published data: Order { OrderId = 11 }
    2025-12-03T21:22:36.905244880Z Published data: Order { OrderId = 12 }
    2025-12-03T21:22:37.915565325Z Published data: Order { OrderId = 13 }
    2025-12-03T21:22:38.926142458Z Published data: Order { OrderId = 14 }
    2025-12-03T21:22:39.937747578Z Published data: Order { OrderId = 15 }
    2025-12-03T21:22:40.952842205Z Published data: Order { OrderId = 16 }
    2025-12-03T21:22:41.964924464Z Published data: Order { OrderId = 17 }
    2025-12-03T21:22:42.974247022Z Published data: Order { OrderId = 18 }
    2025-12-03T21:22:43.988211319Z Published data: Order { OrderId = 19 }
    2025-12-03T21:22:44.997345767Z Published data: Order { OrderId = 20 }
    
  6. order-processor 服務執行相同操作。

    Connecting to stream...
    2025-12-03T21:23:11.36616  Connecting to the container 'orders'...
    
    2025-12-03T21:23:11.38606  Successfully Connected to container: 'orders' [Revision: 'ca-orders-h4ij5kl6mn7op--azd-1010101010', Replica: 'ca-orders-h4ij5kl6mn7op--azd-1010101010-8qr9st0uv1-wx2yz']
    2025-12-03T21:22:56.016634660Z Subscriber received : Order { OrderId = 1 }
    2025-12-03T21:22:57.092104858Z Subscriber received : Order { OrderId = 2 }
    2025-12-03T21:22:58.037571888Z Subscriber received : Order { OrderId = 3 }
    2025-12-03T21:22:59.047149782Z Subscriber received : Order { OrderId = 4 }
    2025-12-03T21:23:00.057088303Z Subscriber received : Order { OrderId = 5 }
    2025-12-03T21:23:01.085777239Z Subscriber received : Order { OrderId = 6 }
    2025-12-03T21:23:02.083886674Z Subscriber received : Order { OrderId = 7 }
    2025-12-03T21:23:03.091921022Z Subscriber received : Order { OrderId = 8 }
    2025-12-03T21:23:04.120860392Z Subscriber received : Order { OrderId = 9 }
    2025-12-03T21:23:05.127930191Z Subscriber received : Order { OrderId = 10 }
    2025-12-03T21:23:06.137896372Z Subscriber received : Order { OrderId = 11 }
    2025-12-03T21:23:07.242953880Z Subscriber received : Order { OrderId = 12 }
    2025-12-03T21:23:08.255497831Z Subscriber received : Order { OrderId = 13 }
    2025-12-03T21:23:09.264101960Z Subscriber received : Order { OrderId = 14 }
    2025-12-03T21:23:10.278569058Z Subscriber received : Order { OrderId = 15 }
    2025-12-03T21:23:11.297722094Z Subscriber received : Order { OrderId = 16 }
    2025-12-03T21:23:12.294944386Z Subscriber received : Order { OrderId = 17 }
    2025-12-03T21:23:13.306328648Z Subscriber received : Order { OrderId = 18 }
    2025-12-03T21:23:14.322317879Z Subscriber received : Order { OrderId = 19 }
    2025-12-03T21:23:15.076995284Z Subscriber received : Order { OrderId = 20 }
    

理解 azd up 的功能與用法

當指令成功執行時:azd up

  • Azure Developer CLI 會建立你指定的 Azure 訂閱中範例 專案 ./infra 目錄 中引用的 Azure 資源。 你可以在 Azure 入口網站找到那些 Azure 資源。
  • 該應用程式已部署於容器應用程式。 在 Azure 入口網站中,你可以存取功能完整的應用程式。

清除資源

如果你不打算繼續使用這個應用程式,請使用以下指令刪除你建立的 Azure 資源:

azd down