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

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

Den här snabbstarten medför en liten kostnad på några cent eller mindre för ditt Azure-konto.

Konfigurera din lokala miljö

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

Kravkontroll

  • I en terminal eller ett kommandofönster kör func --version du för att kontrollera Azure Functions Core Tools version 4.x.

  • Kör az --version för att kontrollera att Azure CLI-versionen är 2.4 eller senare.

  • Kör az login för att logga in på Azure och verifiera en aktiv prenumeration.

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.
    • JAVA_HOMEMiljövariabeln 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 tillfrågas:

    Prompt Värde Beskrivning
    groupId com.fabrikam Ett värde som unikt identifierar projektet i alla projekt och som följer namngivningsreglerna för Java.
    artifactId fabrikam-functions Ett värde som är namnet på jar-numret, utan 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 laddats ned från Azure undantas filen från källkontrollen som standard i filen .gitignore.

(Valfritt) Granska filinnehållet

Om du vill kan du gå vidare till Kör funktionen lokalt och undersöka filinnehållet senare.

Function.java

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

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

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 i den com.microsoft.azure 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 körs på Windows finns i java-functions-app-service-plan 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>${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>

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 till innan den första windows linux 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ägger till nya funktioner i projektet måste du också ändra testerna i filen FunctionTest.java.

Köra funktionen lokalt

  1. Kör funktionen genom att starta den lokala Azure Functions runtime-vä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
     ...
    
     

    Anteckning

    Om HttpExample inte visas som det visas ovan har du förmodligen startat värden utanför projektets rotmapp. I så fall använder du Ctrl C för att stoppa värden, navigerar till projektets + rotmapp och kör föregående kommando igen.

  2. Kopiera URL:en för funktionen från dessa utdata till en webbläsare och HttpExample lägg till frågesträngen ?name=<YOUR_NAME> , vilket gör den fullständiga URL:en som http://localhost:7071/api/HttpExample?name=Functions . Webbläsaren bör visa ett meddelande som returnerar frågesträngens värde. 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 functions-värden.

Distribuera funktionsprojektet till Azure

En funktionsapp och relaterade resurser skapas i Azure när du först distribuerar funktionsprojektet. Inställningar azure-resurser som skapats som värdar för din app definieras i pom.xml filen. I den här artikeln accepterar du standardvärdena.

Tips

Om du vill skapa en funktionsapp som körs på Linux Windows ändra runtime.os elementet i pom.xml från till windows linux . Att köra Linux i en förbrukningsplan stöds i dessa regioner. Du kan inte ha appar som körs på Linux och appar som körs 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. Namnges som java-functions-group.
    • Storage konto. Krävs av Functions. Namnet genereras slumpmässigt baserat på Storage krav på kontonamn.
    • Värdplan. Serverlös värdtjänst för funktionsappen i regionen USA, västra. Namnet är java-functions-app-service-plan.
    • Funktionsapp. En funktionsapp är distributionen och körningsenheten för dina funktioner. Namnet genereras slumpmässigt baserat på ditt artifactId, och läggs till med ett slumpmässigt genererat tal.

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

Anropa funktionen på Azure

Eftersom din funktion 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 vändning.

Kopiera den fullständiga anrops-URL: en som visas i utdata från kommandot Publicera till ett webbläsarens Adress fält, som lägger till Frågeparametern &name=Functions . Webbläsaren bör visa liknande utdata som när du körde funktionen lokalt.

Resultatet av funktionen körs på Azure i en webbläsare

Kör följande kommando för att Visa nästan real tids strömnings loggar:

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 funktions kö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 dina resurser på plats eftersom 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