Latihan - Membangun fungsi Azure untuk mensimulasikan data telemetrik

Selesai

Dalam contoh kami, kami menggunakan event sourcing. Mari kita buat fungsi yang mensimulasikan data telemetrik dan mengirimkannya ke pusat aktivitas. Nantinya, fungsi lain dapat mendengarkan peristiwa ini dan memproses dan menyimpannya dalam database yang dibuat dengan Azure Cosmos DB.

Visualisasi sumber acara untuk membeli kopi di kedai kopi.

Menyiapkan lingkungan Anda

Mari kita tentukan beberapa variabel lingkungan untuk menjaga perintah berikut sesingkat dan dapat dimengerti mungkin. Tentukan tempat penampung <value>, dan tempel dan jalankan perintah berikut di terminal atau alat baris perintah Anda:

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>

Nota

Untuk mengatur variabel LOCATION, Anda dapat memeriksa perintah az functionapp list-consumption-locations dan menggunakan lokasi terdekat.

Membuat komponen yang diperlukan

Penyediaan sumber daya di Azure membutuhkan waktu. Mari kita mulai dengan pembuatan komponen sedini mungkin untuk menghindari penantian panjang di kemudian hari.

Membuat grup sumber daya

Selalu ada baiknya untuk mengikat semua sumber daya pelatihan, bukti konsep, atau prototipe dalam satu grup sumber daya. Dengan begitu Anda dapat dengan mudah membersihkan semua layanan yang digunakan dengan satu perintah. Untuk membuat grup sumber daya di lokasi yang ditentukan, jalankan perintah berikut di terminal Anda:

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

Membuat dan mengonfigurasi pusat aktivitas

Untuk Event Hub, Anda perlu menentukan namespace yang harus dipantau. Selain itu, Anda perlu mengonfigurasi aturan otorisasi untuk Listen dan 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

Membangun, mengonfigurasi, dan menyebarkan fungsi Azure

Untuk membuat contoh ini serealistis mungkin, buat fungsi Azure dan simulasikan data telemetrik. Anda juga dapat mengikat perangkat IoT ke fungsi Azure Anda, yang kemudian akan mengambil data nyata. Karena fungsi ini adalah yang menghasilkan peristiwa, mari kita tambahkan bendera p atau -p .

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

Nota

Gunakan versi fungsi 4 karena versi 2 dan 3 tidak lagi direkomendasikan sejak Desember 2022.

Saat perintah az functionapp create membuat aplikasi fungsi Anda, perintah tersebut juga membuat sumber daya Application Insights dengan nama yang sama. Kami menggunakan sumber daya tersebut nanti untuk pemantauan kami.

Untuk mengambil string koneksi untuk akun penyimpanan dan hub peristiwa, gunakan perintah berikut untuk menyimpannya dalam variabel lingkungan, lalu menampilkannya dengan perintah echo.

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

Untuk menyimpan string koneksi di pengaturan aplikasi akun Azure Function Anda, jalankan perintah berikut di terminal Anda:

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

Sekarang, sumber daya Azure Anda, yaitu Event Hub dan Azure Function, telah dibuat dan dikonfigurasi untuk bekerja dengan baik satu sama lain.

Selanjutnya, buat proyek fungsi lokal dengan Maven.

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

Perintah ini menghasilkan beberapa file di dalam folder telemetry-functions-producer:

  • File build pom.xml dengan dependensi Azure yang telah ditentukan sebelumnya.
  • File local.settings.json untuk menyimpan pengaturan aplikasi untuk penyebaran lokal dan pengujian manual.
  • File host.json yang mengaktifkan Bundel Ekstensi Azure Functions.
  • File Function.java yang menyertakan fungsi pemicu HTTP default.
  • Beberapa file pengujian yang tidak digunakan modul Learn ini.

Kami tidak menyentuh file pengujian dalam modul Learn ini, jadi jangan ragu untuk menghapusnya.

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

Untuk eksekusi lokal, pengaturan aplikasi perlu diambil dan disimpan di file local.settings.json. Anda dapat melakukannya secara otomatis dengan menjalankan perintah fetch-app-settings.

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

Selanjutnya, buka file Function.java dan ganti konten dengan kode berikut:

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);
    }
}

Fungsi generateSensorData mensimulasikan sensor yang mengirim pembacaan suhu dan tekanan ke hub peristiwa. Pemicu timer menjalankan fungsi setiap 10 detik, dan pengikatan output pusat aktivitas mengirimkan nilai pengembalian ke hub peristiwa.

Saat pusat aktivitas menerima pesan, pusat aktivitas akan menghasilkan peristiwa.

Data yang digunakan oleh fungsi ini disimpan menggunakan kelas yang disebut TelemetryItem, yang perlu Anda terapkan. Buat file baru yang disebut TelemetryItem.java di lokasi yang sama dengan Function.java dan tambahkan kode berikut:

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;
    }
}

Jalankan secara lokal

Saat Anda menjalankan fungsi Azure secara lokal, fungsi tersebut sudah di-streaming di seluruh dunia! Selain itu, Anda dapat meninjaunya di portal Microsoft Azure Anda.

mvn clean package
mvn azure-functions:run

Setelah beberapa pesan build dan startup, Anda akan melihat output yang mirip dengan contoh berikut untuk setiap kali fungsi berjalan:

[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)

Nota

Sebelum menyebarkan dan menjalankan fungsi di cloud Azure, Anda dapat mengirim peristiwa dari komputer lokal Anda di seluruh dunia! Itu sangat berguna untuk mengembangkan, men-debug, dan pengujian lokal.

Menyebarkan ke Azure

Picu penyebaran di Azure dengan menjalankan perintah mvn azure-functions:deploy dan lanjutkan.

mvn azure-functions:deploy