Snabbstart: Skapa en Java-funktion i Azure från kommandoraden

I den här artikeln använder du kommandoradsverktyg för att skapa en Java-funktion som svarar på HTTP-begäranden. När du har testat koden lokalt distribuerar du den till den serverlösa miljön i Azure Functions.

Om Maven inte är det utvecklingsverktyg du föredrar kan du läsa våra liknande självstudier för Java-utvecklare:

Slutförande av den här snabbstarten medför en liten kostnad på några USD-cent eller mindre på ditt Azure-konto.

Konfigurera din lokala miljö

Innan du börjar måste du ha följande:

Installera Azure Functions Core Tools

Det rekommenderade sättet att installera Core Tools beror på operativsystemet på din lokala utvecklingsdator.

Följande steg använder ett Windows-installationsprogram (MSI) för att installera Core Tools v4.x. Mer information om andra paketbaserade installationsprogram finns i Core Tools readme.

Ladda ned och kör installationsprogrammet för Core Tools baserat på din version av Windows:

Om du tidigare använde Windows-installationsprogrammet (MSI) för att installera Core Tools i Windows bör du avinstallera den gamla versionen från Lägg till Ta bort program innan du installerar den senaste versionen.

Skapa ett lokalt funktionsprojekt

I Azure Functions är ett funktionsprojekt en container för en eller flera enskilda funktioner som var och en svarar på en specifik utlösare. Alla funktioner i ett projekt delar samma lokala konfigurationer och värdkonfigurationer. I det här avsnittet skapar du ett funktionsprojekt som innehåller en enda funktion.

  1. Kör följande kommando i en tom mapp för att skapa ett funktionsprojekt utifrån en Maven-arketyp.

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

    Viktigt!

    • Använd -DjavaVersion=11 om du vill att funktionerna ska köras på Java 11. Mer information finns i Java-versioner.
    • Miljövariabeln JAVA_HOME måste anges till installationsplatsen för rätt version av JDK för att slutföra den här artikeln.
  2. Maven ber dig om de värden som behövs för att slutföra genereringen av projektet vid distributionen.
    Ange följande värden när du uppmanas att göra det:

    Prompt Värde beskrivning
    Groupid com.fabrikam Ett värde som unikt identifierar projektet i alla projekt, enligt namngivningsreglerna för paket för Java.
    artifactId fabrikam-functions Ett värde som är namnet på jar-filen, utan ett versionsnummer.
    Version 1.0-SNAPSHOT Välj standardvärdet.
    Paket com.fabrikam Ett värde som är Java-paketet för den genererade funktionskoden. Använd standardvärdet.
  3. Skriv Y eller tryck på Retur för att bekräfta.

    Maven skapar projektfilerna i en ny mapp med namnet artifactId, som i det här exemplet är fabrikam-functions.

  4. Navigera till projektmappen:

    cd fabrikam-functions
    

    Den här mappen innehåller olika filer för projektet, inklusive konfigurationsfiler med namnet local.settings.json och host.json. Eftersom local.settings.json kan innehålla hemligheter som hämtats från Azure undantas filen som standard från källkontrollen i .gitignore-filen .

(Valfritt) Granska filinnehållet

Om du vill kan du hoppa över till Kör funktionen lokalt och granska filinnehållet senare.

Function.java

Function.java innehåller en run metod som tar emot begärandedata i variabeln request är en HttpRequestMessage som är dekorerad med HttpTrigger-kommentaren, som definierar utlösarbeteendet.

package com.fabrikam;

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();
        }
    }
}

Svarsmeddelandet genereras av API:et HttpResponseMessage.Builder .

pom.xml

Inställningar för De Azure-resurser som skapats som värd för din app definieras i konfigurationselementet i plugin-programmet med ett groupId för com.microsoft.azure i den genererade pom.xml-filen. Konfigurationselementet nedan instruerar till exempel en Maven-baserad distribution att skapa en funktionsapp i java-functions-group resursgruppen i westus regionen. Själva funktionsappen java-functions-app-service-plan körs på Windows som finns i planen, vilket som standard är en serverlös förbrukningsplan.

<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>java-functions-group</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>westus</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>
        </runtime>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    <executions>
        <execution>
            <id>package-functions</id>
            <goals>
                <goal>package</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Du kan ändra de här inställningarna för att styra hur resurser skapas i Azure, till exempel genom att ändra runtime.os från windows till linux före den första distributionen. En fullständig lista över inställningar som stöds av Maven-plugin-programmet finns i konfigurationsinformationen.

FunctionTest.java

Arketypen genererar också ett enhetstest för din funktion. När du ändrar funktionen för att lägga till bindningar eller lägga till nya funktioner i projektet måste du också ändra testerna i FunctionTest.java-filen.

Kör funktionen lokalt

  1. Kör funktionen genom att starta den lokala Azure Functions-körningsvärden från mappen LocalFunctionProj :

    mvn clean package
    mvn azure-functions:run
    

    Mot slutet av utdata bör följande rader visas:

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

    Kommentar

    Om HttpExample inte visas som ovan startade du förmodligen värden utanför rotmappen i projektet. I så fall kan du använda Ctrl+C för att stoppa värden, navigera till projektets rotmapp och köra föregående kommando igen.

  2. Kopiera URL:en för funktionen HttpExample från det här utdata till en webbläsare och lägg till frågesträngen ?name=<YOUR_NAME>, vilket gör den fullständiga URL:en till exempel http://localhost:7071/api/HttpExample?name=Functions. Webbläsaren bör visa ett meddelande som ekar tillbaka frågesträngsvärdet. Terminalen där du startade projektet visar även loggutdata när du gör begäranden.

  3. När du är klar använder du Ctrl+C och väljer y att stoppa funktionsvärden.

Distribuera funktionsprojektet till Azure

En funktionsapp och relaterade resurser skapas i Azure när du först distribuerar ditt funktionsprojekt. Inställningar för de Azure-resurser som skapats som värd för din app definieras i pom.xml-filen. I den här artikeln accepterar du standardinställningarna.

Dricks

Om du vill skapa en funktionsapp som körs på Linux i stället för Windows ändrar du elementet runtime.os i pom.xml-filen från windows till linux. Det finns stöd för att köra Linux i en förbrukningsplan i dessa regioner. Du kan inte ha appar som körs på Linux och appar som körs i Windows i samma resursgrupp.

  1. Innan du kan distribuera loggar du in på din Azure-prenumeration med antingen Azure CLI eller Azure PowerShell.

    az login
    

    Kommandot az login loggar in dig på ditt Azure-konto.

  2. Använd följande kommando för att distribuera projektet till en ny funktionsapp.

    mvn azure-functions:deploy
    

    Detta skapar följande resurser i Azure:

    • Resursgrupp. Namngiven som java-functions-group.
    • Lagringskonto. Krävs av Functions. Namnet genereras slumpmässigt baserat på krav för lagringskontonamn.
    • Värdplan. Serverlös värd för funktionsappen i regionen westus . Namnet är java-functions-app-service-plan.
    • Funktionsapp. En funktionsapp är distributions- och körningsenheten för dina funktioner. Namnet genereras slumpmässigt baserat på ditt artifactId, som läggs till med ett slumpmässigt genererat tal.

    Distributionen paketar projektfilerna och distribuerar dem till den nya funktionsappen med zip-distribution. Koden körs från distributionspaketet i Azure.

Viktigt!

Lagringskontot används för att lagra viktiga appdata, ibland inklusive själva programkoden. Du bör begränsa åtkomsten från andra appar och användare till lagringskontot.

Anropa funktionen i Azure

Eftersom funktionen använder en HTTP-utlösare anropar du den genom att göra en HTTP-begäran till dess URL i webbläsaren eller med ett verktyg som curl.

Kopiera den fullständiga Anropa URL:en som visas i utdata från publiceringskommandot till ett webbläsaradressfält och lägga till frågeparametern ?name=Functions. Webbläsaren bör visa liknande utdata som när du körde funktionen lokalt.

The output of the function run on Azure in a browser

Kör följande kommando för att visa direktuppspelningsloggar i nära realtid:

func azure functionapp logstream <APP_NAME> 

I ett separat terminalfönster eller i webbläsaren anropar du fjärrfunktionen igen. En utförlig logg över funktionskörningen i Azure visas i terminalen.

Rensa resurser

Om du fortsätter till nästa steg och lägger till en Azure Storage-köutdatabindning behåller du alla resurser på plats när du bygger vidare på det du redan har gjort.

Annars använder du följande kommando för att ta bort resursgruppen och alla dess inneslutna resurser för att undvika ytterligare kostnader.

az group delete --name java-functions-group

Nästa steg