Zelfstudie: Een gebeurtenisgestuurde app bouwen met Dapr en MQTT-broker
In dit scenario implementeert u een Dapr-toepassing in het cluster. De Dapr-toepassing verbruikt gesimuleerde MQTT-gegevens die zijn gepubliceerd naar MQTT-broker, past een vensterfunctie toe en publiceert het resultaat vervolgens terug naar MQTT-broker. De gepubliceerde uitvoer geeft aan hoe grote volumegegevens aan de rand kunnen worden samengevoegd om de frequentie en grootte van berichten te verminderen. De Dapr-toepassing is staatloos en gebruikt de MQTT-brokerstatusopslag om eerdere waarden in de cache op te slaan die nodig zijn voor de vensterberekeningen.
De Dapr-toepassing voert de volgende stappen uit:
- Hiermee abonneert u zich op het
sensor/data
onderwerp voor sensorgegevens. - Wanneer gegevens over het onderwerp worden ontvangen, worden deze gepubliceerd naar het MQTT-brokerstatusarchief.
- Elke 10 seconden worden de gegevens opgehaald uit het statusarchief en worden de minuten, max, gemiddelde, mediaan en 75e percentielwaarden berekend op elke tijdstempel van sensorgegevens die in de afgelopen 30 seconden zijn ingestempeld.
- Gegevens die ouder zijn dan 30 seconden , zijn verlopen vanuit het statusarchief.
- Het resultaat wordt gepubliceerd naar het
sensor/window_data
onderwerp in JSON-indeling.
Notitie
In deze zelfstudie wordt Dapr CloudEvents uitgeschakeld, zodat deze kan worden gepubliceerd en geabonneerd met onbewerkte MQTT.
Vereisten
- Azure IoT Operations geïnstalleerd - Quickstart: Azure IoT Operations uitvoeren in GitHub Codespaces met K3s
- MQTT Broker Dapr-onderdelen geïnstalleerd - MQTT Broker Dapr-onderdelen installeren
De Dapr-toepassing implementeren
Op dit moment kunt u de Dapr-toepassing implementeren. Als u de onderdelen registreert, wordt het bijbehorende binaire bestand dat in een container is verpakt, niet geïmplementeerd. Als u het binaire bestand samen met uw toepassing wilt implementeren, kunt u een implementatie gebruiken om de in een container geplaatste Dapr-toepassing en de twee onderdelen samen te groeperen.
Maak eerst een YAML-bestand dat gebruikmaakt van de volgende definities:
Onderdeel | Beschrijving |
---|---|
volumes.mqtt-client-token |
De SAT die wordt gebruikt voor het verifiëren van de Dapr pluggable-onderdelen met de MQTT-broker en State Store |
volumes.aio-internal-ca-cert-chain |
De vertrouwensketen voor het valideren van het TLS-certificaat van de MQTT-broker |
containers.mq-event-driven |
De vooraf gemaakte Dapr-toepassingscontainer. |
Sla de volgende yaml voor de implementatie op in een bestand met de naam
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
Implementeer de toepassing door de volgende opdracht uit te voeren:
kubectl apply -f app.yaml
Controleer of de toepassing is geïmplementeerd. De pod moet alle containers na een kort interval rapporteren, zoals wordt weergegeven met de volgende opdracht:
kubectl get pods -l app=mq-event-driven-dapr -n azure-iot-operations
Met de volgende uitvoer:
NAME READY STATUS RESTARTS AGE mq-event-driven-dapr 3/3 Running 0 30s
De simulator implementeren
Testgegevens simuleren door een Kubernetes-workload te implementeren. Het simuleert een sensor door periodiek monstertemperatuur, trillingen en drukmetingen naar de MQTT-broker te verzenden met behulp van een MQTT-client in het sensor/data
onderwerp.
Implementeer de simulator vanuit de opslagplaats IoT-bewerkingen verkennen:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml
Controleer of de simulator correct wordt uitgevoerd:
kubectl logs deployment/mqtt-publisher-deployment -n azure-iot-operations -f
Met de volgende uitvoer:
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
Een MQTT-client implementeren
Als u wilt controleren of de MQTT-brug werkt, implementeert u een MQTT-client in het cluster.
Geef in een nieuw bestand met de naam
client.yaml
de clientimplementatie op: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
Pas het implementatiebestand toe met kubectl:
kubectl apply -f client.yaml
Uitvoer controleren:
pod/mqtt-client created
De uitvoer van de Dapr-toepassing controleren
Open een shell naar de Mosquitto-clientpod:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Abonneer u op het
sensor/window_data
onderwerp om de gepubliceerde uitvoer van de Dapr-toepassing te bekijken:mosquitto_sub -L mqtt://aio-broker/sensor/window_data
Controleer of de toepassing elke 10 seconden een berekening van schuifvensters uitvoert voor de verschillende sensoren:
{ "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 } }
Optioneel: de Dapr-toepassing maken
In deze zelfstudie wordt een vooraf gemaakte container van de Dapr-toepassing gebruikt. Als u de code zelf wilt wijzigen en bouwen, voert u de volgende stappen uit:
Vereisten
- Docker : voor het bouwen van de toepassingscontainer
- Een containerregister: voor het hosten van de toepassingscontainer
De toepassing bouwen
Kloon de opslagplaats IoT-bewerkingen verkennen:
git clone https://github.com/Azure-Samples/explore-iot-operations
Ga als volgt te werk in de map met dapr-zelfstudies:
cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
Bouw de docker-installatiekopieën:
docker build docker build . -t mq-event-driven-dapr
Als u de toepassing in uw Kubernetes-cluster wilt gebruiken, moet u de installatiekopieën pushen naar een containerregister, zoals Azure Container Registry. U kunt ook pushen naar een lokaal containerregister, zoals minikube of Docker.
docker tag mq-event-driven-dapr <container-alias> docker push <container-alias>
Werk uw
app.yaml
bij om de zojuist gemaakte installatiekopie op te halen.
Probleemoplossing
Als de toepassing niet wordt gestart of als u de containers ziet, CrashLoopBackoff
bevat het daprd
containerlogboek vaak nuttige informatie.
Voer de volgende opdracht uit om de logboeken voor het daprd-onderdeel weer te geven:
kubectl logs -l app=mq-event-driven-dapr -n azure-iot-operations -c daprd