Bereitstellen serverloser Java-Apps mit Quarkus auf Azure Functions

In diesem Artikel entwickeln, erstellen und stellen Sie eine serverlose Java-App für Azure Functions bereit und verwenden dafür Quarkus. In diesem Artikel wird Quarkus Funqy und die integrierte Unterstützung für den Azure Functions-HTTP-Trigger für Java verwendet. Wenn Sie Quarkus mit Azure Functions verwenden, erhalten Sie die Leistungsfähigkeit des Quarkus-Programmiermodells mit der Skalierbarkeit und Flexibilität von Azure Functions. Wenn Sie fertig sind, führen Sie serverlose Quarkus-Anwendungen auf Azure Functions aus und überwachen Ihre App weiterhin in Azure.

Voraussetzungen

Erstellen des App-Projekts

Verwenden Sie den folgenden Befehl, um das Java-Beispielprojekt für diesen Artikel zu klonen. Das Beispiel befindet sich auf GitHub.

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

Wenn eine Meldung darüber angezeigt wird, dass Sie sich in einem Zustand HEAD getrennt befinden, kann diese Nachricht problemlos ignoriert werden. Da für diesen Artikel keine Commits erforderlich sind, ist der Zustand „HEAD getrennt“ angemessen.

Sehen Sie sich die Beispielfunktion an. Öffnen Sie die Datei functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java.

Führen Sie den folgenden Befehl aus. Die @Funq-Anmerkung macht Ihre Methode (in diesem Fall funqyHello) zu einer serverlosen Funktion.

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

Java für Azure Functions verfügt über eigene Azure-spezifische Anmerkungen. Diese Anmerkungen sind jedoch nicht erforderlich, wenn Sie Quarkus in einfacher Funktion auf Azure Functions verwenden, wie wir dies hier tun. Weitere Informationen zu Java-Anmerkungen für Azure Functions finden Sie im Java-Entwicklerhandbuch für Azure Functions.

Sofern Sie nichts anderes angeben, ist der Name der Funktion mit dem Namen der Methode identisch. Sie können auch den folgenden Befehl verwenden, um den Funktionsnamen mit einem Parameter für die Anmerkung zu definieren:

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

Der Name ist wichtig. Er wird Teil des REST-URI zum Aufrufen der Funktion, wie weiter unten im Artikel gezeigt.

Lokales Testen der Funktion

Verwenden Sie mvn, um den Quarkus-Entwicklungsmodus auf Ihrem lokalen Terminal auszuführen. Wenn Sie Quarkus auf diese Weise ausführen, wird das erneute Live-Laden mit Hintergrundkompilierung ermöglicht. Wenn Sie Ihre Java-Dateien und/oder Ihre Ressourcendateien ändern und Ihren Browser aktualisieren, werden diese Änderungen automatisch wirksam.

Eine Browseraktualisierung löst eine Überprüfung des Arbeitsbereichs aus. Wenn bei der Überprüfung Änderungen erkannt werden, werden die Java-Dateien neu kompiliert, und die Anwendung wird erneut bereitgestellt. Ihre erneut bereitgestellte Anwendung bearbeitet die Anforderung. Wenn Probleme bei der Kompilierung oder Bereitstellung auftreten, werden Sie über eine Fehlerseite darüber informiert.

Ersetzen Sie yourResourceGroupName im folgenden Verfahren durch einen Ressourcengruppennamen. Funktions-App-Namen müssen in Azure global eindeutig sein. Ressourcengruppennamen müssen innerhalb eines Abonnements global eindeutig sein. In diesem Artikel wird die erforderliche Eindeutigkeit erreicht, indem der Ressourcengruppenname dem Funktionsnamen vorangestellt wird. Stellen Sie gegebenenfalls einen eindeutigen Bezeichner für alle von Ihnen erstellten Namen voran, die eindeutig sein müssen. Es hat sich bewährt, Ihre Initialen gefolgt vom heutigen Datum im Format mmdd zu verwenden.

Die Ressourcengruppe ist für diesen Teil der Anweisungen nicht erforderlich, wird jedoch später benötigt. Der Einfachheit halber müssen Sie beim Maven-Projekt die Eigenschaft definieren.

  1. Rufen Sie den Quarkus-Entwicklungsmodus auf:

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

    Die Ausgabe sollte wie folgt aussehen:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    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. Greifen Sie mit dem Befehl CURL auf Ihrem lokalen Terminal auf die Funktion zu:

    curl localhost:8080/api/funqyHello
    

    Die Ausgabe sollte wie folgt aussehen:

    "hello funqy"
    

Hinzufügen von Abhängigkeitsinjektionen zur Funktion

Die auf offenen Standards basierende Technologie „Jakarta EE Contexts and Dependency Injection“ (CDI) bietet Abhängigkeitsinjektionen in Quarkus. Eine allgemeine Übersicht über die Injektion im Allgemeinen und CDI speziell finden Sie im Jakarta EE-Tutorial.

  1. Fügen Sie eine neue Funktion hinzu, die Abhängigkeitsinjektionen verwendet.

    Erstellen Sie die Datei GreetingService.java im Verzeichnis functions-quarkus/src/main/java/io/quarkus. Verwenden Sie den folgenden Code als Quellcode der Datei:

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

    Speichern Sie die Datei .

    GreetingService ist ein injizierbares Bean, das eine greeting()-Methode implementiert. Die Methode gibt die Zeichenfolgennachricht Welcome... mit dem Parameter name zurück.

  2. Öffnen Sie die vorhandene Datei functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java. Ersetzen Sie die Klasse durch den folgenden Code, um ein neues gService-Feld und die Methode greeting hinzuzufügen:

    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";
        }
    
    }
    

    Speichern Sie die Datei .

  3. Greifen Sie mit dem Befehl curl auf Ihrem lokalen Terminal auf die Funktion greeting zu:

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

    Die Ausgabe sollte wie folgt aussehen:

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

    Wichtig

    Mit Live-Coding (auch als Entwicklungsmodus bezeichnet) können Sie die App ausführen und Änderungen in Echtzeit vornehmen. Quarkus kompiliert die App automatisch erneut und lädt sie neu, wenn Änderungen vorgenommen werden. Dies ist ein leistungsstarker und effizienter Entwicklungsstil, den Sie in diesem Artikel einsetzen werden.

    Bevor Sie mit dem nächsten Schritt fortfahren, beenden Sie den Quarkus-Entwicklungsmodus, indem Sie STRG+C drücken.

Bereitstellen der Anwendung in Azure

  1. Falls noch nicht geschehen, melden Sie sich mit dem folgenden az login-Befehl bei Ihrem Azure-Abonnement an, und befolgen Sie die Anweisungen auf dem Bildschirm.

    az login
    

    Hinweis

    Wenn Ihren Azure-Anmeldeinformationen mehrere Azure-Mandanten zugeordnet sind, müssen Sie angeben, bei welchem Mandanten Sie sich anmelden möchten. Hierzu kann die Option --tenant verwendet werden. Beispiel: az login --tenant contoso.onmicrosoft.com.

    Fahren Sie im Webbrowser mit dem Vorgang fort. Falls kein Webbrowser verfügbar ist oder nicht geöffnet werden kann, verwenden Sie den Gerätecodefluss mit az login --use-device-code.

    Nachdem Sie sich erfolgreich angemeldet haben, sollte die Ausgabe ihres lokalen Terminals wie folgt aussehen:

    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. Erstellen sie die Funktionen, und stellen Sie sie in Azure bereit.

    Die Datei pom.xml, die Sie im vorherigen Schritt generiert haben, verwendet azure-functions-maven-plugin. Durch die Ausführung von mvn install werden Konfigurationsdateien und ein Stagingverzeichnis generiert, das für azure-functions-maven-plugin erforderlich ist. Verwenden Sie für yourResourceGroupName den Wert, den Sie zuvor verwendet haben.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. Melden Sie sich während der Bereitstellung bei Azure an. Das azure-functions-maven-plugin-Plug-In ist so konfiguriert, dass es jedes Mal zur Azure-Anmeldung auffordert, wenn das Projekt bereitgestellt wird. Während des Buildvorgangs wird eine Ausgabe ähnlich der folgenden angezeigt:

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

    Gehen Sie entsprechend den Anweisungen in der Ausgabe vor, und authentifizieren Sie sich bei Azure mithilfe des Browsers und des bereitgestellten Gerätecodes. Viele weitere Authentifizierungs- und Konfigurationsoptionen sind verfügbar. Die vollständige Referenzdokumentation für azure-functions-maven-plugin finden Sie unter Azure Functions: Konfigurationsdetails.

  4. Nach der Authentifizierung sollte der Buildvorgang fortgesetzt und abgeschlossen werden. Stellen Sie sicher, dass die Ausgabe BUILD SUCCESS nahe dem Ende enthält.

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

    Im Ausgabeprotokoll finden Sie auch die URL zum Auslösen Ihrer Funktion in Azure:

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

    Es dauert eine Weile, bis die Bereitstellung abgeschlossen ist. In der Zwischenzeit erkunden wir Azure Functions im Azure-Portal.

Zugreifen auf und Überwachen der serverlosen Funktion in Azure

Melden Sie sich beim Portal an, und stellen Sie sicher, dass Sie denselben Mandanten und dasselbe Abonnement ausgewählt haben, das Sie in der Azure CLI verwendet haben.

  1. Geben Sie Funktions-App oben in der Suchleiste im Azure-Portal ein, und drücken Sie die EINGABETASTE. Ihre Funktions-App sollte bereitgestellt werden und mit dem Namen <yourResourceGroupName>-function-quarkus angezeigt werden.

    Screenshot that shows the function app in the portal.

  2. Wählen Sie die Funktions-App aus, um detaillierte Informationen anzuzeigen, z. B. Standort, Abonnement, URL, Metriken und App Service-Plan. Wählen Sie dann den URL-Wert aus.

    Screenshot that shows a URL and other function app details.

  3. Vergewissern Sie sich, dass auf der Willkommensseite angegeben ist, dass Ihre Funktions-App ausgeführt wird.

    Screenshot that shows the welcome page for a function app.

  4. Rufen Sie die greeting-Funktion auf, indem Sie den folgenden curl-Befehl in Ihrem lokalen Terminal verwenden.

    Wichtig

    Ersetzen Sie YOUR_HTTP_TRIGGER_URL durch Ihre eigene Funktions-URL, die Sie im Azure-Portal oder in der Ausgabe finden.

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

    Die Ausgabe sollte in etwa wie folgt aussehen:

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

    Sie können mit dem folgenden funqyHello-Befehl auch auf die andere Funktion (curl) zugreifen:

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    Die Ausgabe sollte mit der zuvor beobachteten identisch sein:

    "hello funqy"
    

    Wenn Sie die grundlegende Metrikfunktion im Azure-Portal verwenden möchten, versuchen Sie, die Funktion in einer for-Shell-Schleife aufzurufen:

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

    Nach einer Weile werden einige Metrikdaten im Portal angezeigt.

    Screenshot that shows function metrics in the portal.

Nachdem Sie Ihre Azure-Funktion im Portal geöffnet haben, finden Sie hier weitere Features, auf die Sie über das Portal zugreifen können:

Bereinigen von Ressourcen

Wenn Sie diese Ressourcen nicht benötigen, können Sie sie löschen, indem Sie den folgenden Befehl in Azure Cloud Shell oder auf Ihrem lokalen Terminal ausführen:

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

Nächste Schritte

In diesem Artikel haben Sie Folgendes gelernt:

  • Führen Sie den Quarkus-Entwicklungsmodus aus.
  • Stellen Sie eine Funqy-App in Azure Functions bereit. Verwenden Sie dafür azure-functions-maven-plugin.
  • Untersuchen Sie die Leistung der Funktion im Portal.

Weitere Informationen zu Azure Functions und Quarkus finden Sie in den folgenden Artikeln und Verweisen: