Öğretici: Olay Hub'ı tetikleyicisi ve Azure Cosmos DB çıkış bağlaması ile Java'da işlev oluşturma
Bu öğreticide, sıcaklık ve basınç verilerinin sürekli akışını analiz eden bir Java işlevi oluşturmak için Azure İşlevleri nasıl kullanılacağı gösterilmektedir. Algılayıcı okumalarını temsil eden olay hub'ı olayları işlevi tetikler. İşlev olay verilerini işler ve ardından azure Cosmos DB örneğine durum girdileri ekler.
Bu öğreticide şunları yapacaksınız:
- Azure CLI'yi kullanarak Azure kaynakları oluşturun ve yapılandırın.
- Bu kaynaklarla etkileşim kuran Java işlevleri oluşturun ve test edin.
- İşlevlerinizi Azure'a dağıtın ve Uygulama Analizler ile izleyin.
Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.
Ön koşullar
Bu öğreticiyi tamamlamak için aşağıdakilerin yüklü olması gerekir:
- Java Developer Kit, sürüm 8
- Apache Maven, sürüm 3.0 veya üzeri
- Azure İşlevleri Core Tools sürüm 2.6.666 veya üzeri
Azure Cloud Shell'de Bash ortamını kullanın. Daha fazla bilgi için bkz . Azure Cloud Shell'de Bash için hızlı başlangıç.
CLI başvuru komutlarını yerel olarak çalıştırmayı tercih ediyorsanız Azure CLI'yı yükleyin . Windows veya macOS üzerinde çalışıyorsanız Azure CLI’yi bir Docker kapsayıcısında çalıştırmayı değerlendirin. Daha fazla bilgi için bkz . Docker kapsayıcısında Azure CLI'yi çalıştırma.
Yerel yükleme kullanıyorsanız az login komutunu kullanarak Azure CLI ile oturum açın. Kimlik doğrulama işlemini tamamlamak için terminalinizde görüntülenen adımları izleyin. Diğer oturum açma seçenekleri için bkz . Azure CLI ile oturum açma.
İstendiğinde, ilk kullanımda Azure CLI uzantısını yükleyin. Uzantılar hakkında daha fazla bilgi için bkz. Azure CLI ile uzantıları kullanma.
Yüklü sürümü ve bağımlı kitaplıkları bulmak için az version komutunu çalıştırın. En son sürüme yükseltmek için az upgrade komutunu çalıştırın.
Önemli
Bu JAVA_HOME
öğreticiyi tamamlamak için ortam değişkeni JDK'nin yükleme konumuna ayarlanmalıdır.
Bu öğreticinin kodunu doğrudan kullanmayı tercih ediyorsanız java-functions-eventhub-cosmosdb örnek deposuna bakın.
Azure kaynakları oluşturma
Bu öğreticide şu kaynaklara ihtiyacınız olacaktır:
- Diğer kaynakları içerecek kaynak grubu
- Event Hubs ad alanı, olay hub'ı ve yetkilendirme kuralı
- Azure Cosmos DB hesabı, veritabanı ve koleksiyonu
- Bir işlev uygulaması ve onu barındıracak bir depolama hesabı
Aşağıdaki bölümlerde, Azure CLI kullanarak bu kaynakların nasıl oluşturulacağı gösterilmektedir.
Ortam değişkenlerini belirleme
Ardından, oluşturacağınız kaynakların adları ve konumu için bazı ortam değişkenleri oluşturun. Yer tutucuları seçtiğiniz değerlerle değiştirerek <value>
aşağıdaki komutları kullanın. Değerler, Azure kaynakları için adlandırma kurallarına ve kısıtlamalarına uygun olmalıdır. değişkeni için LOCATION
komutu tarafından az functionapp list-consumption-locations
üretilen değerlerden birini kullanın.
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>
Bu öğreticinin geri kalanında bu değişkenler kullanılır. Bu değişkenlerin yalnızca geçerli Azure CLI veya Cloud Shell oturumunuz boyunca kalıcı olduğunu unutmayın. Farklı bir yerel terminal penceresi kullanıyorsanız veya Cloud Shell oturumunuz zaman aşımına uysa bu komutları yeniden çalıştırmanız gerekir.
Kaynak grubu oluşturma
Azure, hesabınızdaki tüm ilgili kaynakları toplamak için kaynak gruplarını kullanır. Bu şekilde, bunları bir birim olarak görüntüleyebilir ve işiniz bittiğinde tek bir komutla silebilirsiniz.
Kaynak grubu oluşturmak için aşağıdaki komutu kullanın:
Olay hub’ı oluşturma
Ardından aşağıdaki komutları kullanarak bir Azure Event Hubs ad alanı, olay hub'ı ve yetkilendirme kuralı oluşturun:
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 \
--message-retention 1
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
Event Hubs ad alanı gerçek olay hub'ını ve yetkilendirme kuralını içerir. Yetkilendirme kuralı, işlevlerinizin hub'a ileti göndermesini ve ilgili olayları dinlemesini sağlar. Bir işlev telemetri verilerini temsil eden iletiler gönderir. Başka bir işlev olayları dinler, olay verilerini analiz eder ve sonuçları Azure Cosmos DB'de depolar.
Azure Cosmos DB oluşturma
Ardından aşağıdaki komutları kullanarak bir Azure Cosmos DB hesabı, veritabanı ve koleksiyonu oluşturun:
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'
Değer, partition-key-path
verilerinizi her öğenin değerine göre temperatureStatus
bölümlere ayırır. Bölüm anahtarı, Azure Cosmos DB'nin verilerinizi bağımsız olarak erişebileceği ayrı alt kümelere bölerek performansı artırmasını sağlar.
Depolama hesabı ve işlev uygulaması oluşturma
Ardından, Azure İşlevleri için gerekli olan bir Azure Depolama hesabı oluşturun ve ardından işlev uygulamasını oluşturun. Aşağıdaki komutları kullanın:
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 3
Komut işlev uygulamanızı oluşturduğundaaz functionapp create
, aynı ada sahip bir Application Analizler kaynağı da oluşturur. İşlev uygulaması, uygulama Analizler bağlayan adlı APPINSIGHTS_INSTRUMENTATIONKEY
bir ayar ile otomatik olarak yapılandırılır. İşlevlerinizi Azure'a dağıtdıktan sonra, bu öğreticinin ilerleyen bölümlerinde açıklandığı gibi uygulama telemetrisini görüntüleyebilirsiniz.
İşlev uygulamanızı yapılandırma
İşlev uygulamanızın doğru çalışması için diğer kaynaklara erişmesi gerekir. Aşağıdaki bölümlerde, işlev uygulamanızı yerel makinenizde çalışacak şekilde nasıl yapılandırabileceğiniz gösterilmektedir.
Kaynak bağlantı dizesi alma
Depolama, olay hub'ı ve Azure Cosmos DB bağlantı dizesi almak ve bunları ortam değişkenlerine kaydetmek için aşağıdaki komutları kullanın:
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
Bu değişkenler, Azure CLI komutlarından alınan değerlere ayarlanır. Her komut, döndürülen JSON yükünden bağlantı dizesi ayıklamak için bir JMESPath sorgusu kullanır. bağlantı dizesi da kullanılarak echo
görüntülenir, böylece başarıyla alındıklarını onaylayabilirsiniz.
İşlev uygulaması ayarlarınızı güncelleştirme
Ardından, bağlantı dizesi değerlerini Azure İşlevleri hesabınızdaki uygulama ayarlarına aktarmak için aşağıdaki komutu kullanın:
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
Azure kaynaklarınız artık oluşturuldu ve birlikte düzgün çalışacak şekilde yapılandırıldı.
İşlevlerinizi oluşturma ve test edin
Ardından yerel makinenizde bir proje oluşturacak, Java kodu ekleyeceksiniz ve bunu test edin. Maven için Azure İşlevleri Eklentisi ve Azure İşlevleri Temel Araçları ile çalışan komutları kullanacaksınız. İşlevleriniz yerel olarak çalışır, ancak oluşturduğunuz bulut tabanlı kaynakları kullanır. İşlevleri yerel olarak çalıştırdıktan sonra Maven'ı kullanarak bunları buluta dağıtabilir, verilerinizin ve analizlerinizin biriktiğini izleyebilirsiniz.
Kaynaklarınızı oluşturmak için Cloud Shell kullandıysanız Azure'a yerel olarak bağlanmazsınız. Bu durumda, tarayıcı tabanlı oturum açma işlemini başlatmak için komutunu kullanın az login
. Daha sonra gerekirse, varsayılan aboneliği ve ardından abonelik az account set --subscription
kimliğini ayarlayın. Son olarak, yerel makinenizde bazı ortam değişkenlerini yeniden oluşturmak için aşağıdaki komutları çalıştırın. <value>
Yer tutucuları daha önce kullandığınız değerlerle değiştirin.
Yerel işlevler projesi oluşturma
İşlev projesi oluşturmak ve gerekli bağımlılıkları eklemek için aşağıdaki Maven komutunu kullanın.
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
Bu komut bir telemetry-functions
klasörün içinde birkaç dosya oluşturur:
pom.xml
Maven ile kullanılacak bir dosyalocal.settings.json
Yerel test için uygulama ayarlarının tutulacak bir dosyahost.json
Veri analizi işlevinizde Azure Cosmos DB çıkış bağlaması için gereken Azure İşlevleri Uzantı Paketini etkinleştiren bir dosyaFunction.java
Varsayılan işlev uygulamasını içeren bir dosya- Bu öğreticinin gerek duymadığı birkaç test dosyası
Derleme hatalarını önlemek için test dosyalarını silmeniz gerekir. Yeni proje klasörüne gitmek ve test klasörünü silmek için aşağıdaki komutları çalıştırın:
Yerel kullanım için işlev uygulaması ayarlarınızı alma
Yerel test için işlev projenizin bu öğreticinin önceki bölümlerinde Azure'daki işlev uygulamanıza eklediğiniz bağlantı dizesi gerekir. Bulutta depolanan tüm işlev uygulaması ayarlarını alan ve bunları dosyanıza local.settings.json
ekleyen aşağıdaki Azure İşlevleri Core Tools komutunu kullanın:
Java kodu ekleme
Ardından, dosyayı açın Function.java
ve içeriğini aşağıdaki kodla değiştirin.
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",
containerName = "TelemetryInfo",
connection = "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);
}
}
Gördüğünüz gibi, bu dosya ve adlı iki işlev generateSensorData
processSensorData
içerir. İşlev, olay hub'ına generateSensorData
sıcaklık ve basınç okumaları gönderen bir algılayıcının simülasyonunu oluşturur. Zamanlayıcı tetikleyicisi işlevi 10 saniyede bir çalıştırır ve olay hub'ı çıkış bağlaması dönüş değerini olay hub'ına gönderir.
Olay hub'ı iletiyi aldığında bir olay oluşturur. İşlev, processSensorData
olayı aldığında çalışır. Ardından olay verilerini işler ve sonuçları Azure Cosmos DB'ye göndermek için bir Azure Cosmos DB çıkış bağlaması kullanır.
Bu işlevler tarafından kullanılan veriler, uygulamanız gereken adlı TelemetryItem
bir sınıf kullanılarak depolanır. ile aynı konumda Function.java
adlı TelemetryItem.java
yeni bir dosya oluşturun ve aşağıdaki kodu ekleyin:
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;
}
}
Yerel ortamda komutunu çalıştırma
Artık işlevleri yerel olarak derleyip çalıştırabilir ve Verilerin Azure Cosmos DB'nizde göründüğünü görebilirsiniz.
İşlevleri derlemek ve çalıştırmak için aşağıdaki Maven komutlarını kullanın:
Bazı derleme ve başlangıç iletilerinin ardından, işlevler her çalıştırıldığında aşağıdaki örneğe benzer bir çıktı görürsünüz:
[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)
Ardından Azure portalına gidip Azure Cosmos DB hesabınıza gidebilirsiniz. Veri Gezgini'i seçin, TelemetryInfo'yı genişletin, ardından öğeler'i seçerek verileriniz geldiğinde görüntüleyin.
Azure'a dağıtma ve uygulama telemetrisini görüntüleme
Son olarak uygulamanızı Azure'a dağıtabilir ve yerel olarak olduğu gibi çalışmaya devam ettiğini doğrulayabilirsiniz.
Aşağıdaki komutu kullanarak projenizi Azure'a dağıtın:
İşlevleriniz artık Azure'da çalışır ve Azure Cosmos DB'nizde veri toplamaya devam eder. Dağıtılan işlev uygulamanızı Azure portalında görüntüleyebilir ve aşağıdaki ekran görüntülerinde gösterildiği gibi bağlı Uygulama Analizler kaynağı üzerinden uygulama telemetrisini görüntüleyebilirsiniz:
Canlı Ölçüm Akışı:
Performans:
Kaynakları temizleme
Bu öğreticide oluşturduğunuz Azure kaynaklarıyla işiniz bittiğinde aşağıdaki komutu kullanarak silebilirsiniz:
Sonraki adımlar
Bu öğreticide, Olay Hub'ı olaylarını işleyen ve Azure Cosmos DB örneğini güncelleştiren bir Azure İşlevi oluşturmayı öğrendiniz. Daha fazla bilgi için Azure İşlevleri Java geliştirici kılavuzuna bakın. Kullanılan ek açıklamalar hakkında bilgi için bkz . com.microsoft.azure.functions.annotation başvurusu.
Bu öğreticide, bağlantı dizesi gibi gizli dizileri depolamak için ortam değişkenleri ve uygulama ayarları kullanılmıştır. Bu gizli dizileri Azure Key Vault'ta depolama hakkında bilgi için bkz. App Service ve Azure İşlevleri için Key Vault başvurularını kullanma.
Ardından, otomatik dağıtım için Azure Pipelines CI/CD'yi kullanmayı öğrenin:
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin