Udostępnij za pomocą


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

  • Interfejs wiersza polecenia platformy Azure zainstalowany na własnym komputerze.
  • Konto platformy Azure. Jeśli nie masz jeszcze konta platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
  • Java JDK 17 z JAVA_HOME odpowiednio skonfigurowanym. Ten artykuł został napisany z myślą o języku Java 17, ale usługi Azure Functions i Quarkus obsługują również starsze wersje języka Java.
  • Apache Maven 3.8.1+.

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 stanie detached HEAD, można go zignorować. Ponieważ ten artykuł nie wymaga żadnych zatwierdzeń, tryb odłączenia 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 Quarkus w usłudze Azure Functions w podstawowym zakresie, tak jak 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. Twoje ponownie wdrożone aplikacje obsługują żądanie. 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 formacie mmdd.

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:

    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 otwartego standardu Jakarta EE Contexts and Dependency Injection (CDI) jest stosowana do wstrzykiwania zależności w Quarkus.

  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 beanem referencyjnym, który implementuje metodę greeting(). Metoda zwraca Welcome... komunikat tekstowy 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. Quarkus automatycznie ponownie skompiluje i 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 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 uwierzytelniania za pomocą kodu urządzenia z az login --use-device-code.

    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 yourResourceGroupName użyj wartości użytej wcześniej.

    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.
    

    Zrób to, co mówi komunikat wyjściowy, i uwierzytelnij się na platformie Azure za pomocą przeglądarki internetowej oraz podanego kodu urządzenia. Dostępnych jest wiele innych opcji uwierzytelniania i konfiguracji. Pełną dokumentację referencyjną dla azure-functions-maven-plugin można znaleźć na stronie Azure Functions: Szczegóły konfiguracji.

  4. Po uwierzytelnieniu kompilacja powinna być kontynuowana i zakończona. Upewnij się, że w danych wyjściowych znajduje się BUILD SUCCESS blisko 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 wybierasz tę samą dzierżawcę i subskrypcję, którą używasz w interfejsie wiersza polecenia platformy Azure.

  1. Wpisz Function App w pasku wyszukiwania na górze portalu Azure i naciśnij klawisz Enter. Aplikacja funkcji powinna zostać wdrożona i wyświetlona z nazwą <yourResourceGroupName>-function-quarkus.

    Zrzut ekranu przedstawiający aplikację funkcjonalną w portalu.

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

    Zrzut ekranu przedstawiający adres URL i inne szczegóły aplikacji funkcji.

  3. Upewnij się, że strona powitalna wskazuje, że aplikacja funkcji działa poprawnie.

    Zrzut ekranu przedstawiający stronę powitalną aplikacji funkcji.

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

    Ważne

    Zastąp YOUR_HTTP_TRIGGER_URL własnym adresem URL funkcji, który znajdziesz w portalu Azure lub w wyniku.

    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 używać podstawowej funkcji metryk w 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.

    Zrzut ekranu przedstawiający metryki funkcji w portalu.

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 te zasoby nie są potrzebne, możesz je usunąć, uruchamiając następujące polecenie:

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: