Inicio rápido: Creación de una función de Java en Azure desde la línea de comandos

En este artículo se usan herramientas de línea de comandos para crear una función de Java que responda a solicitudes HTTP. Después de probar el código localmente, se implementa en el entorno sin servidor de Azure Functions.

Si Maven no es su herramienta de desarrollo preferida, consulte nuestros tutoriales análogos para desarrolladores de Java:

Este inicio rápido supone un pequeño costo en su cuenta de Azure.

Configuración del entorno local

Antes de empezar, debe disponer de lo siguiente:

Instalación de Azure Functions Core Tools

La manera recomendada de instalar Core Tools depende del sistema operativo del equipo de desarrollo local.

En los pasos siguientes se utiliza Windows Installer (MSI) para instalar Core Tools v4.x. Para más información sobre otros instaladores basados en paquetes, consulte el archivo Léame de Core Tools.

Descargue y ejecute el instalador de Core Tools según su versión de Windows:

Si ha usado previamente Windows Installer (MSI) para instalar Core Tools en Windows, debe desinstalar la versión anterior desde Agregar/Quitar programas antes de instalar la versión más reciente.

Creación de un proyecto de función local

En Azure Functions, un proyecto de función es un contenedor para una o varias funciones individuales que responden a un desencadenador específico. Todas las funciones de un proyecto comparten las mismas configuraciones locales y de hospedaje. En esta sección, se crea un proyecto de función que contiene una sola función.

  1. En una carpeta vacía, ejecute el comando siguiente para generar el proyecto de Functions desde un arquetipo Maven.

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

    Importante

    • Use -DjavaVersion=11 si quiere que las funciones se ejecuten en Java 11. Para obtener más información, consulte las versiones de Java.
    • Para llevar a cabo los pasos de este artículo, la variable de entorno JAVA_HOME se debe establecer en la ubicación de instalación de la versión correcta del JDK.
  2. Maven le pide los valores necesarios para finalizar la generación del proyecto en la implementación.
    Indique los siguientes valores cuando se le solicite:

    Prompt Valor Descripción
    groupId com.fabrikam Un valor que identifica de forma única su proyecto entre todos los demás y que sigue las reglas de nomenclatura de paquetes de Java.
    artifactId fabrikam-functions Un valor que es el nombre del archivo jar, sin un número de versión.
    version 1.0-SNAPSHOT Elija el valor predeterminado.
    package com.fabrikam Un valor que es el paquete de Java para el código de función generado. Use el valor predeterminado.
  3. Escriba Y o presione Entrar para confirmar.

    Maven crea los archivos del proyecto en una carpeta nueva llamada artifactId que, en este ejemplo, es fabrikam-functions.

  4. Vaya a la carpeta del proyecto:

    cd fabrikam-functions
    

    Esta carpeta contiene varios archivos del proyecto, incluidos los archivos de configuración local.settings.json y host.json. Como local.settings.json puede contener secretos descargados de Azure, el archivo se excluye del control de código fuente de forma predeterminada en el archivo .gitignore.

(Opcional) Examen del contenido del archivo

Si lo desea, puede ir a Ejecución local de la función y examine el contenido del archivo posteriormente.

Function.java

Function.java contiene un método run que recibe datos de solicitud en la variable request de tipo HttpRequestMessage que está decorada con la anotación HttpTrigger, que define el comportamiento del desencadenador.

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

El mensaje de respuesta lo genera la API HttpResponseMessage.Builder.

pom.xml

La configuración de los recursos de Azure creados para hospedar la aplicación se define en el elemento configuration del complemento con un valor de groupId de com.microsoft.azure en el archivo pom.xml generado. Por ejemplo, el elemento de configuración siguiente indica a una implementación basada en Maven que cree una aplicación de función en el grupo de recursos java-functions-group de la región westus. La propia aplicación de función se ejecuta en Windows hospedada en el plan java-functions-app-service-plan, que, de forma predeterminada, es un plan de consumo sin servidor.

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

Puede cambiar esta configuración para controlar cómo se crean los recursos en Azure, por ejemplo, cambiando runtime.os de windows a linux antes de la implementación inicial. Para obtener una lista completa de los valores de configuración admitidos por el complemento Maven, consulte los detalles de configuración.

FunctionTest.java

El arquetipo también genera una prueba unitaria para la función. Al cambiar la función para agregar enlaces o agregar nuevas funciones al proyecto, también deberá modificar las pruebas en el archivo FunctionTest.java.

Ejecución local de la función

  1. Para ejecutar una función, inicie el host en tiempo de ejecución local de Azure Functions desde la carpeta LocalFunctionProj:

    mvn clean package
    mvn azure-functions:run
    

    Hacia el final de la salida, deberían aparecer las líneas siguientes:

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

    Nota

    Si HttpExample no aparece como se ha mostrado arriba, es probable que haya iniciado el host desde fuera de la carpeta raíz del proyecto. En ese caso, use Ctrl+C para detener el host, vaya a la carpeta raíz del proyecto y vuelva a ejecutar el comando anterior.

  2. Copie la dirección URL de la función HttpExample de esta salida en un explorador y anexe la cadena de consulta ?name=<YOUR_NAME>, lo que hará que la dirección URL completa sea http://localhost:7071/api/HttpExample?name=Functions. El explorador debe mostrar un mensaje que devuelva el valor de la cadena de consulta. El terminal en el que inició el proyecto también muestra la salida del registro cuando realiza solicitudes.

  3. Cuando termine, presione Ctrl+C y seleccione y para detener el host de Functions.

Implementación del proyecto de función en Azure

La primera vez que implementa un proyecto de funciones, se crea una aplicación de funciones y los recursos relacionados en Azure. La configuración de los recursos de Azure que se crean para hospedar la aplicación se define en el archivo pom.xml. En este artículo, aceptará los valores predeterminados.

Sugerencia

Para crear una aplicación de función que se ejecute en Linux en lugar de Windows, cambie el elemento runtime.os del archivo pom.xml de windows a linux. La ejecución de Linux en un plan de consumo se admite en estas regiones. No puede tener aplicaciones que se ejecuten en Linux y aplicaciones que se ejecuten en Windows en el mismo grupo de recursos.

  1. Antes de poder implementar, inicie sesión en su suscripción a Azure mediante la CLI de Azure o Azure PowerShell.

    az login
    

    El comando az login inicia sesión en su cuenta de Azure.

  2. Use el siguiente comando para implementar el proyecto en una nueva aplicación de funciones.

    mvn azure-functions:deploy
    

    Esta operación crea los siguientes recursos en Azure:

    • Un grupo de recursos Se nombra como java-functions-group.
    • Una cuenta de almacenamiento Necesaria con Functions. El nombre se genera aleatoriamente según los requisitos de nombre de la cuenta de almacenamiento.
    • Plan de hospedaje. El hospedaje sin servidor de la aplicación de función en la región westus. El nombre es java-functions-app-service-plan.
    • Aplicación de funciones. Una aplicación de funciones es la unidad de implementación y ejecución de las funciones. El nombre se genera de forma aleatoria según el valor artifactId, anexado con un número generado de forma aleatoria.

    La implementación empaqueta los archivos de proyecto y los implementa en la nueva aplicación de función mediante la implementación de archivos ZIP. El código se ejecuta desde el paquete de implementación en Azure.

Importante

La cuenta de almacenamiento se usa para almacenar datos importantes de la aplicación, a veces incluido el propio código de la aplicación. Debe limitar el acceso desde otras aplicaciones y usuarios a la cuenta de almacenamiento.

Invocación de la función en Azure

Como la función usa un desencadenador HTTP, para invocarla es preciso realizar una solicitud HTTP a su dirección URL en el explorador o con una herramienta como CURL.

Copie la dirección URL de invocación completa que se muestra en la salida del comando de publicación en una barra de direcciones del explorador, y anexe el parámetro de consulta ?name=Functions. El explorador debe mostrar una salida similar a cuando ejecutó la función localmente.

The output of the function run on Azure in a browser

Ejecute el siguiente comando para ver registros de streaming casi en tiempo real:

func azure functionapp logstream <APP_NAME> 

En una ventana de terminal independiente o en el explorador, vuelva a llamar a la función remota. En la ventana de terminal, se mostrará un registro detallado de la ejecución de la función en Azure.

Limpieza de recursos

Si continúa con el paso siguiente y agrega un enlace de salida de la cola de Azure Storage, conserve todos los recursos intactos, ya que va a crear a partir de lo que ya ha hecho.

De lo contrario, use el siguiente comando para eliminar el grupo de recursos y todos los recursos que contiene para evitar incurrir en costos adicionales.

az group delete --name java-functions-group

Pasos siguientes