Łączenie funkcji Java z usługą Azure Storage

Azure Functions umożliwia łączenie usług platformy Azure i innych zasobów z funkcjami bez konieczności pisania własnego kodu integracji. Te powiązania, które reprezentują zarówno dane wejściowe, jak i wyjściowe, są deklarowane w definicji funkcji. Dane z powiązań są podawane do funkcji jako parametry. Wyzwalacz jest specjalnym typem powiązania wejściowego. Chociaż funkcja ma tylko jeden wyzwalacz, może mieć wiele powiązań wejściowych i wyjściowych. Aby dowiedzieć się więcej, zobacz pojęcia dotyczące wyzwalaczy i powiązań Azure Functions.

W tym artykule pokazano, jak zintegrować funkcję utworzoną w poprzednim artykule Szybki start z kolejką usługi Azure Storage. Powiązanie wyjściowe dodane do tej funkcji zapisuje dane z żądania HTTP do komunikatu w kolejce.

Większość powiązań wymaga przechowywanych parametrów połączenia używanych przez usługę Functions do uzyskiwania dostępu do powiązanej usługi. Aby ułatwić to połączenie, użyj konta magazynu utworzonego za pomocą aplikacji funkcji. Połączenie z tym kontem jest już przechowywane w ustawieniu aplikacji o nazwie AzureWebJobsStorage.

Wymagania wstępne

Przed rozpoczęciem tego artykułu wykonaj kroki opisane w części 1 przewodnika Szybki start języka Java.

Pobieranie ustawień aplikacji funkcji

Utworzono już aplikację funkcji na platformie Azure wraz z wymaganym kontem magazynu. Parametry połączenia dla tego konta są bezpiecznie przechowywane w ustawieniach aplikacji na platformie Azure. W tym artykule zapisujesz komunikaty w kolejce usługi Storage na tym samym koncie. Aby nawiązać połączenie z kontem magazynu podczas lokalnego uruchamiania funkcji, musisz pobrać ustawienia aplikacji do pliku local.settings.json.

W katalogu głównym projektu uruchom następujące polecenie Azure Functions Core Tools, aby pobrać ustawienia do pliku local.settings.json, zastępując <APP_NAME> ciąg nazwą aplikacji funkcji z poprzedniego artykułu:

func azure functionapp fetch-app-settings <APP_NAME>

Może być konieczne zalogowanie się do konta platformy Azure.

Ważne

To polecenie zastępuje wszystkie istniejące ustawienia wartościami z aplikacji funkcji na platformie Azure.

Ponieważ zawiera wpisy tajne, plik local.settings.json nigdy nie jest publikowany i powinien zostać wykluczony z kontroli źródła.

Potrzebna jest wartość AzureWebJobsStorage, która jest parametrami połączenia konta magazynu. To połączenie służy do sprawdzania, czy powiązanie wyjściowe działa zgodnie z oczekiwaniami.

Włączanie pakietów rozszerzeń

Najprostszym sposobem instalowania rozszerzeń powiązań jest włączenie pakietów rozszerzeń. Po włączeniu pakietów instalowany jest automatycznie wstępnie zdefiniowany zestaw pakietów rozszerzeń.

Aby włączyć pakiety rozszerzeń, otwórz plik host.json i zaktualizuj jego zawartość w celu dopasowania go do następującego kodu:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[3.*, 4.0.0)"
    }
}

Teraz możesz dodać powiązanie danych wyjściowych usługi Storage do projektu.

Dodawanie powiązania danych wyjściowych

W projekcie Java powiązania są definiowane jako adnotacje powiązań w metodzie funkcji. Plik function.json jest następnie automatycznie generowany na podstawie tych adnotacji.

Przejdź do lokalizacji kodu funkcji w obszarze src/main/java, otwórz plik projektu Function.java i dodaj następujący parametr do run definicji metody:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

Parametr msg jest typem OutputBinding<T> , który reprezentuje kolekcję ciągów. Te ciągi są zapisywane jako komunikaty do powiązania wyjściowego po zakończeniu działania funkcji. W takim przypadku dane wyjściowe są kolejką magazynu o nazwie outqueue. Parametry połączenia dla konta magazynu są ustawiane przez metodę connection . Przekazujesz ustawienie aplikacji zawierające parametry połączenia konta magazynu, zamiast przekazywać same parametry połączenia.

Definicja run metody musi teraz wyglądać podobnie do poniższego przykładu:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

Dodawanie kodu korzystającego z powiązania danych wyjściowych

Teraz możesz użyć nowego msg parametru do zapisania do powiązania wyjściowego z kodu funkcji. Dodaj następujący wiersz kodu przed odpowiedzią powodzenia, aby dodać wartość name do powiązania wyjściowego msg .

msg.setValue(name);

Jeśli używasz powiązania wyjściowego, nie musisz używać kodu zestawu SDK usługi Azure Storage do uwierzytelniania, pobierania odwołania do kolejki ani zapisywania danych. Powiązanie danych wyjściowych środowiska uruchomieniowego i kolejki usługi Functions wykonuje te zadania.

Metoda run musi teraz wyglądać podobnie do następującego przykładu:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

Aktualizowanie testów

Ponieważ archetyp tworzy również zestaw testów, należy zaktualizować te testy, aby obsługiwać nowy msg parametr w podpisie run metody.

Przejdź do lokalizacji kodu testowego w obszarze src/test/java, otwórz plik projektu Function.java i zastąp wiersz kodu poniżej //Invoke następującym kodem:

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

Teraz możesz wypróbować nowe powiązanie wyjściowe lokalnie.

Lokalne uruchamianie funkcji

Tak jak poprzednio, użyj następującego polecenia, aby skompilować projekt i uruchomić środowisko uruchomieniowe usługi Functions lokalnie:

mvn clean package 
mvn azure-functions:run

Uwaga

Ponieważ włączono pakiety rozszerzeń w pliku host.json, rozszerzenie powiązania magazynu zostało pobrane i zainstalowane podczas uruchamiania wraz z innymi rozszerzeniami powiązań firmy Microsoft.

Tak jak poprzednio, wyzwól funkcję z wiersza polecenia przy użyciu programu cURL w nowym oknie terminalu:

curl -w "\n" http://localhost:7071/api/HttpTrigger-Java --data AzureFunctions

Tym razem powiązanie wyjściowe tworzy również kolejkę o nazwie outqueue na koncie magazynu i dodaje komunikat z tym samym ciągiem.

Następnie użyjesz interfejsu wiersza polecenia platformy Azure, aby wyświetlić nową kolejkę i sprawdzić, czy komunikat został dodany. Kolejkę można również wyświetlić przy użyciu Eksplorator usługi Microsoft Azure Storage lub w Azure Portal.

Ustawianie połączenia konta magazynu

Otwórz plik local.settings.json i skopiuj wartość AzureWebJobsStorage, która jest parametrami połączenia konta magazynu. Ustaw zmienną AZURE_STORAGE_CONNECTION_STRING środowiskową na parametry połączenia przy użyciu tego polecenia powłoki Bash:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Po ustawieniu parametrów połączenia w zmiennej AZURE_STORAGE_CONNECTION_STRING środowiskowej możesz uzyskać dostęp do konta magazynu bez konieczności każdorazowego uwierzytelniania.

Wykonywanie zapytań względem kolejki magazynu

Możesz użyć az storage queue list polecenia , aby wyświetlić kolejki usługi Storage na koncie, jak w poniższym przykładzie:

az storage queue list --output tsv

Dane wyjściowe tego polecenia zawierają kolejkę o nazwie outqueue, czyli kolejkę utworzoną podczas uruchamiania funkcji.

Następnie użyj az storage message peek polecenia , aby wyświetlić komunikaty w tej kolejce, jak w tym przykładzie:

echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`

Zwrócony ciąg powinien być taki sam jak komunikat wysłany do przetestowania funkcji.

Uwaga

Poprzedni przykład dekoduje zwrócony ciąg z base64. Dzieje się tak, ponieważ powiązania usługi Queue Storage zapisują i odczytują z usługi Azure Storage jako ciągi base64.

Ponowne wdrażanie projektu

Aby zaktualizować opublikowaną aplikację, uruchom ponownie następujące polecenie:

mvn azure-functions:deploy

Ponownie możesz użyć narzędzia cURL do przetestowania wdrożonej funkcji. Tak jak poprzednio, przekaż wartość AzureFunctions w treści żądania POST do adresu URL, jak w tym przykładzie:

curl -w "\n" https://fabrikam-functions-20190929094703749.azurewebsites.net/api/HttpTrigger-Java?code=zYRohsTwBlZ68YF.... --data AzureFunctions

Możesz ponownie zbadać komunikat kolejki usługi Storage , aby sprawdzić, czy powiązanie wyjściowe generuje nowy komunikat w kolejce zgodnie z oczekiwaniami.

Czyszczenie zasobów

Inne przewodniki Szybki start w tej kolekcji bazują na tym przewodniku. Jeśli planujesz kontynuować pracę z kolejnymi przewodnikami Szybki start lub samouczkami, nie usuwaj zasobów utworzonych w tym przewodniku Szybki start. Jeśli nie planujesz kontynuowania pracy, użyj następującego polecenia, aby usunąć wszystkie zasoby utworzone w tym przewodniku Szybki start:

az group delete --name myResourceGroup

Wybierz y po wyświetleniu monitu.

Następne kroki

Zaktualizowano funkcję wyzwalaną przez protokół HTTP w celu zapisywania danych w kolejce usługi Storage. Aby dowiedzieć się więcej na temat tworzenia Azure Functions za pomocą języka Java, zobacz przewodnik dewelopera Azure Functions Java oraz wyzwalacze i powiązania Azure Functions. Przykłady kompletnych projektów funkcji w języku Java można znaleźć w przykładach funkcji języka Java.

Następnie należy włączyć monitorowanie usługi Application Insights dla aplikacji funkcji: