Руководство. Создание приложения на основе событий с помощью Dapr и брокера MQTT
В этом пошаговом руководстве вы развернете приложение Dapr в кластере. Приложение Dapr использует имитированные данные MQTT, опубликованные в брокере MQTT, применяет функцию окна, а затем публикует результат обратно в брокер MQTT. Опубликованные выходные данные представляют, как можно агрегировать данные большого объема на границе, чтобы уменьшить частоту и размер сообщения. Приложение Dapr является бессерверным и использует хранилище состояний брокера MQTT для кэширования прошлых значений, необходимых для вычислений окна.
Приложение Dapr выполняет следующие действия.
- Подписывается на
sensor/data
раздел для данных датчика. - При получении данных в разделе оно публикуется в хранилище состояний брокера MQTT.
- Каждые 10 секунд он извлекает данные из хранилища состояний и вычисляет минимальные, максимальные, средние, медиан и 75-й процентильные значения на любые метки данных датчика за последние 30 секунд.
- Срок действия данных старше 30 секунд истек из хранилища состояний.
- Результат публикуется в
sensor/window_data
разделе в формате JSON.
Примечание.
В этом руководстве отключается Dapr CloudEvents , которая позволяет публиковать и подписываться с помощью необработанного MQTT.
Необходимые компоненты
- Установленные операции Интернета вещей Azure. Краткое руководство. Запуск операций Интернета вещей Azure в пространствах кода GitHub с K3s
- Установленные компоненты dapr брокера MQTT — установка компонентов Dapr брокера MQTT
Развертывание приложения Dapr
На этом этапе можно развернуть приложение Dapr. Регистрация компонентов не развертывает связанный двоичный файл, упакованный в контейнер. Чтобы развернуть двоичный файл вместе с приложением, можно использовать развертывание для группировки контейнерного приложения Dapr и двух компонентов.
Чтобы начать, создайте yaml-файл, использующий следующие определения:
Компонент | Description |
---|---|
volumes.mqtt-client-token |
SAT, используемый для проверки подлинности подключаемых компонентов Dapr с помощью брокера MQTT и Хранилища состояний |
volumes.aio-internal-ca-cert-chain |
Цепочка доверия для проверки сертификата TLS брокера MQTT |
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. Он имитирует датчик, отправляя образец температуры, вибрации и чтения давления периодически брокеру MQTT с помощью клиента MQTT в sensor/data
этой статье.
Разверните симулятор из репозитория Операций Интернета вещей:
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
Откройте оболочку для модуля pod клиента Mosquitto:
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 — для создания контейнера приложения
- Реестр контейнеров — для размещения контейнера приложения
Сборка приложения
Клонируйте репозиторий операций Интернета вещей:
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. Вы также можете отправить в локальный реестр контейнеров, например 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