Distribuire app Java serverless con Quarkus in Funzioni di Azure

Questo articolo illustra come sviluppare, compilare e distribuire un'app Java serverless in Funzioni di Azure usando Quarkus. Questo articolo usa Quarkus Funqy e il supporto predefinito per il trigger HTTP Funzioni di Azure per Java. L'uso di Quarkus con Funzioni di Azure offre la potenza del modello di programmazione Quarkus con la scalabilità e la flessibilità di Funzioni di Azure. Al termine, si eseguiranno applicazioni Quarkus serverless in Funzioni di Azure e si continuerà a monitorare l'app in Azure.

Prerequisiti

Creare il progetto dell'app

Usare il comando seguente per clonare il progetto Java di esempio per questo articolo. L'esempio è disponibile in GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2023-01-10
cd functions-quarkus

Se viene visualizzato un messaggio relativo allo stato HEAD scollegato, questo messaggio è sicuro da ignorare. Poiché questo articolo non richiede alcun commit, lo stato HEAD scollegato è appropriato.

Esplorare la funzione di esempio. Aprire il file functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java .

Esegui il comando seguente: L'annotazione @Funq rende il metodo (in questo caso , funqyHello) una funzione serverless.

@Funq
public String funqyHello() {
    return "hello funqy";
}

Funzioni di Azure Java ha un proprio set di annotazioni specifiche di Azure, ma queste annotazioni non sono necessarie quando si usa Quarkus in Funzioni di Azure in una capacità semplice, come avviene qui. Per altre informazioni sulle annotazioni Java Funzioni di Azure, vedere la guida per sviluppatori Java Funzioni di Azure.

A meno che non si specifichi diversamente, il nome della funzione corrisponde al nome del metodo. È anche possibile usare il comando seguente per definire il nome della funzione con un parametro per l'annotazione:

@Funq("alternateName")
public String funqyHello() {
    return "hello funqy";
}

Il nome è importante. Diventa una parte dell'URI REST per richiamare la funzione, come illustrato più avanti nell'articolo.

Testare la funzione in locale

Usare mvn per eseguire la modalità di sviluppo Quarkus nel terminale locale. L'esecuzione di Quarkus in questo modo consente il ricaricamento in tempo reale con la compilazione in background. Quando si modificano i file Java e/o i file di risorse e si aggiorna il browser, queste modifiche avranno effetto automaticamente.

Un aggiornamento del browser attiva un'analisi dell'area di lavoro. Se l'analisi rileva modifiche, i file Java vengono ricompilati e l'applicazione viene ridistribuita. L'applicazione ridistribuisce la richiesta. In caso di problemi di compilazione o distribuzione, verrà visualizzata una pagina di errore.

Nella procedura seguente sostituire yourResourceGroupName con un nome di gruppo di risorse. I nomi delle app per le funzioni devono essere univoci a livello globale in tutto Azure. I nomi dei gruppi di risorse devono essere univoci a livello globale all'interno di una sottoscrizione. Questo articolo consente di ottenere l'univocità necessaria anteponendo il nome del gruppo di risorse al nome della funzione. Prendere in considerazione la pre-attesa di un identificatore univoco per tutti i nomi creati che devono essere univoci. Una tecnica utile consiste nell'usare le iniziali seguite dalla data odierna in mmdd formato.

Il gruppo di risorse non è necessario per questa parte delle istruzioni, ma è necessario in un secondo momento. Per semplicità, il progetto Maven richiede di definire la proprietà .

  1. Richiamare la modalità di sviluppo Quarkus:

    cd functions-azure
    mvn -DskipTests -DresourceGroup=<yourResourceGroupName> quarkus:dev
    

    L'output dovrebbe essere simile al seguente:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    INFO  [io.quarkus] (Quarkus Main Thread) quarkus-azure-function 1.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 1.290s. Listening on: http://localhost:8080
    
    INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
    INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, funqy-http, smallrye-context-propagation, vertx]
    
    --
    Tests paused
    Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
    
  2. Accedere alla funzione usando il comando nel CURL terminale locale:

    curl localhost:8080/api/funqyHello
    

    L'output dovrebbe essere simile al seguente:

    "hello funqy"
    

Aggiungere l'inserimento delle dipendenze alla funzione

La tecnologia open-standard Jakarta edizione Enterprise Contexts and Dependency Injection (CDI) fornisce l'inserimento delle dipendenze in Quarkus. Per una panoramica generale dell'inserimento in generale e di CDI in modo specifico, vedere l'esercitazione sull'edizione Enterprise di Jakarta.

  1. Aggiungere una nuova funzione che usa l'inserimento delle dipendenze.

    Creare un file GreetingService.java nella directory functions-quarkus/src/main/java/io/quarkus . Usare il codice seguente come codice sorgente del file:

    package io.quarkus;
    
    import javax.enterprise.context.ApplicationScoped;
    
    @ApplicationScoped
    public class GreetingService {
    
        public String greeting(String name) {
            return "Welcome to build Serverless Java with Quarkus on Azure Functions, " + name;
        }
    
    }
    

    Salva il file.

    GreetingService è un bean iniettabile che implementa un greeting() metodo. Il metodo restituisce un Welcome... messaggio stringa con un name parametro .

  2. Aprire il file functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java . Sostituire la classe con il codice seguente per aggiungere un nuovo gService campo e il greeting metodo :

    package io.quarkus;
    
    import javax.inject.Inject;
    import io.quarkus.funqy.Funq;
    
    public class GreetingFunction {
    
        @Inject
        GreetingService gService;
    
        @Funq
        public String greeting(String name) {
            return gService.greeting(name);
        }
    
        @Funq
        public String funqyHello() {
            return "hello funqy";
        }
    
    }
    

    Salva il file.

  3. Accedere alla nuova greeting funzione usando il comando nel curl terminale locale:

    curl -d '"Dan"' -X POST localhost:8080/api/greeting
    

    L'output dovrebbe essere simile al seguente:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan"
    

    Importante

    Live Coding (chiamato anche modalità di sviluppo) consente di eseguire l'app e apportare modifiche in tempo reale. Quarkus ricompila automaticamente e ricarica l'app quando vengono apportate modifiche. Questo è uno stile potente ed efficiente di sviluppo che verrà usato in questo articolo.

    Prima di passare al passaggio successivo, arrestare la modalità di sviluppo Quarkus selezionando CTRL+C.

Distribuire l'app in Azure

  1. Se non è già stato fatto, accedere alla sottoscrizione di Azure usando il comando az login seguente e seguire le istruzioni visualizzate:

    az login
    

    Nota

    Se più tenant di Azure sono associati alle credenziali di Azure, è necessario specificare il tenant a cui si vuole accedere. A tale scopo, usare l'opzione --tenant . Ad esempio: az login --tenant contoso.onmicrosoft.com.

    Continuare il processo nel Web browser. Se non è disponibile alcun Web browser o se il Web browser non viene aperto, usare il flusso del codice del dispositivo con az login --use-device-code.

    Dopo l'accesso, l'output nel terminale locale dovrebbe essere simile al seguente:

    xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxx 'Microsoft'
    [
        {
            "cloudName": "AzureCloud",
            "homeTenantId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
            "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "isDefault": true,
            "managedByTenants": [],
            "name": "Contoso account services",
            "state": "Enabled",
            "tenantId": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx",
            "user": {
            "name": "user@contoso.com",
            "type": "user"
            }
        }
    ]
    
  2. Compilare e distribuire le funzioni in Azure.

    Il file pom.xml generato nel passaggio precedente usa azure-functions-maven-plugin. L'esecuzione mvn install genera file di configurazione e una directory di staging che azure-functions-maven-plugin richiede. Per yourResourceGroupNameusare il valore usato in precedenza.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. Durante la distribuzione, accedere ad Azure. Il azure-functions-maven-plugin plug-in è configurato per richiedere l'accesso ad Azure ogni volta che viene distribuito il progetto. Durante la compilazione viene visualizzato un output simile al seguente:

    [INFO] Auth type: DEVICE_CODE
    To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AXCWTLGMP to authenticate.
    

    Eseguire come dice l'output ed eseguire l'autenticazione in Azure usando il browser e il codice del dispositivo fornito. Sono disponibili molte altre opzioni di autenticazione e configurazione. La documentazione di riferimento completa per azure-functions-maven-plugin è disponibile in Funzioni di Azure: Dettagli configurazione.

  4. Dopo l'autenticazione, la compilazione deve continuare e terminare. Assicurarsi che l'output includa BUILD SUCCESS vicino alla fine.

    Successfully deployed the artifact to https://quarkus-demo-123451234.azurewebsites.net
    

    È anche possibile trovare l'URL per attivare la funzione in Azure nel log di output:

    [INFO] HTTP Trigger Urls:
    [INFO] 	 quarkus : https://quarkus-azure-functions-http-archetype-20220629204040017.azurewebsites.net/api/{*path}
    

    Il completamento della distribuzione richiederà del tempo. Nel frattempo, esaminiamo Funzioni di Azure nel portale di Azure.

Accedere e monitorare la funzione serverless in Azure

Accedere al portale e assicurarsi di aver selezionato lo stesso tenant e la stessa sottoscrizione usata nell'interfaccia della riga di comando di Azure.

  1. Digitare l'app per le funzioni nella barra di ricerca nella parte superiore del portale di Azure e selezionare il tasto INVIO. L'app per le funzioni deve essere distribuita e visualizzata con il nome <yourResourceGroupName>-function-quarkus.

    Screenshot that shows the function app in the portal.

  2. Selezionare l'app per le funzioni per visualizzare informazioni dettagliate, ad esempio Località, Sottoscrizione, URL, Metriche e servizio app Piano. Selezionare quindi il valore URL.

    Screenshot that shows a URL and other function app details.

  3. Verificare che la pagina iniziale indichi che l'app per le funzioni è "operativa".

    Screenshot that shows the welcome page for a function app.

  4. Richiamare la greeting funzione usando il comando seguente curl nel terminale locale.

    Importante

    Sostituire YOUR_HTTP_TRIGGER_URL con il proprio URL di funzione presente nel portale di Azure o nell'output.

    curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting
    

    L'output dovrebbe essere simile al seguente:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan on Azure"
    

    È anche possibile accedere all'altra funzione (funqyHello) usando il comando seguente curl :

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    L'output deve essere identico a quello osservato in precedenza:

    "hello funqy"
    

    Se si vuole esercitare la funzionalità delle metriche di base nel portale di Azure, provare a richiamare la funzione all'interno di un ciclo della shellfor:

    for i in {1..100}; do curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting; done
    

    Dopo un po' di tempo, nel portale verranno visualizzati alcuni dati delle metriche.

    Screenshot that shows function metrics in the portal.

Dopo aver aperto la funzione di Azure nel portale, ecco altre funzionalità a cui è possibile accedere dal portale:

Pulire le risorse

Se queste risorse non sono necessarie, è possibile eliminarle eseguendo il comando seguente in Azure Cloud Shell o nel terminale locale:

az group delete --name <yourResourceGroupName> --yes

Passaggi successivi

In questo articolo si è appreso come:

  • Eseguire la modalità di sviluppo Quarkus.
  • Distribuire un'app Funqy in Funzioni di Azure usando azure-functions-maven-plugin.
  • Esaminare le prestazioni della funzione nel portale.

Per altre informazioni su Funzioni di Azure e Quarkus, vedere gli articoli e i riferimenti seguenti: