共用方式為


教學課程:使用 Dapr 和 MQTT 訊息代理程式建置事件驅動應用程式

在本逐步解說中,您會將 Dapr 應用程式部署至叢集。 Dapr 應用程式會取用發佈至 MQTT 訊息代理程式的模擬 MQTT 資料、套用視窗化函式,然後將結果發佈回 MQTT 訊息代理程式。 已發佈的輸出代表如何在邊緣彙總大量資料,以減少訊息頻率和大小。 Dapr 應用程式是無狀態的,並使用 MQTT 訊息代理程式狀態存放區來快取視窗計算所需的過去值。

Dapr 應用程式會執行下列步驟:

  1. 訂閱感應器資料的 sensor/data 主題。
  2. 在主題上接收數據時,它會發佈至 MQTT 訊息代理程式狀態存放區。
  3. 10 秒,它會從狀態存放區擷取資料,並計算最小值最大值平均值中位數及最後 30 秒時間戳記的任何感應器資料的第 75 個百分位數值。
  4. 超過 30 秒的資料會從狀態存放區過期。
  5. 結果會以 JSON 格式發佈至 sensor/window_data 主題。

注意

本教學課程停用 Dapr CloudEvents,讓其能夠使用原始 MQTT 發佈和訂閱。

必要條件

部署 Dapr 應用程式

此時,您可以部署 Dapr 應用程式。 註冊元件不會部署封裝在容器中的相關聯二進位檔案。 若要與應用程式一起部署二進位檔案,您可以使用部署將容器化 Dapr 應用程式和兩個元件組合在一起。

若要開始,請建立使用下列定義的 yaml 檔案:

元件 描述
volumes.mqtt-client-token 用來向 MQTT 訊息代理程式和狀態存放區驗證 Dapr 插入式元件的 SAT
volumes.aio-internal-ca-cert-chain 驗證 MQTT 訊息代理程式 TLS 憑證的信任鏈結
containers.mq-event-driven 預先建置的 Dapr 應用程式容器。
  1. 將下列部署 yaml 儲存至名為 app.yaml 的檔案:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: dapr-client
      namespace: azure-iot-operations
      annotations:
        aio-broker-auth/group: dapr-workload
    ---    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mq-event-driven-dapr
      namespace: azure-iot-operations
    spec:
      selector:
        matchLabels:
          app: mq-event-driven-dapr
      template:
        metadata:
          labels:
            app: mq-event-driven-dapr
          annotations:
            dapr.io/enabled: "true"
            dapr.io/inject-pluggable-components: "true"
            dapr.io/app-id: "mq-event-driven-dapr"
            dapr.io/app-port: "6001"
            dapr.io/app-protocol: "grpc"
        spec:
          serviceAccountName: dapr-client
    
          volumes:
          # SAT token used to authenticate between Dapr and the MQTT broker
          - name: mqtt-client-token
            projected:
              sources:
                - serviceAccountToken:
                    path: mqtt-client-token
                    audience: aio-internal
                    expirationSeconds: 86400
    
          # Certificate chain for Dapr to validate the MQTT broker
          - name: aio-ca-trust-bundle
            configMap:
              name: azure-iot-operations-aio-ca-trust-bundle
    
          containers:
          - name: mq-event-driven-dapr
            image: ghcr.io/azure-samples/explore-iot-operations/mq-event-driven-dapr:latest
    
  2. 執行下列命令來部署應用程式:

    kubectl apply -f app.yaml
    
  3. 確認已成功部署應用程式。 Pod 應在短時間間隔後報告所有容器已準備就緒,如下列命令所示:

    kubectl get pods -l app=mq-event-driven-dapr -n azure-iot-operations
    

    使用下列輸出:

    NAME                         READY   STATUS              RESTARTS   AGE
    mq-event-driven-dapr         3/3     Running             0          30s
    

部署模擬器

藉由部署 Kubernetes 工作負載來模擬測試資料。 它會使用 sensor/data 主題上的 MQTT 用戶端,定期將樣本溫度、震動及壓力讀數傳送至 MQTT 訊息代理程式,以模擬感應器。

  1. 探索 IoT 作業 存放庫部署模擬器:

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml    
    
  2. 確認模擬器正確執行:

    kubectl logs deployment/mqtt-publisher-deployment -n azure-iot-operations -f
    

    使用下列輸出:

    Get:1 http://deb.debian.org/debian stable InRelease [151 kB]
    Get:2 http://deb.debian.org/debian stable-updates InRelease [52.1 kB]
    Get:3 http://deb.debian.org/debian-security stable-security InRelease [48.0 kB]
    Get:4 http://deb.debian.org/debian stable/main amd64 Packages [8780 kB]
    Get:5 http://deb.debian.org/debian stable-updates/main amd64 Packages [6668 B]
    Get:6 http://deb.debian.org/debian-security stable-security/main amd64 Packages [101 kB]
    Fetched 9139 kB in 3s (3570 kB/s)
    ...
    Messages published in the last 10 seconds: 10
    Messages published in the last 10 seconds: 10
    Messages published in the last 10 seconds: 10
    

部署 MQTT 用戶端

若要確認 MQTT 橋接器是否正常運作,請將 MQTT 用戶端部署至叢集。

  1. 在名為 client.yaml 的新檔案中,指定用戶端部署:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: mqtt-client
      namespace: azure-iot-operations
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: mqtt-client
      namespace: azure-iot-operations
    spec:
      serviceAccountName: mqtt-client
      containers:
      - image: alpine
        name: mqtt-client
        command: ["sh", "-c"]
        args: ["apk add mosquitto-clients mqttui && sleep infinity"]
        volumeMounts:
        - name: mqtt-client-token
          mountPath: /var/run/secrets/tokens
        - name: aio-ca-trust-bundle
          mountPath: /var/run/certs/aio-internal-ca-cert/
      volumes:
      - name: mqtt-client-token
        projected:
          sources:
          - serviceAccountToken:
              path: mqtt-client-token
              audience: aio-internal
              expirationSeconds: 86400
      - name: aio-ca-trust-bundle
        configMap:
          name: azure-iot-operations-aio-ca-trust-bundle
    
  2. 使用 kubectl 套用部署檔案:

    kubectl apply -f client.yaml
    

    驗證輸出:

    pod/mqtt-client created
    

確認 Dapr 應用程式輸出

  1. 開啟 Mosquitto 用戶端 Pod 的殼層:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  2. 訂閱 sensor/window_data 主題,以觀察 Dapr 應用程式的已發佈輸出:

    mosquitto_sub -L mqtt://aio-broker/sensor/window_data
    
  3. 請確認應用程式每隔 10 秒輸出各種感應器的滑動視窗計算:

    {
        "timestamp": "2023-11-16T21:59:53.939690+00:00",
        "window_size": 30,
        "temperature": {
            "min": 553.024,
            "max": 598.907,
            "mean": 576.4647857142858,
            "median": 577.4905,
            "75_per": 585.96125,
            "count": 28
        },
        "pressure": {
            "min": 290.605,
            "max": 299.781,
            "mean": 295.521,
            "median": 295.648,
            "75_per": 297.64050000000003,
            "count": 28
        },
        "vibration": {
            "min": 0.00124192,
            "max": 0.00491257,
            "mean": 0.0031171810714285715,
            "median": 0.003199235,
            "75_per": 0.0038769150000000003,
            "count": 28
        }
    }
    

選擇性 - 建立 Dapr 應用程式

本教學課程使用 Dapr 應用程式的預先建置容器。 如果您想要自行修改和建置程式碼,請遵循下列步驟:

必要條件

  1. Docker - 用於建置應用程式容器
  2. 容器登錄 - 用於裝載應用程式容器

建置應用程式

  1. 複製探索 IoT 作業存放庫:

    git clone https://github.com/Azure-Samples/explore-iot-operations
    
  2. 變更為 Dapr 教學課程目錄:

    cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
    
  3. 建置 Docker 映像:

    docker build docker build . -t mq-event-driven-dapr
    
  4. 若要取用 Kubernetes 叢集中的應用程式,您必須將映像推送至容器登錄,例如 Azure Container Registry。 您也可以推送至本機容器登錄,例如 minikubeDocker

    docker tag mq-event-driven-dapr <container-alias>
    docker push <container-alias>
    
  5. 更新您的 app.yaml 以提取新建立的映像。

疑難排解

如果應用程式未啟動,或您在 中看到 中的 CrashLoopBackoff容器, daprd 容器記錄檔通常包含有用的資訊。

執行下列命令以檢視 daprd 元件的記錄:

kubectl logs -l app=mq-event-driven-dapr -n azure-iot-operations -c daprd

下一步