Dela via


Självstudie: Skapa en händelsedriven app med Dapr och MQTT Broker

I den här genomgången distribuerar du ett Dapr-program till klustret. Dapr-programmet använder simulerade MQTT-data som publicerats till MQTT-asynkron meddelandekö, tillämpar en fönsterfunktion och publicerar sedan resultatet tillbaka till MQTT-asynkron meddelandekö. Publicerade utdata representerar hur data med hög volym kan aggregeras på gränsen för att minska meddelandefrekvensen och storleken. Dapr-programmet är tillståndslöst och använder MQTT Broker State Store för att cachelagras tidigare värden som behövs för fönsterberäkningarna.

Dapr-programmet utför följande steg:

  1. Prenumererar på ämnet sensor/data för sensordata.
  2. När data tar emot om ämnet publiceras de till MQTT Broker State Store.
  3. Var 10:e sekund hämtar den data från tillståndslagret och beräknar värdena min, max, medelvärde, median och 75:e percentilen på alla tidsstämplar för sensordata under de senaste 30 sekunderna.
  4. Data som är äldre än 30 sekunder har upphört att gälla från tillståndslagret.
  5. Resultatet publiceras till ämnet sensor/window_data i JSON-format.

Kommentar

Den här självstudien inaktiverar Dapr CloudEvents som gör det möjligt att publicera och prenumerera med rå MQTT.

Förutsättningar

Distribuera Dapr-programmet

Nu kan du distribuera Dapr-programmet. Om du registrerar komponenterna distribueras inte den associerade binärfilen som paketeras i en container. Om du vill distribuera binärfilen tillsammans med ditt program kan du använda en distribution för att gruppera det containerbaserade Dapr-programmet och de två komponenterna tillsammans.

Börja med att skapa en yaml-fil som använder följande definitioner:

Komponent beskrivning
volumes.mqtt-client-token SAT som används för att autentisera Dapr-pluggbara komponenter med MQTT-asynkron meddelandekö och state store
volumes.aio-internal-ca-cert-chain Förtroendekedjan för att verifiera TLS-certifikatet för MQTT-koordinator
containers.mq-event-driven Den fördefinierade Dapr-programcontainern.
  1. Spara följande distributions-yaml i en fil med namnet 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. Distribuera programmet genom att köra följande kommando:

    kubectl apply -f app.yaml
    
  3. Bekräfta att programmet har distribuerats. Podden bör rapportera att alla containrar är klara efter ett kort intervall, vilket visas med följande kommando:

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

    Med följande utdata:

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

Distribuera simulatorn

Simulera testdata genom att distribuera en Kubernetes-arbetsbelastning. Den simulerar en sensor genom att skicka provtemperatur, vibrationer och tryckmätningar regelbundet till MQTT-koordinatorn med hjälp av en MQTT-klient i ämnet sensor/data .

  1. Distribuera simulatorn från lagringsplatsen Utforska IoT-åtgärder :

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml    
    
  2. Bekräfta att simulatorn körs korrekt:

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

    Med följande utdata:

    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
    

Distribuera en MQTT-klient

Om du vill kontrollera att MQTT-bryggan fungerar distribuerar du en MQTT-klient till klustret.

  1. I en ny fil med namnet client.yamlanger du klientdistributionen:

    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. Använd distributionsfilen med kubectl:

    kubectl apply -f client.yaml
    

    Verifiera utdata:

    pod/mqtt-client created
    

Verifiera Dapr-programmets utdata

  1. Öppna ett gränssnitt till Mosquitto-klientpodden:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  2. Prenumerera på ämnet sensor/window_data för att se publicerade utdata från Dapr-programmet:

    mosquitto_sub -L mqtt://aio-broker/sensor/window_data
    
  3. Kontrollera att programmet matar ut en glidande windowsberäkning för de olika sensorerna var 10:e sekund:

    {
        "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
        }
    }
    

Valfritt – Skapa Dapr-programmet

I den här självstudien används en fördefinierad container för Dapr-programmet. Följ dessa steg om du vill ändra och skapa koden själv:

Förutsättningar

  1. Docker – för att skapa programcontainern
  2. Ett containerregister – för att vara värd för programcontainern

Skapa programmet

  1. Klona lagringsplatsen Utforska IoT-åtgärder :

    git clone https://github.com/Azure-Samples/explore-iot-operations
    
  2. Ändra till katalogen Dapr-självstudie:

    cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
    
  3. Skapa docker-avbildningen:

    docker build docker build . -t mq-event-driven-dapr
    
  4. Om du vill använda programmet i kubernetes-klustret måste du skicka avbildningen till ett containerregister, till exempel Azure Container Registry. Du kan också skicka till ett lokalt containerregister, till exempel minikube eller Docker.

    docker tag mq-event-driven-dapr <container-alias>
    docker push <container-alias>
    
  5. Uppdatera din app.yaml för att hämta den nyligen skapade avbildningen.

Felsökning

Om programmet inte startar eller om du ser containrarna i CrashLoopBackoffinnehåller containerloggen daprd ofta användbar information.

Kör följande kommando för att visa loggarna för daprd-komponenten:

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

Nästa steg