Hızlı Başlangıç: Komut satırıyla Azure'da Java işlevi oluşturma

Bu makalede, HTTP isteklerine yanıt veren bir Java işlevi oluşturmak için komut satırı araçlarını kullanırsiniz. Kodu yerel olarak test ettikten sonra sunucusuz ortamına dağıtabilirsiniz Azure İşlevleri.

Maven tercih ettiğiniz geliştirme aracı değilse Java geliştiricilerine benzer öğreticilerimize göz atabilirsiniz:

Bu hızlı başlangıç tamamladıktan sonra Azure hesabınıza birkaç ABD doları veya daha düşük bir maliyetle sahip oluruz.

Yerel ortamınızı yapılandırma

Başlamadan önce aşağıdakilere sahip olmak gerekir:

Önkoşul denetimi

  • Terminalde veya komut penceresinde komutunu func --version çalıştırarak dosyanın 4.x Azure Functions Core Tools olup ola olduğunu kontrol edin.

  • az --versionAzure CLI sürümünün 2.4 veya sonraki bir sürüm olup olduğunu kontrol etmek için çalıştırın.

  • az loginAzure'da oturum açma ve etkin aboneliği doğrulama için çalıştırın.

Yerel işlev projesi oluşturma

İşlev Azure İşlevleri, her biri belirli bir tetikleyiciye yanıt veren bir veya daha fazla bağımsız işleve yönelik bir kapsayıcıdır. Projede yer alan tüm işlevler aynı yerel ve barındırma yapılandırmalarını paylaşır. Bu bölümde, tek bir işlev içeren bir işlev projesi oluşturabilirsiniz.

  1. İşlevler projesini bir Maven arketipinden oluşturmak için boş bir klasörde aşağıdaki komutu çalıştırın.

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8
    

    Önemli

    • İşlevlerinizin Java 11 üzerinde çalışmasını istiyorsanız -DjavaVersion=11 ifadesini kullanın. Daha fazla bilgi için bkz. Java sürümleri.
    • Bu JAVA_HOME makaleyi tamamlamak için ortam değişkeninin JDK'nin doğru sürümünün yükleme konumu olarak ayarlanmış olması gerekir.
  2. Maven, dağıtımda proje oluşturma işlemi tamamlamak için gereken değerleri sorar.
    İstendiğinde aşağıdaki değerleri sağlar:

    İstem Değer Açıklama
    groupId com.fabrikam Java için paket adlandırma kurallarına uygun olarak projenizi tüm projelerde benzersiz şekilde tanımlayan bir değer.
    Artifactıd fabrikam-functions Sürüm numarası olmadan jar'ın adı olan bir değer.
    Sürüm 1.0-SNAPSHOT Varsayılan değeri seçin.
    Paket com.fabrikam Oluşturulan işlev kodu için Java paketi olan bir değer. Varsayılan değeri kullanın.
  3. Onaylamak Y için Enter tuşuna basın veya yazın.

    Maven, bu örnekte olan artifactId adıyla yeni bir klasörde proje dosyalarını fabrikam-functions oluşturur.

  4. Proje klasörüne gidin:

    cd fabrikam-functions
    

    Bu klasör, projenin local.settings.json ve host.json adlı yapılandırma dosyaları da dahil olmak üzere çeşitli dosyaları içerir. local.settings.json, Azure'dan indirilen gizli dizileri içereyeneden dosya, .gitignore dosyasında varsayılan olarak kaynak denetiminden dışlanmış olur.

(İsteğe bağlı) Dosya içeriğini inceleme

İsterseniz İşlevi yerel olarak çalıştırma ve dosya içeriğini daha sonra inceleme adımına atlayabilirsiniz.

Function.java

Function.java, değişkende istek verilerini alan bir yöntem içerir. Bu yöntem, tetikleyici davranışını tanımlayan HttpTrigger ek açıklamasıyla bir run request HttpRequestMessage'dır.

/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 */

package com.functions;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;

import java.util.Optional;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/HttpExample". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/HttpExample
     * 2. curl "{your host}/api/HttpExample?name=HTTP%20Query"
     */
    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET, HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        final String query = request.getQueryParameters().get("name");
        final String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
        } else {
            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
        }
    }
}

Yanıt iletisi HttpResponseMessage.Builder API'si tarafından oluşturulur.

pom.xml

Ayarlar barındırmak için oluşturulan Azure kaynakları, eklentinin yapılandırma öğesinde, oluşturulan pom.xml dosyasında groupId com.microsoft.azure ile tanımlanır. Örneğin, aşağıdaki yapılandırma öğesi Maven tabanlı bir dağıtıma bölgedeki kaynak grubunda bir işlev java-functions-group uygulaması oluşturma talimatı westus verir. İşlev uygulaması, varsayılan Windows sunucusuz Tüketim planı olan planda barındırılan java-functions-app-service-plan bir uygulama üzerinde çalışır.

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-functions-maven-plugin</artifactId>
    <version>${azure.functions.maven.plugin.version}</version>
    <configuration>
        <!-- function app name -->
        <appName>${functionAppName}</appName>
        <!-- function app resource group -->
        <resourceGroup>${functionResourceGroup}</resourceGroup>
        <!-- function app service plan name -->
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <!-- function app region-->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values -->
        <region>${functionAppRegion}</region>
        <!-- function pricingTier, default to be consumption if not specified -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values -->
        <!-- <pricingTier></pricingTier> -->

        <!-- Whether to disable application insights, default is false -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights-->
        <!-- <disableAppInsights></disableAppInsights> -->
        <runtime>
            <!-- runtime os, could be windows, linux or docker-->
            <os>windows</os>
            <javaVersion>8</javaVersion>
            <!-- for docker function, please set the following parameters -->
            <!-- <image>[hub-user/]repo-name[:tag]</image> -->
            <!-- <serverId></serverId> -->
            <!-- <registryUrl></registryUrl>  -->
        </runtime>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~3</value>
            </property>
        </appSettings>
    </configuration>
    <executions>
        <execution>
            <id>package-functions</id>
            <goals>
                <goal>package</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Kaynakların Azure'da nasıl oluşturulacaklarını kontrol etmek için bu ayarları değiştirebilirsiniz. Örneğin, ilk dağıtımdan önce olarak runtime.os windows olarak linux değiştirebilirsiniz. Maven eklentisi tarafından desteklenen ayarların tam listesi için yapılandırma ayrıntılarına bakın.

FunctionTest.java

Archetype işleviniz için bir birim testi de üretir. İşlevini bağlama eklemek veya projeye yeni işlevler eklemek için değiştirerek FunctionTest.java dosyasındaki testleri de değiştirmeniz gerekir.

İşlevi yerel olarak çalıştırma

  1. LocalFunctionProj klasöründen yerel Azure İşlevleri çalışma zamanı ana bilgisayarını başlatarak işlevinizi çalıştırın:

    mvn clean package
    mvn azure-functions:run
    

    Çıkışın sonuna doğru aşağıdaki satırların görünmesi gerekir:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    Not

    HttpExample yukarıda gösterildiği gibi görünmüyorsa, ana bilgisayarı büyük olasılıkla projenin kök klasörünün dışından başlatmışsınızdır. Bu durumda, Ctrl C tuşlarını kullanarak ana bilgisayarı durdurun, projenin kök klasörüne gidin ve + önceki komutu yeniden çalıştırın.

  2. İşlevin URL'sini bu çıkıştan bir tarayıcıya kopyalayın ve sorgu dizesini HttpExample ?name=<YOUR_NAME> ekleyin; tam URL'yi gibi http://localhost:7071/api/HttpExample?name=Functions yapın. Tarayıcıda sorgu dizesi değerinizi geri yankıya alan bir ileti görüntüleniyor olmalıdır. Projenizi başlatan terminal, istekte bulunurken günlük çıkışını da gösterir.

  3. Bitirin, Ctrl C tuşlarını + kullanın ve işlevler y ana bilgisayarlarını durdurmayı seçin.

İşlev projesini Azure'a dağıtma

İşlev projenizi ilk dağıtarak Azure'da bir işlev uygulaması ve ilgili kaynaklar oluşturulur. Ayarlar barındırmak için oluşturulan Azure kaynaklarının kaynakları,pom.xml tanımlanır. Bu makalede varsayılan değerleri kabul edersiniz.

İpucu

Linux üzerinde çalışan bir işlev uygulaması oluşturmak için Windows dosyasındaki öğesini runtime.os olarak pom.xml windows olarak linux değiştirebilirsiniz. Linux'ın bir tüketim planında çalıştır bu bölgelerde de desteklemektedir. Linux üzerinde çalıştıran uygulamalarınız ve aynı kaynak grubunda Windows uygulamalarınız olması gerekir.

  1. Dağıtımdan önce Azure CLI veya azure aboneliğinizi kullanarak Azure aboneliğinde Azure PowerShell.

    az login
    

    az login komutu sizi Azure hesabınızla imzalar.

  2. Projenizi yeni bir işlev uygulamasına dağıtmak için aşağıdaki komutu kullanın.

    mvn azure-functions:deploy
    

    Bu işlem Azure'da aşağıdaki kaynakları oluşturur:

    • Kaynak grubu. java-functions-group olarak adlandırılmıştır.
    • Depolama hesabı. İşlevler için gereklidir. Ad, hesap adı gereksinimlerine göre Depolama rastgele oluşturulur.
    • Barındırma planı. Westus bölgesinde işlev uygulamanız için sunucusuz barındırma. Adı java-functions-app-service-plan'dır.
    • İşlev uygulaması. İşlev uygulaması, işlevleriniz için dağıtım ve yürütme birimidir. Ad, artifactId'nize göre rastgele olarak oluşturulur ve rastgele oluşturulan bir sayı eklenir.

    Dağıtım, proje dosyalarını paketler ve zip dağıtımını kullanarak yeni işlev uygulamasına dağıtır. Kod, Azure'daki dağıtım paketinden çalışır.

Azure 'da işlevi çağırma

İşleviniz bir HTTP tetikleyicisi kullandığından, tarayıcıda URL 'sine veya kıvrıcı gibi bir araçla HTTP isteği yaparak bu uygulamayı çağırabilirsiniz.

Yayımla komutunun çıktısında gösterilen tüm ÇAĞıRMA URL 'sini, sorgu parametresini ekleyerek bir tarayıcı adres çubuğuna kopyalayın &name=Functions . , İşlevi yerel olarak çalıştırdığınızda tarayıcı benzer bir çıktı görüntülemelidir.

Azure üzerinde çalışan işlevin çıktısı bir tarayıcıda

Neredeyse gerçek zamanlı akış günlüklerinigörüntülemek için aşağıdaki komutu çalıştırın:

func azure functionapp logstream <APP_NAME> 

Ayrı bir Terminal penceresinde veya tarayıcıda, uzak işlevi yeniden çağırın. Azure 'da işlev yürütmenin ayrıntılı günlüğü terminalde gösterilir.

Kaynakları temizleme

Bir sonraki adıma devam eder ve bir Azure Depolama kuyruğu çıkış bağlaması eklersanız, tüm kaynaklarınızı hazır durumda tutmanız gerekir.

Aksi takdirde, daha fazla maliyete neden olmaktan kaçınmak için aşağıdaki komutu kullanarak kaynak grubunu ve içerdiği tüm kaynakları silin.

az group delete --name java-functions-group

Sonraki adımlar