Wdrażanie bezserwerowych aplikacji Java za pomocą aplikacji Quarkus w usłudze Azure Functions

W tym artykule utworzysz, skompilujesz i wdrożysz bezserwerową aplikację Java w usłudze Azure Functions przy użyciu aplikacji Quarkus. W tym artykule użyto biblioteki Quarkus Funqy i wbudowanej obsługi wyzwalacza HTTP usługi Azure Functions dla języka Java. Korzystanie z aplikacji Quarkus z usługą Azure Functions zapewnia możliwości modelu programowania Quarkus z skalowaniem i elastycznością usługi Azure Functions. Po zakończeniu uruchomisz bezserwerowe aplikacje Quarkus w usłudze Azure Functions i będziesz nadal monitorować aplikację na platformie Azure.

Wymagania wstępne

Tworzenie projektu aplikacji

Użyj następującego polecenia, aby sklonować przykładowy projekt Java dla tego artykułu. Przykład znajduje się w witrynie GitHub.

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

Jeśli zostanie wyświetlony komunikat o odłączeniu stanu HEAD , ten komunikat jest bezpieczny do zignorowania. Ponieważ ten artykuł nie wymaga żadnych zatwierdzeń, odłączony stan HEAD jest odpowiedni.

Zapoznaj się z przykładową funkcją. Otwórz plik functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java.

Uruchom następujące polecenie: Adnotacja @Funq powoduje, że metoda (w tym przypadku funqyHello) jest funkcją bezserwerową.

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

Język Java usługi Azure Functions ma własny zestaw adnotacji specyficznych dla platformy Azure, ale te adnotacje nie są konieczne, gdy używasz aplikacji Quarkus w usłudze Azure Functions w prostej pojemności, ponieważ robimy to tutaj. Aby uzyskać więcej informacji na temat adnotacji języka Java usługi Azure Functions, zobacz Przewodnik dla deweloperów języka Java usługi Azure Functions.

Jeśli nie określisz inaczej, nazwa funkcji jest taka sama jak nazwa metody. Możesz również użyć następującego polecenia, aby zdefiniować nazwę funkcji z parametrem adnotacji:

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

Nazwa jest ważna. Staje się częścią identyfikatora URI REST w celu wywołania funkcji, jak pokazano w dalszej części artykułu.

Lokalne testowanie funkcji

Użyj mvn polecenia , aby uruchomić tryb deweloperski Quarkus w lokalnym terminalu. Uruchamianie aplikacji Quarkus w ten sposób umożliwia ponowne ładowanie na żywo przy użyciu kompilacji w tle. Podczas modyfikowania plików Java i/lub plików zasobów i odświeżania przeglądarki te zmiany zostaną automatycznie zastosowane.

Odświeżanie przeglądarki wyzwala skanowanie obszaru roboczego. Jeśli skanowanie wykryje jakiekolwiek zmiany, pliki Java zostaną ponownie skompilowane, a aplikacja zostanie ponownie wdrożona. Ponownie wdrożono usługi aplikacji w żądaniu. Jeśli występują problemy z kompilacją lub wdrożeniem, zostanie wyświetlona strona błędu.

W poniższej procedurze zastąp ciąg yourResourceGroupName nazwą grupy zasobów. Nazwy aplikacji funkcji muszą być globalnie unikatowe na całej platformie Azure. Nazwy grup zasobów muszą być globalnie unikatowe w ramach subskrypcji. W tym artykule osiągnięto niezbędną unikatowość, poprzedzając nazwę grupy zasobów nazwą funkcji. Rozważ utworzenie unikatowego identyfikatora dla wszystkich utworzonych nazw, które muszą być unikatowe. Przydatną techniką jest użycie inicjałów, po których następuje dzisiejsza data w mmdd formacie.

Grupa zasobów nie jest konieczna w tej części instrukcji, ale jest wymagana później. Dla uproszczenia projekt Maven wymaga zdefiniowania właściwości .

  1. Wywołaj tryb deweloperski Quarkus:

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

    Dane wyjściowe powinny wyglądać podobnie do poniższych:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    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. Uzyskaj dostęp do funkcji przy użyciu polecenia w terminalu CURL lokalnym:

    curl localhost:8080/api/funqyHello
    

    Dane wyjściowe powinny wyglądać podobnie do poniższych:

    "hello funqy"
    

Dodawanie wstrzykiwania zależności do funkcji

Technologia open-standard Jakarta EE Contexts and Dependency Injection (CDI) zapewnia wstrzykiwanie zależności w Quarkus. Aby zapoznać się z ogólnym omówieniem iniekcji, a w szczególności z cdi, zobacz samouczek Jakarta EE.

  1. Dodaj nową funkcję, która używa wstrzykiwania zależności.

    Utwórz plik GreetingService.java w katalogu functions-quarkus/src/main/java/io/quarkus. Użyj następującego kodu jako kodu źródłowego pliku:

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

    Zapisz plik.

    GreetingService jest fasolą, która implementuje metodę greeting() . Metoda zwraca Welcome... komunikat ciągu z parametrem name .

  2. Otwórz istniejący plik functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java . Zastąp klasę następującym kodem, aby dodać nowe gService pole i metodę greeting :

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

    Zapisz plik.

  3. Uzyskaj dostęp do nowej greeting funkcji przy użyciu polecenia w terminalu curl lokalnym:

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

    Dane wyjściowe powinny wyglądać podobnie do poniższych:

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

    Ważne

    Kodowanie na żywo (nazywane również trybem deweloperskim) umożliwia uruchamianie aplikacji i wprowadzanie zmian na bieżąco. Funkcja Quarkus automatycznie ponownie skompiluje i ponownie załaduje aplikację po wprowadzeniu zmian. Jest to zaawansowany i wydajny styl opracowywania, którego będziesz używać w tym artykule.

    Przed przejściem do przodu do następnego kroku zatrzymaj tryb deweloperski Quarkus, wybierając klawisze Ctrl+C.

Wdrażanie aplikacji na platformie Azure

  1. Jeśli jeszcze tego nie zrobiono, zaloguj się do subskrypcji platformy Azure przy użyciu następującego polecenia az login i postępuj zgodnie z instrukcjami wyświetlanymi na ekranie:

    az login
    

    Uwaga

    Jeśli wiele dzierżaw platformy Azure jest skojarzonych z poświadczeniami platformy Azure, musisz określić dzierżawę, do której chcesz się zalogować. Można to zrobić przy użyciu --tenant opcji . Na przykład: az login --tenant contoso.onmicrosoft.com.

    Kontynuuj proces w przeglądarce internetowej. Jeśli żadna przeglądarka internetowa nie jest dostępna lub nie można otworzyć przeglądarki internetowej, użyj przepływu kodu urządzenia z az login --use-device-codeprogramem .

    Po pomyślnym zalogowaniu dane wyjściowe w terminalu lokalnym powinny wyglądać podobnie do następujących:

    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. Kompilowanie i wdrażanie funkcji na platformie Azure.

    Plik pom.xml wygenerowany w poprzednim kroku używa polecenia azure-functions-maven-plugin. Uruchomienie mvn install generuje pliki konfiguracji i katalog przejściowy, który azure-functions-maven-plugin wymaga. W przypadku yourResourceGroupNameelementu użyj wcześniej użytej wartości.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. Podczas wdrażania zaloguj się na platformie Azure. Wtyczka azure-functions-maven-plugin jest skonfigurowana do monitowania o logowanie do platformy Azure przy każdym wdrożeniu projektu. Podczas kompilacji są wyświetlane dane wyjściowe podobne do następujących:

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

    W danych wyjściowych jest wyświetlany komunikat i uwierzytelnij się na platformie Azure przy użyciu przeglądarki i podanego kodu urządzenia. Dostępnych jest wiele innych opcji uwierzytelniania i konfiguracji. Pełną dokumentację referencyjną dla azure-functions-maven-plugin programu można znaleźć w temacie Azure Functions: Configuration Details (Szczegóły konfiguracji usługi Azure Functions: Szczegóły konfiguracji).

  4. Po uwierzytelnieniu kompilacja powinna kontynuować i zakończyć. Upewnij się, że dane wyjściowe znajdują BUILD SUCCESS się w pobliżu końca.

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

    Adres URL wyzwalający funkcję na platformie Azure można również znaleźć w dzienniku danych wyjściowych:

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

    Ukończenie wdrożenia zajmie trochę czasu. W międzyczasie przyjrzyjmy się usłudze Azure Functions w witrynie Azure Portal.

Uzyskiwanie dostępu do funkcji bezserwerowej i monitorowanie jej na platformie Azure

Zaloguj się do portalu i upewnij się, że wybrano tę samą dzierżawę i subskrypcję używaną w interfejsie wiersza polecenia platformy Azure.

  1. Wpisz aplikację funkcji na pasku wyszukiwania w górnej części witryny Azure Portal i wybierz klawisz Enter. Aplikacja funkcji powinna zostać wdrożona i wyświetlona z nazwą <yourResourceGroupName>-function-quarkus.

    Screenshot that shows the function app in the portal.

  2. Wybierz aplikację funkcji, aby wyświetlić szczegółowe informacje, takie jak lokalizacja, subskrypcja, adres URL, metryki i plan usługi App Service. Następnie wybierz wartość adresu URL .

    Screenshot that shows a URL and other function app details.

  3. Upewnij się, że strona powitalna wskazuje, że aplikacja funkcji jest "uruchomiona".

    Screenshot that shows the welcome page for a function app.

  4. Wywołaj greeting funkcję przy użyciu następującego curl polecenia w terminalu lokalnym.

    Ważne

    Zastąp YOUR_HTTP_TRIGGER_URL ciąg własnym adresem URL funkcji, który znajdziesz w witrynie Azure Portal lub danych wyjściowych.

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

    Dane wyjściowe powinny wyglądać mniej więcej tak:

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

    Dostęp do drugiej funkcji (funqyHello) można również uzyskać przy użyciu następującego curl polecenia:

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    Dane wyjściowe powinny być takie same jak obserwowane wcześniej:

    "hello funqy"
    

    Jeśli chcesz wykonać podstawową funkcję metryk w witrynie Azure Portal, spróbuj wywołać funkcję w pętli powłoki for :

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

    Po pewnym czasie w portalu zostaną wyświetlone dane metryk.

    Screenshot that shows function metrics in the portal.

Teraz, po otwarciu funkcji platformy Azure w portalu, poniżej przedstawiono więcej funkcji, do których możesz uzyskać dostęp z portalu:

Czyszczenie zasobów

Jeśli nie potrzebujesz tych zasobów, możesz je usunąć, uruchamiając następujące polecenie w usłudze Azure Cloud Shell lub w lokalnym terminalu:

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

Następne kroki

W tym artykule zawarto informacje na temat wykonywania następujących czynności:

  • Uruchom tryb deweloperski Quarkus.
  • Wdróż aplikację Funqy w usłudze Azure Functions przy użyciu polecenia azure-functions-maven-plugin.
  • Sprawdź wydajność funkcji w portalu.

Aby dowiedzieć się więcej na temat usług Azure Functions i Quarkus, zobacz następujące artykuły i odwołania: