Aracılığıyla paylaş


Öğ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:

  • 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:

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

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.

RESOURCE_GROUP=<value>
FUNCTION_APP=<value>

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 dosya
  • local.settings.json Yerel test için uygulama ayarlarının tutulacak bir dosya
  • host.json Veri analizi işlevinizde Azure Cosmos DB çıkış bağlaması için gereken Azure İşlevleri Uzantı Paketini etkinleştiren bir dosya
  • Function.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:

cd telemetry-functions
rm -r src/test

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:

func azure functionapp fetch-app-settings $FUNCTION_APP

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 processSensorDataiç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ı TelemetryItembir 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:

mvn clean package
mvn azure-functions:run

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 Cosmos DB Data Explorer

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:

mvn azure-functions:deploy

İş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ışı:

Application Insights Live Metrics Stream

Performans:

Application Insights Performance blade

Kaynakları temizleme

Bu öğreticide oluşturduğunuz Azure kaynaklarıyla işiniz bittiğinde aşağıdaki komutu kullanarak silebilirsiniz:

az group delete --name $RESOURCE_GROUP

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: