Łą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:
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:
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: