Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- Java Developer Kit, versi 8
- Apache Maven, versi 3.0 atau ke atas
- Azure Functions Core Tools versi 2.6.666 ke atas
Gunakan lingkungan Bash di Azure Cloud Shell. Untuk informasi selengkapnya, lihat Mulai menggunakan Azure Cloud Shell.
Jika Anda lebih suka menjalankan perintah referensi CLI secara lokal, instal Azure CLI. Jika Anda menjalankan Windows atau macOS, pertimbangkan untuk menjalankan Azure CLI dalam kontainer Docker. Untuk informasi lebih lanjut, lihat Cara menjalankan Azure CLI di kontainer Docker.
Jika Anda menggunakan instalasi lokal, masuk ke Azure CLI dengan menggunakan perintah login az. Untuk menyelesaikan proses autentikasi, ikuti langkah-langkah yang ditampilkan di terminal Anda. Untuk opsi masuk lainnya, lihat Mengautentikasi ke Azure menggunakan Azure CLI.
Saat Anda diminta, instal ekstensi Azure CLI pada penggunaan pertama. Untuk informasi selengkapnya tentang ekstensi, lihat Menggunakan dan mengelola ekstensi dengan Azure CLI.
Jalankan versi az untuk menemukan versi dan pustaka dependen yang diinstal. Untuk meningkatkan ke versi terbaru, jalankan peningkatan az.
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:
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.
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.xmluntuk digunakan dengan Maven - File
local.settings.jsonuntuk menyimpan pengaturan aplikasi untuk pengujian lokal -
host.jsonFile yang mengaktifkan Bundel Ekstensi Azure Functions, diperlukan untuk pengikatan output Azure Cosmos DB dalam fungsi analisis data Anda - File
Function.javayang 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:
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.
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:
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.
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:
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:
Performa:
Membersihkan sumber daya
Bila Anda sudah selesai dengan sumber daya Azure yang Anda buat dalam tutorial ini, Anda bisa menghapusnya menggunakan perintah berikut:
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: