Delen via


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:

  1. Hiermee abonneert u zich op het sensor/data onderwerp voor sensorgegevens.
  2. Wanneer gegevens over het onderwerp worden ontvangen, worden deze gepubliceerd naar het MQTT-brokerstatusarchief.
  3. 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.
  4. Gegevens die ouder zijn dan 30 seconden , zijn verlopen vanuit het statusarchief.
  5. 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

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.
  1. 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
    
  2. Implementeer de toepassing door de volgende opdracht uit te voeren:

    kubectl apply -f app.yaml
    
  3. 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.

  1. 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    
    
  2. 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.

  1. Geef in een nieuw bestand met de naam client.yamlde 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
    
  2. Pas het implementatiebestand toe met kubectl:

    kubectl apply -f client.yaml
    

    Uitvoer controleren:

    pod/mqtt-client created
    

De uitvoer van de Dapr-toepassing controleren

  1. Open een shell naar de Mosquitto-clientpod:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  2. 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
    
  3. 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

  1. Docker : voor het bouwen van de toepassingscontainer
  2. Een containerregister: voor het hosten van de toepassingscontainer

De toepassing bouwen

  1. Kloon de opslagplaats IoT-bewerkingen verkennen:

    git clone https://github.com/Azure-Samples/explore-iot-operations
    
  2. Ga als volgt te werk in de map met dapr-zelfstudies:

    cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
    
  3. Bouw de docker-installatiekopieën:

    docker build docker build . -t mq-event-driven-dapr
    
  4. 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>
    
  5. 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, CrashLoopBackoffbevat 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

Volgende stappen