Bagikan melalui


Tutorial: Membuat fungsi di Java dengan pemicu Event Hub dan pengikatan output Azure Cosmos DB

Tutorial ini menunjukkan kepada Anda cara menggunakan Azure Functions untuk membuat fungsi Java yang menganalisis aliran data suhu dan tekanan berkelanjutan. Peristiwa Hub Events yang mewakili pembacaan sensor memicu fungsi. Fungsi memproses data peristiwa, lalu menambahkan entri status ke instans Azure Cosmos DB.

Dalam tutorial ini, Anda akan:

  • Membuat dan mengonfigurasi sumber daya Azure menggunakan Azure CLI.
  • Membuat dan menguji fungsi Java yang berinteraksi dengan sumber daya ini.
  • Menerapkan fungsi Anda ke Azure dan memantaunya dengan Application Insights.

Jika Anda tidak memiliki akun Azure, buat akun gratis sebelum memulai.

Prasyarat

Untuk menyelesaikan tutorial ini, Anda harus menginstal:

Penting

Variabel lingkungan JAVA_HOME harus diatur ke lokasi penginstalan versi JDK untuk menyelesaikan tutorial ini.

Jika Anda lebih suka menggunakan kode untuk tutorial ini secara langsung, lihat repo sampel java-functions-eventhub-cosmosdb.

Membuat sumber daya Azure

Dalam tutorial ini, Anda akan membutuhkan sumber daya ini:

  • Grup sumber daya untuk memuat sumber daya lainnya
  • Namespace, event hub, dan aturan otorisasi Event Hubs
  • Akun, database, dan koleksi Azure Cosmos DB
  • Aplikasi fungsi dan akun penyimpanan untuk menghostingnya

Bagian berikut ini menunjukkan cara membuat sumber daya ini menggunakan Azure CLI.

Atur variabel lingkungan

Selanjutnya, buat beberapa variabel lingkungan untuk nama dan lokasi sumber daya yang akan Anda buat. Gunakan perintah berikut, ganti tempat penampung <value> nilai yang Anda pilih. Nilai harus sesuai dengan aturan penamaan dan pembatasan untuk sumber daya Azure. Untuk variabel LOCATION, gunakan salah satu nilai yang dihasilkan oleh perintah az functionapp list-consumption-locations.

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>

Sisa tutorial ini menggunakan variabel ini. Ketahuilah bahwa variabel ini hanya bertahan selama durasi sesi Azure CLI atau Cloud Shell Anda saat ini. Anda harus menjalankan perintah ini lagi jika Anda menggunakan jendela terminal lokal yang berbeda atau waktu sesi Cloud Shell Anda habis.

Buat grup sumber daya

Azure menggunakan grup sumber daya untuk mengumpulkan semua sumber daya terkait di akun Anda. Dengan demikian, Anda dapat melihatnya sebagai unit dan menghapusnya dengan satu perintah saat Anda selesai dengannya.

Gunakan perintah berikut ini untuk membuat grup sumber daya:

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

Membuat pusat aktivitas

Berikutnya, buat namespace, event hub, da aturan otorisasi Azure Event Hubs menggunakan perintah berikut:

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 \
    --retention-time 1 \
    --cleanup-policy Delete
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

Namespace Event Hubs berisi event hub aktual dan aturan otorisasinya. Aturan otorisasi memungkinkan fungsi Anda mengirim pesan ke hub dan mendengarkan peristiwa yang sesuai. Satu fungsi mengirimkan pesan yang mewakili data telemetri. Fungsi lain mendengarkan peristiwa, menganalisis data peristiwa, dan menyimpan hasilnya di Azure Cosmos DB.

Membuat akun Azure Cosmos DB

Berikutnya, buat akun, database, dan kumpulan Azure Cosmos DB menggunakan perintah berikut:

az cosmosdb create \
    --resource-group $RESOURCE_GROUP \
    --name $COSMOS_DB_ACCOUNT
az cosmosdb sql database create \
    --resource-group $RESOURCE_GROUP \
    --account-name $COSMOS_DB_ACCOUNT \
    --name TelemetryDb
az cosmosdb sql container create \
    --resource-group $RESOURCE_GROUP \
    --account-name $COSMOS_DB_ACCOUNT \
    --database-name TelemetryDb \
    --name TelemetryInfo \
    --partition-key-path '/temperatureStatus'

Nilai partition-key-path mempartisi data Anda berdasarkan nilai temperatureStatus setiap item. Kunci partisi memungkinkan Azure Cosmos DB meningkatkan performa dengan membandingkan data Anda menjadi subset berbeda yang dapat diakses secara independen.

Membuat akun penyimpanan dan aplikasi fungsi

Selanjutnya, buat akun Azure Storage, yang diperlukan oleh Azure Functions, lalu buat aplikasi fungsi. Gunakan perintah berikut:

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

Saat perintah az functionapp create membuat aplikasi fungsi Anda, perintah tersebut juga membuat sumber daya Application Insights dengan nama yang sama. Aplikasi fungsi dikonfigurasi secara otomatis dengan pengaturan bernama APPINSIGHTS_INSTRUMENTATIONKEY yang menyambungkannya ke Application Insights. Anda dapat melihat telemetri aplikasi setelah menerapkan fungsi ke Azure, seperti yang dijelaskan nanti dalam tutorial ini.

Mengonfigurasi aplikasi fungsi Anda

Aplikasi fungsi Anda harus mengakses sumber daya lain agar berfungsi dengan benar. Bagian berikut menunjukkan cara mengonfigurasi aplikasi fungsi sehingga dapat berjalan di komputer lokal Anda.

Mengambil string koneksi sumber daya

Gunakan perintah berikut untuk mengambil penyimpanan, pusat aktivitas, dan string koneksi Azure Cosmos DB dan menyimpannya dalam variabel lingkungan:

Catatan

Microsoft merekomendasikan penggunaan alur autentikasi paling aman yang tersedia. Alur autentikasi yang dijelaskan dalam prosedur ini, seperti untuk database, cache, olahpesan, atau layanan AI, memerlukan tingkat kepercayaan yang sangat tinggi dalam aplikasi dan membawa risiko yang tidak ada dalam alur lain. Gunakan alur ini hanya ketika opsi yang lebih aman, seperti identitas terkelola untuk koneksi tanpa kata sandi atau tanpa kunci, tidak layak. Untuk operasi komputer lokal, lebih suka identitas pengguna untuk koneksi tanpa kata sandi atau tanpa kunci.

AZURE_WEB_JOBS_STORAGE=$( \
    az storage account show-connection-string \
        --name $STORAGE_ACCOUNT \
        --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
COSMOS_DB_CONNECTION_STRING=$( \
    az cosmosdb keys list \
        --resource-group $RESOURCE_GROUP \
        --name $COSMOS_DB_ACCOUNT \
        --type connection-strings \
        --query 'connectionStrings[0].connectionString' \
        --output tsv)
echo $COSMOS_DB_CONNECTION_STRING

Variabel ini diatur ke nilai yang diambil dari perintah Azure CLI. Setiap perintah menggunakan kueri JMESPath untuk mengekstrak string koneksi dari payload JSON yang dikembalikan. String koneksi juga ditampilkan menggunakan echo sehingga Anda dapat mengonfirmasi bahwa string tersebut telah berhasil diambil.

Memperbarui pengaturan aplikasi fungsi Anda

Berikutnya, gunakan perintah berikut untuk mentransfer nilai string koneksi ke pengaturan aplikasi di akun Azure Functions Anda:

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

Sumber daya Azure Anda sekarang telah dibuat dan dikonfigurasi untuk bekerja sama dengan baik.

Membuat dan menguji fungsi Anda

Selanjutnya, Anda akan membuat proyek di komputer lokal, menambahkan kode Java, dan mengujinya. Anda akan menggunakan perintah yang berfungsi dengan Azure Functions Plugin untuk Maven dan Azure Functions Core Tools. Fungsi Anda akan berjalan secara lokal, tetapi akan menggunakan sumber daya berbasis cloud yang telah Anda buat. Setelah Anda membuat fungsi bekerja secara lokal, Anda dapat menggunakan Maven untuk menerapkannya ke cloud serta melihat data dan analitik Anda terakumulasi.

Jika Anda menggunakan Cloud Shell untuk membuat sumber daya, maka Anda tidak akan tersambung ke Azure secara lokal. Dalam hal ini, gunakan perintah az login untuk meluncurkan proses login berbasis browser. Kemudian jika perlu, tetapkan langganan default dengan az account set --subscription diikuti oleh ID langganan. Terakhir, jalankan perintah berikut untuk membuat ulang beberapa variabel lingkungan pada komputer lokal Anda. Ganti tempat penampung <value> dengan nilai yang sama dengan yang Anda gunakan sebelumnya.

RESOURCE_GROUP=<value>
FUNCTION_APP=<value>

Membuat proyek fungsi lokal

Gunakan perintah Maven berikut untuk membuat proyek fungsi dan menambahkan dependensi yang diperlukan.

mvn archetype:generate --batch-mode \
    -DarchetypeGroupId=com.microsoft.azure \
    -DarchetypeArtifactId=azure-functions-archetype \
    -DappName=$FUNCTION_APP \
    -DresourceGroup=$RESOURCE_GROUP \
    -DappRegion=$LOCATION \
    -DgroupId=com.example \
    -DartifactId=telemetry-functions

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

  • File pom.xml untuk digunakan dengan Maven
  • File local.settings.json untuk menyimpan pengaturan aplikasi untuk pengujian lokal
  • host.json File yang mengaktifkan Bundel Ekstensi Azure Functions, diperlukan untuk pengikatan output Azure Cosmos DB dalam fungsi analisis data Anda
  • File Function.java yang menyertakan implementasi fungsi default
  • Beberapa file uji yang tidak diperlukan tutorial ini

Untuk menghindari kesalahan kompilasi, Anda harus menghapus file uji. Jalankan perintah berikut untuk menavigasi ke folder proyek baru dan hapus folder uji:

cd telemetry-functions
rm -r src/test

Mengambil pengaturan aplikasi fungsi Anda untuk penggunaan lokal

Untuk pengujian lokal, project fungsi Anda akan memerlukan string koneksi yang Anda tambahkan ke aplikasi fungsi Anda di Azure sebelumnya dalam tutorial ini. Gunakan perintah Alat Inti Azure Functions berikut ini, yang mengambil semua pengaturan aplikasi fungsi yang disimpan di cloud dan menambahkannya ke file local.settings.json Anda:

Catatan

Microsoft merekomendasikan penggunaan alur autentikasi paling aman yang tersedia. Alur autentikasi yang dijelaskan dalam prosedur ini, seperti untuk database, cache, olahpesan, atau layanan AI, memerlukan tingkat kepercayaan yang sangat tinggi dalam aplikasi dan membawa risiko yang tidak ada dalam alur lain. Gunakan alur ini hanya ketika opsi yang lebih aman, seperti identitas terkelola untuk koneksi tanpa kata sandi atau tanpa kunci, tidak layak. Untuk operasi komputer lokal, lebih suka identitas pengguna untuk koneksi tanpa kata sandi atau tanpa kunci.

func azure functionapp fetch-app-settings $FUNCTION_APP

Menambahkan kode Java

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

package com.example;

import com.example.TelemetryItem.status;
import com.microsoft.azure.functions.annotation.Cardinality;
import com.microsoft.azure.functions.annotation.CosmosDBOutput;
import com.microsoft.azure.functions.annotation.EventHubOutput;
import com.microsoft.azure.functions.annotation.EventHubTrigger;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.TimerTrigger;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.OutputBinding;

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

    @FunctionName("processSensorData")
    public void processSensorData(
        @EventHubTrigger(
            name = "msg",
            eventHubName = "", // blank because the value is included in the connection string
            cardinality = Cardinality.ONE,
            connection = "EventHubConnectionString")
            TelemetryItem item,
        @CosmosDBOutput(
            name = "databaseOutput",
            databaseName = "TelemetryDb",
            collectionName = "TelemetryInfo",
            connectionStringSetting = "CosmosDBConnectionSetting")
            OutputBinding<TelemetryItem> document,
        final ExecutionContext context) {

        context.getLogger().info("Event hub message received: " + item.toString());

        if (item.getPressure() > 30) {
            item.setNormalPressure(false);
        } else {
            item.setNormalPressure(true);
        }

        if (item.getTemperature() < 40) {
            item.setTemperatureStatus(status.COOL);
        } else if (item.getTemperature() > 90) {
            item.setTemperatureStatus(status.HOT);
        } else {
            item.setTemperatureStatus(status.WARM);
        }

        document.setValue(item);
    }
}

Seperti yang Anda lihat, file ini berisi dua fungsi, generateSensorData dan processSensorData. Fungsi generateSensorData ini menyimulasikan sensor yang mengirim pembacaan suhu dan tekanan ke hub peristiwa. Pemicu timer menjalankan fungsi setiap 10 detik, dan pengikatan output hub peristiwa mengirimkan nilai kembali ke hub peristiwa.

Saat hub acara menerima pesan, hub tersebut menghasilkan peristiwa. Fungsi processSensorData berjalan ketika menerima peristiwa. Kemudian memproses data peristiwa dan menggunakan pengikatan output Azure Cosmos DB untuk mengirim hasil ke Azure Cosmos DB.

Data yang digunakan oleh fungsi-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.example;

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

Menjalankan secara lokal

Sekarang Anda dapat membangun dan menjalankan fungsi secara lokal dan melihat data muncul di Azure Cosmos DB Anda.

Gunakan perintah Maven berikut untuk menyusun dan menjalankan fungsi:

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:

[10/22/19 4:01:30 AM] Executing 'Functions.generateSensorData' (Reason='Timer fired at 2019-10-21T21:01:30.0016769-07:00', Id=c1927c7f-4f70-4a78-83eb-bc077d838410)
[10/22/19 4:01:30 AM] Java Timer trigger function executed at: 2019-10-21T21:01:30.015
[10/22/19 4:01:30 AM] Function "generateSensorData" (Id: c1927c7f-4f70-4a78-83eb-bc077d838410) invoked by Java Worker
[10/22/19 4:01:30 AM] Executed 'Functions.generateSensorData' (Succeeded, Id=c1927c7f-4f70-4a78-83eb-bc077d838410)
[10/22/19 4:01:30 AM] Executing 'Functions.processSensorData' (Reason='', Id=f4c3b4d7-9576-45d0-9c6e-85646bb52122)
[10/22/19 4:01:30 AM] Event hub message received: TelemetryItem={id=null,temperature=32.728691307527015,pressure=10.122563042388165}
[10/22/19 4:01:30 AM] Function "processSensorData" (Id: f4c3b4d7-9576-45d0-9c6e-85646bb52122) invoked by Java Worker
[10/22/19 4:01:38 AM] Executed 'Functions.processSensorData' (Succeeded, Id=1cf0382b-0c98-4cc8-9240-ee2a2f71800d)

Anda kemudian dapat masuk ke portal Microsoft Azure dan menavigasi ke akun Azure Cosmos DB Anda. Pilih Data Explorer, perluas TelemetryInfo, lalu pilih Item untuk melihat data Anda saat data tiba.

Azure Cosmos DB Data Explorer

Menerapkan ke Azure dan menampilkan telemetri aplikasi

Terakhir, Anda dapat menerapkan aplikasi ke Azure dan memverifikasi bahwa aplikasi tersebut terus berfungsi dengan cara yang sama seperti yang dilakukannya secara lokal.

Terapkan proyek Anda ke Azure menggunakan perintah berikut:

mvn azure-functions:deploy

Fungsi Anda sekarang berjalan di Azure, dan terus mengakumulasi data di Azure Cosmos DB Anda. Anda dapat melihat aplikasi fungsi yang diterapkan di portal Microsoft Azure, dan melihat telemetri aplikasi melalui sumber daya Application Insights yang terhubung, seperti yang ditunjukkan pada tangkapan layar berikut:

Stream Metrik Langsung:

Stream Metrik Application Insights Langsung

Performa:

Bilah Performa Application Insights

Membersihkan sumber daya

Bila Anda sudah selesai dengan sumber daya Azure yang Anda buat dalam tutorial ini, Anda bisa menghapusnya menggunakan perintah berikut:

az group delete --name $RESOURCE_GROUP

Langkah berikutnya

Dalam tutorial ini, Anda mempelajari cara membuat Azure Function yang menangani peristiwa Event Hub dan memperbarui instans Azure Cosmos DB. Untuk informasi selengkapnya, lihat panduan pengembang Azure Functions Java. Untuk informasi tentang anotasi yang digunakan, lihat referensi com.microsoft.azure.functions.annotation.

Tutorial ini menggunakan variabel lingkungan dan pengaturan aplikasi untuk menyimpan rahasia seperti string koneksi. Untuk informasi tentang menyimpan rahasia ini di Azure Key Vault, lihat Menggunakan referensi Key Vault untuk App Service dan Azure Functions.

Catatan

Microsoft merekomendasikan penggunaan alur autentikasi paling aman yang tersedia. Alur autentikasi yang dijelaskan dalam prosedur ini, seperti untuk database, cache, olahpesan, atau layanan AI, memerlukan tingkat kepercayaan yang sangat tinggi dalam aplikasi dan membawa risiko yang tidak ada dalam alur lain. Gunakan alur ini hanya ketika opsi yang lebih aman, seperti identitas terkelola untuk koneksi tanpa kata sandi atau tanpa kunci, tidak layak. Untuk operasi komputer lokal, lebih suka identitas pengguna untuk koneksi tanpa kata sandi atau tanpa kunci.

Selanjutnya, pelajari cara menggunakan Azure Pipelines CI/CD untuk penerapan otomatis: