教學課程:使用 Dapr 和 MQTT 訊息代理程式建置事件驅動應用程式
在本逐步解說中,您會將 Dapr 應用程式部署至叢集。 Dapr 應用程式會取用發佈至 MQTT 訊息代理程式的模擬 MQTT 資料、套用視窗化函式,然後將結果發佈回 MQTT 訊息代理程式。 已發佈的輸出代表如何在邊緣彙總大量資料,以減少訊息頻率和大小。 Dapr 應用程式是無狀態的,並使用 MQTT 訊息代理程式狀態存放區來快取視窗計算所需的過去值。
Dapr 應用程式會執行下列步驟:
- 訂閱感應器資料的
sensor/data
主題。 - 在主題上接收數據時,它會發佈至 MQTT 訊息代理程式狀態存放區。
- 每 10 秒,它會從狀態存放區擷取資料,並計算最小值、最大值、平均值、中位數及最後 30 秒時間戳記的任何感應器資料的第 75 個百分位數值。
- 超過 30 秒的資料會從狀態存放區過期。
- 結果會以 JSON 格式發佈至
sensor/window_data
主題。
注意
本教學課程停用 Dapr CloudEvents,讓其能夠使用原始 MQTT 發佈和訂閱。
必要條件
- 已安裝 Azure IoT 作業 - 快速入門:使用 K3 在 GitHub Codespaces 中執行 Azure IoT 作業
- 已安裝 MQTT 訊息代理程式 Dapr 元件 - 安裝 MQTT 訊息代理程式 Dapr 元件
部署 Dapr 應用程式
此時,您可以部署 Dapr 應用程式。 註冊元件不會部署封裝在容器中的相關聯二進位檔案。 若要與應用程式一起部署二進位檔案,您可以使用部署將容器化 Dapr 應用程式和兩個元件組合在一起。
若要開始,請建立使用下列定義的 yaml 檔案:
元件 | 描述 |
---|---|
volumes.mqtt-client-token |
用來向 MQTT 訊息代理程式和狀態存放區驗證 Dapr 插入式元件的 SAT |
volumes.aio-internal-ca-cert-chain |
驗證 MQTT 訊息代理程式 TLS 憑證的信任鏈結 |
containers.mq-event-driven |
預先建置的 Dapr 應用程式容器。 |
將下列部署 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
執行下列命令來部署應用程式:
kubectl apply -f app.yaml
確認已成功部署應用程式。 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 訊息代理程式,以模擬感應器。
從 探索 IoT 作業 存放庫部署模擬器:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml
確認模擬器正確執行:
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 用戶端部署至叢集。
在名為
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
使用 kubectl 套用部署檔案:
kubectl apply -f client.yaml
驗證輸出:
pod/mqtt-client created
確認 Dapr 應用程式輸出
開啟 Mosquitto 用戶端 Pod 的殼層:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
訂閱
sensor/window_data
主題,以觀察 Dapr 應用程式的已發佈輸出:mosquitto_sub -L mqtt://aio-broker/sensor/window_data
請確認應用程式每隔 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 應用程式的預先建置容器。 如果您想要自行修改和建置程式碼,請遵循下列步驟:
必要條件
- Docker - 用於建置應用程式容器
- 容器登錄 - 用於裝載應用程式容器
建置應用程式
複製探索 IoT 作業存放庫:
git clone https://github.com/Azure-Samples/explore-iot-operations
變更為 Dapr 教學課程目錄:
cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
建置 Docker 映像:
docker build docker build . -t mq-event-driven-dapr
若要取用 Kubernetes 叢集中的應用程式,您必須將映像推送至容器登錄,例如 Azure Container Registry。 您也可以推送至本機容器登錄,例如 minikube 或 Docker。
docker tag mq-event-driven-dapr <container-alias> docker push <container-alias>
更新您的
app.yaml
以提取新建立的映像。
疑難排解
如果應用程式未啟動,或您在 中看到 中的 CrashLoopBackoff
容器, daprd
容器記錄檔通常包含有用的資訊。
執行下列命令以檢視 daprd 元件的記錄:
kubectl logs -l app=mq-event-driven-dapr -n azure-iot-operations -c daprd