Serverloze Java-apps implementeren met Quarkus in Azure Functions

In dit artikel ontwikkelt, bouwt en implementeert u een serverloze Java-app in Azure Functions met behulp van Quarkus. In dit artikel wordt Gebruikgemaakt van Quarkus Funqy en de ingebouwde ondersteuning voor de HTTP-trigger van Azure Functions voor Java. Het gebruik van Quarkus met Azure Functions biedt u de kracht van het Quarkus-programmeermodel met de schaal en flexibiliteit van Azure Functions. Wanneer u klaar bent, voert u serverloze Quarkus-toepassingen uit in Azure Functions en blijft u uw app bewaken in Azure.

Vereisten

Het app-project maken

Gebruik de volgende opdracht om het Java-voorbeeldproject voor dit artikel te klonen. Het voorbeeld bevindt zich op GitHub.

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

Als u een bericht ziet over een losgekoppelde HEAD-status , is dit bericht veilig te negeren. Omdat voor dit artikel geen doorvoeringen zijn vereist, is de losgekoppelde HEAD-status geschikt.

Verken de voorbeeldfunctie. Open het bestand functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java .

Voer de volgende opdracht uit. De @Funq aantekening maakt uw methode (in dit geval funqyHello) een serverloze functie.

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

Azure Functions Java heeft een eigen set Azure-specifieke aantekeningen, maar deze aantekeningen zijn niet nodig wanneer u Quarkus in Azure Functions gebruikt in een eenvoudige capaciteit, zoals we hier doen. Zie de Ontwikkelaarshandleiding voor Java voor Azure Functions voor meer informatie over Azure Functions Java-aantekeningen.

Tenzij u anders opgeeft, is de naam van de functie hetzelfde als de naam van de methode. U kunt ook de volgende opdracht gebruiken om de functienaam te definiëren met een parameter voor de aantekening:

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

De naam is belangrijk. Het wordt een onderdeel van de REST-URI om de functie aan te roepen, zoals verderop in het artikel wordt weergegeven.

De functie lokaal testen

Gebruik mvn deze modus om quarkus-ontwikkelaarsmodus uit te voeren op uw lokale terminal. Door Quarkus op deze manier uit te voeren, kan live opnieuw worden geladen met compilatie op de achtergrond. Wanneer u uw Java-bestanden en/of uw resourcebestanden wijzigt en uw browser vernieuwt, worden deze wijzigingen automatisch van kracht.

Een browservernieuwing activeert een scan van de werkruimte. Als de scan wijzigingen detecteert, worden de Java-bestanden opnieuw gecompileerd en wordt de toepassing opnieuw geïmplementeerd. Uw opnieuw geïmplementeerde toepassingsservices de aanvraag. Als er problemen zijn met compilatie of implementatie, wordt u op een foutpagina op de hoogte gesteld.

Vervang in de volgende procedure door yourResourceGroupName de naam van een resourcegroep. Namen van functie-apps moeten wereldwijd uniek zijn in azure. Namen van resourcegroepen moeten wereldwijd uniek zijn binnen een abonnement. In dit artikel wordt de benodigde uniekheid bereikt door de naam van de resourcegroep vooraf te laten gaan aan de functienaam. Overweeg om een unieke id toe te wijzen aan namen die u maakt die uniek moeten zijn. Een handige techniek is het gebruik van uw initialen, gevolgd door de datum van vandaag in mmdd notatie.

De resourcegroep is niet nodig voor dit deel van de instructies, maar deze is later vereist. Voor het gemak vereist het Maven-project dat u de eigenschap definieert.

  1. Quarkus-ontwikkelaarsmodus aanroepen:

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

    De uitvoer moet er ongeveer als volgt uitzien:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    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. Open de functie met behulp van de CURL opdracht in uw lokale terminal:

    curl localhost:8080/api/funqyHello
    

    De uitvoer moet er ongeveer als volgt uitzien:

    "hello funqy"
    

Afhankelijkheidsinjectie toevoegen aan de functie

De open-standaard technologie Jakarta EE Contexts and Dependency Injection (CDI) biedt afhankelijkheidsinjectie in Quarkus. Zie de Jakarta EE-zelfstudie voor een algemeen overzicht van injectie in het algemeen en CDI.

  1. Voeg een nieuwe functie toe die gebruikmaakt van afhankelijkheidsinjectie.

    Maak een GreetingService.java-bestand in de map functions-quarkus/src/main/java/io/quarkus . Gebruik de volgende code als de broncode van het bestand:

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

    Sla het bestand op.

    GreetingService is een injecteerbare bean die een greeting() methode implementeert. De methode retourneert een Welcome... tekenreeksbericht met een name parameter.

  2. Open het bestaande bestand functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java . Vervang de klasse door de volgende code om een nieuw gService veld en de greeting methode toe te voegen:

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

    Sla het bestand op.

  3. Open de nieuwe greeting functie met behulp van de curl opdracht in uw lokale terminal:

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

    De uitvoer moet er ongeveer als volgt uitzien:

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

    Belangrijk

    Met Live Coding (ook wel dev-modus genoemd) kunt u de app uitvoeren en direct wijzigingen aanbrengen. Quarkus zal de app automatisch opnieuw compileren en opnieuw laden wanneer er wijzigingen worden aangebracht. Dit is een krachtige en efficiënte ontwikkelstijl die u in dit artikel gaat gebruiken.

    Voordat u verdergaat met de volgende stap, stopt u de dev-modus quarkus door Ctrl+C te selecteren.

De app implementeren in Azure

  1. Als u dat nog niet hebt gedaan, meldt u zich aan bij uw Azure-abonnement met behulp van de volgende az login-opdracht en volgt u de aanwijzingen op het scherm:

    az login
    

    Notitie

    Als er meerdere Azure-tenants zijn gekoppeld aan uw Azure-referenties, moet u opgeven bij welke tenant u zich wilt aanmelden. U kunt dit doen met behulp van de --tenant optie. Bijvoorbeeld: az login --tenant contoso.onmicrosoft.com.

    Ga door met het proces in de webbrowser. Als er geen webbrowser beschikbaar is of als de webbrowser niet kan worden geopend, gebruikt u de apparaatcodestroom met az login --use-device-code.

    Nadat u zich hebt aangemeld, ziet de uitvoer op uw lokale terminal er ongeveer als volgt uit:

    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. Bouw en implementeer de functies in Azure.

    Het pom.xml-bestand dat u in de vorige stap hebt gegenereerd, maakt gebruik van azure-functions-maven-plugin. Als u deze uitvoert mvn install , worden configuratiebestanden en een faseringsmap gegenereerd die azure-functions-maven-plugin vereist is. Gebruik yourResourceGroupNamehiervoor de waarde die u eerder hebt gebruikt.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. Meld u tijdens de implementatie aan bij Azure. De azure-functions-maven-plugin invoegtoepassing is zo geconfigureerd dat telkens wanneer het project wordt geïmplementeerd, wordt gevraagd om u aan te melden bij Azure. Tijdens de build wordt uitvoer weergegeven die vergelijkbaar is met het volgende:

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

    Doe zoals in de uitvoer wordt vermeld en geverifieerd bij Azure met behulp van de browser en de opgegeven apparaatcode. Er zijn veel andere verificatie- en configuratieopties beschikbaar. De volledige referentiedocumentatie voor azure-functions-maven-plugin is beschikbaar in Azure Functions: Configuratiedetails.

  4. Na verificatie moet de build doorgaan en voltooien. Zorg ervoor dat de uitvoer bijna aan het einde is opgenomen BUILD SUCCESS .

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

    U kunt ook de URL vinden om uw functie in Azure te activeren in het uitvoerlogboek:

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

    Het duurt even voordat de implementatie is voltooid. In de tussentijd gaan we Azure Functions verkennen in Azure Portal.

De serverloze functie in Azure openen en bewaken

Meld u aan bij de portal en zorg ervoor dat u dezelfde tenant en hetzelfde abonnement hebt geselecteerd dat u hebt gebruikt in de Azure CLI.

  1. Typ de functie-app op de zoekbalk boven aan De Azure-portal en selecteer de Enter-toets. Uw functie-app moet worden geïmplementeerd en worden weergegeven met de naam <yourResourceGroupName>-function-quarkus.

    Screenshot that shows the function app in the portal.

  2. Selecteer de functie-app om gedetailleerde informatie weer te geven, zoals Locatie, Abonnement, URL, Metrische gegevens en App Service-plan. Selecteer vervolgens de URL-waarde .

    Screenshot that shows a URL and other function app details.

  3. Controleer of de welkomstpagina aangeeft dat uw functie-app 'actief' is.

    Screenshot that shows the welcome page for a function app.

  4. Roep de greeting functie aan met behulp van de volgende curl opdracht in uw lokale terminal.

    Belangrijk

    Vervang YOUR_HTTP_TRIGGER_URL door uw eigen functie-URL die u in Azure Portal of uitvoer vindt.

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

    De uitvoer moet er als volgt uitzien:

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

    U kunt ook toegang krijgen tot de andere functie (funqyHello) met behulp van de volgende curl opdracht:

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    De uitvoer moet hetzelfde zijn als wat u eerder hebt waargenomen:

    "hello funqy"
    

    Als u de basisfunctie voor metrische gegevens in Azure Portal wilt gebruiken, kunt u proberen de functie binnen een shell-lus for aan te roepen:

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

    Na enige tijd ziet u enkele metrische gegevens in de portal.

    Screenshot that shows function metrics in the portal.

Nu u uw Azure-functie in de portal hebt geopend, zijn hier meer functies die u vanuit de portal kunt openen:

Resources opschonen

Als u deze resources niet nodig hebt, kunt u ze verwijderen door de volgende opdracht uit te voeren in Azure Cloud Shell of in uw lokale terminal:

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

Volgende stappen

In dit artikel hebt u het volgende geleerd:

  • Voer de dev-modus Quarkus uit.
  • Implementeer een Funqy-app in Azure-functies met behulp van azure-functions-maven-plugin.
  • Bekijk de prestaties van de functie in de portal.

Zie de volgende artikelen en verwijzingen voor meer informatie over Azure Functions en Quarkus: