Rychlý start: Vytvoření funkce Java v Azure z příkazového řádku

V tomto článku použijete nástroje příkazového řádku k vytvoření funkce Java, která reaguje na požadavky HTTP. Po místním testování kódu ho nasadíte do bezserverového prostředí Azure Functions.

Pokud Maven není vaším upřednostňovaným vývojovým nástrojem, podívejte se na naše podobné kurzy pro vývojáře v Javě:

Dokončením tohoto rychlého startu se v účtu Azure účtují malé náklady na několik centů USD nebo méně.

Konfigurace místního prostředí

Než začnete, musíte mít následující:

Kontrola předpokladů

  • V terminálu nebo příkazovém okně zkontrolujtefunc --version, jestli jsou nástroje Azure Functions Core Tools verze 4.x.

  • Spusťte az --version kontrolu verze Azure CLI verze 2.4 nebo novější.

  • Spusťte az login přihlášení k Azure a ověřte aktivní předplatné.

Vytvoření projektu místní funkce

V Azure Functions je projekt funkce kontejnerem pro jednu nebo více jednotlivých funkcí, které každý reaguje na konkrétní aktivační událost. Všechny funkce v projektu sdílejí stejné místní konfigurace a hostování. V této části vytvoříte projekt funkce, který obsahuje jednu funkci.

  1. Spuštěním následujícího příkazu v prázdné složce vygenerujte projekt Functions z archetypu Maven.

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

    Důležité

    • Pokud chcete funkce spouštět ve verzi Java 11, použijte -DjavaVersion=11. Další informace najdete v tématu Verze Javy.
    • Proměnná JAVA_HOME prostředí musí být nastavena na umístění instalace správné verze sady JDK, aby bylo možné dokončit tento článek.
  2. Maven vás požádá o hodnoty potřebné k dokončení generování projektu při nasazení.
    Po zobrazení výzvy zadejte následující hodnoty:

    Výzva Hodnota Popis
    groupId com.fabrikam Hodnota, která jednoznačně identifikuje váš projekt ve všech projektech podle pravidel pojmenování balíčku pro Javu.
    artifactId fabrikam-functions Hodnota, která je názvem souboru JAR, bez čísla verze.
    Verze 1.0-SNAPSHOT Zvolte výchozí hodnotu.
    Balíček com.fabrikam Hodnota, která je balíčkem Java pro vygenerovaný kód funkce. Použijte výchozí hodnotu.
  3. Potvrďte zadáním Y nebo stisknutím klávesy Enter.

    Maven vytvoří soubory projektu v nové složce s názvem artifactId, který je fabrikam-functionsv tomto příkladu .

  4. Přejděte do složky projektu:

    cd fabrikam-functions
    

    Tato složka obsahuje různé soubory projektu, včetně konfiguračních souborů s názvem local.settings.json a host.json. Protože local.settings.json může obsahovat tajné kódy stažené z Azure, soubor je ve výchozím nastavení vyloučen ze správy zdrojového kódu v souboru .gitignore .

(Volitelné) Prozkoumání obsahu souboru

V případě potřeby můžete funkci spustit místně a později prozkoumat obsah souboru.

Function.java

Function.java obsahuje metodu run , která přijímá data požadavku v request proměnné je HttpRequestMessage , která je zdobena poznámkou HttpTrigger , která definuje chování triggeru.

/**
 * 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.FixedDelayRetry;
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();
        }
    }

    public static int count = 1;

    /**
     * This function listens at endpoint "/api/HttpExampleRetry". The function is re-executed in case of errors until the maximum number of retries occur.
     * Retry policies: https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-error-pages?tabs=java
     */
    @FunctionName("HttpExampleRetry")
    @FixedDelayRetry(maxRetryCount = 3, delayInterval = "00:00:05")
    public HttpResponseMessage HttpExampleRetry(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET, HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) throws Exception {
        context.getLogger().info("Java HTTP trigger processed a request.");

        if(count<3) {
            count ++;
            throw new Exception("error");
        }

        // 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(name).build();
        }
    }

    /**
     * This function listens at endpoint "/api/HttpTriggerJavaVersion".
     * It can be used to verify the Java home and java version currently in use in your Azure function
     */
    @FunctionName("HttpTriggerJavaVersion")
    public static HttpResponseMessage HttpTriggerJavaVersion(
        @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.");
        final String javaVersion = getJavaVersion();
        context.getLogger().info("Function - HttpTriggerJavaVersion" + javaVersion);
        return request.createResponseBuilder(HttpStatus.OK).body("HttpTriggerJavaVersion").build();
    }

    public static String getJavaVersion() {
        return String.join(" - ", System.getProperty("java.home"), System.getProperty("java.version"));
    }
}

Zpráva odpovědi je generována rozhraním HTTPResponseMessage.Builder API.

pom.xml

Nastavení prostředků Azure vytvořených pro hostování vaší aplikace jsou definovány v elementu konfigurace modulu plug-in se skupinouIdcom.microsoft.azure vygenerovaného souboru pom.xml. Například následující element konfigurace dává nasazení mavenu pokyn k vytvoření aplikace funkcí ve java-functions-group skupině prostředků v westus oblasti. Samotná aplikace funkcí běží na Windows hostované v java-functions-app-service-plan plánu, což je ve výchozím nastavení bezserverový plán Consumption.

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

Toto nastavení můžete změnit tak, aby bylo možné řídit, jak se prostředky vytvářejí v Azure, například změnou runtime.os z windows nabídky na linux před počátečním nasazením. Úplný seznam nastavení podporovaných modulem plug-in Maven najdete v podrobnostech konfigurace.

FunctionTest.java

Archetype také generuje test jednotek pro vaši funkci. Když funkci změníte tak, aby přidávala vazby nebo přidávala nové funkce do projektu, budete také muset upravit testy v souboru FunctionTest.java .

Místní spuštění funkce

  1. Spusťte funkci spuštěním místního hostitele modulu runtime Azure Functions ze složky LocalFunctionProj:

    mvn clean package
    mvn azure-functions:run
    

    Na konci výstupu by se měly zobrazit následující řádky:

     ...
    
     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
     ...
    
     

    Poznámka

    Pokud se httpExample nezobrazí, jak je znázorněno výše, pravděpodobně jste hostitele spustili mimo kořenovou složku projektu. V takovém případě pomocí CtrlC+ zastavte hostitele, přejděte do kořenové složky projektu a spusťte předchozí příkaz znovu.

  2. Zkopírujte adresu URL funkce HttpExample z tohoto výstupu do prohlížeče a připojte řetězec ?name=<YOUR_NAME>dotazu , čímž se zobrazí úplná adresa URL, jako je http://localhost:7071/api/HttpExample?name=Functions. Prohlížeč by měl zobrazit zprávu, která vrací zpět hodnotu řetězce dotazu. Terminál, ve kterém jste spustili projekt, zobrazuje také výstup protokolu při provádění požadavků.

  3. Až budete hotovi, použijte Kombinaci kláves CtrlC+ a zvoltey, jestli chcete zastavit hostitele funkcí.

Nasazení projektu funkce do Azure

Aplikace funkcí a související prostředky se vytvářejí v Azure při prvním nasazení projektu functions. Nastavení prostředků Azure vytvořených pro hostování vaší aplikace jsou definovány v souborupom.xml. V tomto článku přijmete výchozí hodnoty.

Tip

Pokud chcete vytvořit aplikaci funkcí spuštěnou v Linuxu místo Windows, změňte runtime.os prvek v souboru pom.xml z windows na linux. V těchto oblastech se podporuje spouštění Linuxu v plánu consumption. Nemůžete mít aplikace, které běží v Linuxu a aplikacích, které běží na Windows ve stejné skupině prostředků.

  1. Před nasazením se přihlaste k předplatnému Azure pomocí Azure CLI nebo Azure PowerShell.

    az login
    

    Příkaz az login vás přihlásí ke svému účtu Azure.

  2. Pomocí následujícího příkazu nasaďte projekt do nové aplikace funkcí.

    mvn azure-functions:deploy
    

    Tím se v Azure vytvoří následující prostředky:

    • Skupina prostředků Pojmenováno jako java-functions-group.
    • Storage účet. Vyžaduje funkce. Název se generuje náhodně na základě požadavků na název účtu Storage.
    • Plán hostování. Bezserverové hostování vaší aplikace funkcí v oblasti westus Název je java-functions-app-service-plan.
    • Aplikace funkcí Aplikace funkcí je jednotka nasazení a spouštění pro vaše funkce. Název se náhodně vygeneruje na základě id artefaktu připojeného s náhodně vygenerovaným číslem.

    Nasazení zabalí soubory projektu a nasadí je do nové aplikace funkcí pomocí nasazení zip. Kód běží z balíčku nasazení v Azure.

Vyvolání funkce v Azure

Vzhledem k tomu, že vaše funkce používá trigger HTTP, vyvoláte ho tak, že vytvoříte požadavek HTTP na jeho adresu URL v prohlížeči nebo pomocí nástroje, jako je curl.

Zkopírujte úplnou adresu URL vyvolání zobrazené ve výstupu příkazu publish do adresního řádku prohlížeče a připojte parametr ?name=Functionsdotazu . Prohlížeč by měl zobrazit podobný výstup jako při místním spuštění funkce.

The output of the function run on Azure in a browser

Spuštěním následujícího příkazu zobrazte protokoly streamování téměř v reálném čase:

func azure functionapp logstream <APP_NAME> 

V samostatném okně terminálu nebo v prohlížeči znovu zavolejte vzdálenou funkci. Podrobný protokol provádění funkcí v Azure se zobrazí v terminálu.

Vyčištění prostředků

Pokud budete pokračovat v dalším kroku a přidáte výstupní vazbu fronty Azure Storage, ponechte všechny prostředky na místě, jak budete vytvářet, co jste už udělali.

V opačném případě pomocí následujícího příkazu odstraňte skupinu prostředků a všechny její obsažené prostředky, abyste se vyhnuli dalším nákladům.

az group delete --name java-functions-group

Další kroky