Gyakorlat – Azure-függvény létrehozása telemetriai adatok szimulálásához

Befejeződött

Példánkban eseményalapú adatforrást használunk. Hozzunk létre egy olyan függvényt, amely szimulálja a telemetriai adatokat, és elküldi azokat egy eseményközpontba. Később egy másik függvény meghallgathatja ezt az eseményt, és feldolgozhatja és tárolhatja az Azure Cosmos DB-vel létrehozott adatbázisban.

Az esemény forrásának vizualizációja kávévásárláshoz egy kávézóban.

A környezet előkészítése

Határozzunk meg néhány környezeti változót, hogy a következő parancsok a lehető legrövidebbek és érthetőek maradjanak. Definiálja a <value> helyőrzőket, majd illessze be és futtassa a következő parancsokat a terminálban vagy a parancssori eszközben:

RESOURCE_GROUP=<value>
EVENT_HUB_NAMESPACE=<value>
EVENT_HUB_NAME=<value>
EVENT_HUB_AUTHORIZATION_RULE=<value>
COSMOS_DB_ACCOUNT=<value>
STORAGE_ACCOUNT=<value>
FUNCTION_APP=<value>
LOCATION=<value>

Jegyzet

A LOCATION változó beállításához ellenőrizze a az functionapp list-consumption-locations parancsot, és használja a legközelebbi helyet.

A szükséges összetevők létrehozása

Az erőforrások Üzembe helyezése az Azure-ban eltarthat egy ideig. Kezdjük az összetevő lehető legkorábbi létrehozásával, hogy elkerüljük a későbbi hosszú várakozásokat.

Erőforráscsoport létrehozása

Mindig érdemes egyetlen erőforráscsoportban összekapcsolni egy betanítás összes erőforrását, a megvalósíthatósági igazolást vagy a prototípust. Így egyetlen paranccsal kényelmesen törölheti az összes használt szolgáltatást. Ha erőforráscsoportot szeretne létrehozni a megadott helyen, futtassa a következő parancsot a terminálban:

az group create \
    --name $RESOURCE_GROUP \
    --location $LOCATION

Eseményközpont létrehozása és konfigurálása

Az eseményközpont esetében meg kell adnia a figyelendő névteret. Emellett konfigurálnia kell az engedélyezési szabályt Listen és Send.

az eventhubs namespace create \
    --resource-group $RESOURCE_GROUP \
    --name $EVENT_HUB_NAMESPACE
az eventhubs eventhub create \
    --resource-group $RESOURCE_GROUP \
    --name $EVENT_HUB_NAME \
    --namespace-name $EVENT_HUB_NAMESPACE \
az eventhubs eventhub authorization-rule create \
    --resource-group $RESOURCE_GROUP \
    --name $EVENT_HUB_AUTHORIZATION_RULE \
    --eventhub-name $EVENT_HUB_NAME \
    --namespace-name $EVENT_HUB_NAMESPACE \
    --rights Listen Send

Az Azure-függvény létrehozása, konfigurálása és üzembe helyezése

Annak érdekében, hogy a példa a lehető legvalósághűbb legyen, hozzon létre egy Azure-függvényt, és szimulálja a telemetriai adatokat. Az IoT-eszközt az Azure-függvényhez is kötheti, amely ezután valós adatokat vesz fel. Mivel ez a függvény az eseményt létrehozó függvény, adjunk hozzá egy p vagy -p jelzőt.

az storage account create \
    --resource-group $RESOURCE_GROUP \
    --name $STORAGE_ACCOUNT"p" \
    --sku Standard_LRS
az functionapp create \
    --resource-group $RESOURCE_GROUP \
    --name $FUNCTION_APP"-p"\
    --storage-account $STORAGE_ACCOUNT"p" \
    --consumption-plan-location $LOCATION \
    --runtime java \
    --functions-version 4

Jegyzet

A függvények 4-es verzióját használja, mivel a 2-es és 3-as verzió 2022 decemberében elavult.

Amikor a az functionapp create parancs létrehozza a függvényalkalmazást, egy azonos nevű Application Insights-erőforrást is létrehoz. Ezt az erőforrást később használjuk a figyeléshez.

A tárfiók és az eseményközpont kapcsolati sztringjeinek lekéréséhez az alábbi parancsokkal mentse őket környezeti változókba, majd jelenítse meg őket a echo paranccsal.

AZURE_WEB_JOBS_STORAGE=$( \
    az storage account show-connection-string \
        --resource-group $RESOURCE_GROUP \
        --name $STORAGE_ACCOUNT"p" \
        --query connectionString \
        --output tsv)
echo $AZURE_WEB_JOBS_STORAGE
EVENT_HUB_CONNECTION_STRING=$( \
    az eventhubs eventhub authorization-rule keys list \
        --resource-group $RESOURCE_GROUP \
        --name $EVENT_HUB_AUTHORIZATION_RULE \
        --eventhub-name $EVENT_HUB_NAME \
        --namespace-name $EVENT_HUB_NAMESPACE \
        --query primaryConnectionString \
        --output tsv)
echo $EVENT_HUB_CONNECTION_STRING

Ha a kapcsolati sztringeket az Azure-függvényfiók alkalmazásbeállításaiban szeretné tárolni, futtassa a következő parancsot a terminálon:

az functionapp config appsettings set \
    --resource-group $RESOURCE_GROUP \
    --name $FUNCTION_APP"-p" \
    --settings \
        AzureWebJobsStorage=$AZURE_WEB_JOBS_STORAGE \
        EventHubConnectionString=$EVENT_HUB_CONNECTION_STRING

Mostanra az Azure-erőforrások eseményközpontja és az Azure-függvény létrejött és konfigurálva lett, hogy megfelelően működjenek együtt.

Ezután hozzon létre egy helyi függvényprojektet a Mavennel.

mvn archetype:generate --batch-mode \
    -DarchetypeGroupId=com.microsoft.azure \
    -DarchetypeArtifactId=azure-functions-archetype \
    -DappName=$FUNCTION_APP"-p" \
    -DresourceGroup=$RESOURCE_GROUP \
    -DappRegion=$LOCATION \
    -DappServicePlanName=$LOCATION"plan" \
    -DgroupId=com.learn \
    -DartifactId=telemetry-functions-producer

Ez a parancs több fájlt hoz létre egy telemetry-functions-producer mappában:

  • A pom.xml előre definiált Azure-függőségekkel rendelkező buildfájl.
  • A local.settings.json fájl, amely a helyi üzembe helyezés és a manuális tesztelés alkalmazásbeállításainak tárolására használható.
  • Egy host.json fájl, amely lehetővé teszi az Azure Functions-bővítménycsomagot.
  • Az alapértelmezett HTTP-triggerfüggvényt tartalmazó Function.java fájl.
  • Néhány tesztfájl, amelyeket ez a Learn-modul nem használ.

Ebben a Learn modulban nem érintjük meg a tesztfájlokat, ezért nyugodtan törölheti őket.

cd telemetry-functions-producer
rm -r src/test

A helyi végrehajtáshoz az alkalmazásbeállításokat le kell kérni és a local.settings.json fájlban kell tárolni. Ezt automatikusan megteheti a fetch-app-settings parancs futtatásával.

func azure functionapp fetch-app-settings $FUNCTION_APP"-p"

Ezután nyissa meg a Function.java fájlt, és cserélje le a tartalmat a következő kódra:

package com.learn;

import com.microsoft.azure.functions.annotation.EventHubOutput;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.TimerTrigger;
import com.microsoft.azure.functions.ExecutionContext;
public class Function {

    @FunctionName("generateSensorData")
    @EventHubOutput(
        name = "event",
        eventHubName = "", // blank because the value is included in the connection string
        connection = "EventHubConnectionString")
    public TelemetryItem generateSensorData(
        @TimerTrigger(
            name = "timerInfo",
            schedule = "*/10 * * * * *") // every 10 seconds
            String timerInfo,
        final ExecutionContext context) {
            context.getLogger().info("Java Timer trigger function executed at: " + java.time.LocalDateTime.now());
            double temperature = Math.random() * 100;
            double pressure = Math.random() * 50;
        return new TelemetryItem(temperature, pressure);
    }
}

A generateSensorData függvény olyan érzékelőt szimulál, amely hőmérséklet- és nyomásméréseket küld az eseményközpontnak. Az időzítő eseményindítója 10 másodpercenként futtatja a függvényt, és egy eseményközpont kimeneti kötése elküldi a visszatérési értéket az eseményközpontnak.

Amikor az eseményközpont megkapja az üzenetet, létrehoz egy eseményt.

A függvény által használt adatokat egy TelemetryItem nevű osztály tárolja, amelyet implementálnia kell. Hozzon létre egy TelemetryItem.java nevű új fájlt ugyanazon a helyen, ahol Function.java, és adja hozzá a következő kódot:

package com.learn;

public class TelemetryItem {

    private String id;
    private double temperature;
    private double pressure;
    private boolean isNormalPressure;
    private status temperatureStatus;
    static enum status {
        COOL,
        WARM,
        HOT
    }

    public TelemetryItem(double temperature, double pressure) {
        this.temperature = temperature;
        this.pressure = pressure;
    }

    public String getId() {
        return id;
    }

    public double getTemperature() {
        return temperature;
    }

    public double getPressure() {
        return pressure;
    }

    @Override
    public String toString() {
        return "TelemetryItem={id=" + id + ",temperature="
            + temperature + ",pressure=" + pressure + "}";
    }

    public boolean isNormalPressure() {
        return isNormalPressure;
    }

    public void setNormalPressure(boolean isNormal) {
        this.isNormalPressure = isNormal;
    }

    public status getTemperatureStatus() {
        return temperatureStatus;
    }

    public void setTemperatureStatus(status temperatureStatus) {
        this.temperatureStatus = temperatureStatus;
    }
}

Helyi futtatás

Ha helyileg futtatja az Azure-függvényeket, azok már a világ minden táján streamelhetők! Emellett az Azure Portalon is áttekintheti őket.

mvn clean package
mvn azure-functions:run

Néhány buildelési és indítási üzenet után a függvények futtatásakor az alábbi példához hasonló kimenet jelenik meg:

[2021-01-19T16:25:40.005Z] Executing 'Functions.generateSensorData' (Reason='Timer fired at 2021-01-19T17:25:40.0044630+01:00', Id=fcf567a3-03ec-4159-9714-aa4449861b30)
[2021-01-19T16:25:40.011Z] Java Timer trigger function executed at: 2021-01-19T17:25:40.009405
[2021-01-19T16:25:40.013Z] Function "generateSensorData" (Id: fcf567a3-03ec-4159-9714-aa4449861b30) invoked by Java Worker
[2021-01-19T16:25:40.048Z] Executed 'Functions.generateSensorData' (Succeeded, Id=fcf567a3-03ec-4159-9714-aa4449861b30, Duration=43ms)

Jegyzet

Mielőtt üzembe helyezi és futtatja a függvényt az Azure-felhőben, eseményeket küldhet a helyi gépéről a világ minden tájáról! Ez nagyon hasznos a fejlesztéshez, a hibakereséshez és a helyi teszteléshez.

Üzembe helyezés az Azure-ban

Indítsa el az üzembe helyezést az Azure-ban a mvn azure-functions:deploy parancs futtatásával, és folytassa.

mvn azure-functions:deploy