Подключение функции Java к службе хранилища Azure

Функции Azure позволяют выполнять подключение служб Azure и других ресурсов к функциям без необходимости написания кода для интеграции. Эти привязки, которые представляют как входные, так и выходные данные, объявляются в определении функции. Данные привязок предоставляются функции в качестве параметров. Триггер является специальным типом входных привязок. Хотя функция обладает только одним триггером, она может состоять из нескольких входных и выходных привязок. Дополнительные сведения см. в статье Основные понятия триггеров и привязок в Функциях Azure.

В этой статье приведены сведения об интеграции функции, которая была создана в предыдущей статье, с помощью очереди службы хранилища Azure. Выходная привязка, которая была добавлена в эту функцию, записывает в сообщение очереди данные HTTP-запроса.

Большинство привязок требуют сохраненную строку подключения, которая будет использоваться Функциями Azure для доступа к привязанным службам. Чтобы упростить это подключение, вам следует использовать учетную запись хранения, созданную в приложении-функции. Подключение к этой учетной записи уже хранится в параметрах приложения под названием AzureWebJobsStorage.

Предварительные требования

Перед началом работы с этой статьей следует завершить все шаги из части 1 краткого руководства по Java.

Загрузка параметров приложения-функции

Вы уже создали приложение-функцию и соответствующую учетную запись хранения в Azure. Строка подключения данной учетной записи надежно хранится в параметрах приложения в Azure. В этой статье вы напишете сообщения в очередь хранилища в пределах одной учетной записи. Чтобы подключить учетную запись хранения при локальном выполнение функции, необходимо загрузить параметры приложения в файл local.settings.json.

Чтобы загрузить параметры в файл local.settings.json, в корневом каталоге проекта выполните команду Azure Functions Core Tools и замените <APP_NAME> именем приложения-функции из предыдущей статьи.

func azure functionapp fetch-app-settings <APP_NAME>

Возможно, вам нужно будет войти в учетную запись Azure.

Важно!

Эта команда перезаписывает любые имеющиеся параметры значениями из приложения-функции в Azure.

Из-за того, что его содержимое является секретом, файл local.settings.json никогда не будет опубликован, и он должен быть исключен из системы управления версиями.

Вам нужно значение AzureWebJobsStorage, которое является строкой подключения к учетной записи хранилища. Это подключение используется для проверки работы привязки для вывода.

Включение пакетов расширений

Самый простой способ установить расширения привязки — включить пакеты расширений. При этом автоматически устанавливается набор стандартных пакетов расширений.

Чтобы включить пакеты расширений, откройте файл host.json и обновите его содержимое так, чтобы оно соответствовало следующему коду:

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

Теперь вы можете добавить выходную привязку службы хранилища в проект.

Добавление выходной привязки

В проекте Java привязки определяются как заметки привязки для метода функции. Затем на основе этих заметок автоматически создается файл function.json.

Найдите расположение вашего кода функции в src/main/java, откройте файл проекта Function.java и добавьте следующий параметр в run определение метода:

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

Параметр msg имеет тип OutputBinding<T>, который представляет коллекцию строк. Эти строки записываются в виде сообщений в выходную привязку при завершении работы функции. В этом случае выходные данные представляют собой очередь хранилища с именем outqueue. Строка подключения для учетной записи хранения задается методом connection. Вместо самой строки подключения передается параметр приложения, содержащий строку подключения к учетной записи хранения.

Определение метода run теперь должно выглядеть следующим образом:

@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) {
    ...
}

Добавление кода, который использует выходную привязку

Теперь для записи в выходную привязку из кода функции вы можете использовать новый параметр msg. Добавьте следующую строку кода перед успешным ответом, чтобы добавить значение name к выходной привязке msg.

msg.setValue(name);

После использования выходной привязки вам для проверки подлинности, получения ссылки на очередь или записи данных больше не потребуется код пакета SDK службы хранилища Azure. Вместо вас эти задачи будут выполнены выходной привязкой очереди и средой выполнения функции.

Теперь метод run должен выглядеть следующим образом:

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

Обновление тестов

Поскольку архетип также создает набор тестов, необходимо обновить эти тесты для обработки нового параметра msg в сигнатуре метода run.

Найдите местоположение тестового кода в каталоге src/test/java, откройте файл проекта Function.java и замените строку кода в //Invoke следующим кодом:

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

Теперь новую выходную привязку можно испытать локально.

Локальное выполнение функции

Как и прежде, чтобы построить проект и запустить среду выполнения функций локально, используйте следующую команду.

mvn clean package 
mvn azure-functions:run

Примечание

Так как пакеты расширений включены в файл host.json, во время запуска вместе с другими расширениями привязки Майкрософт было также загружено и установлено расширение привязки службы хранилища.

Как и прежде, запустите функцию из командной строки, используя cURL в новом окне терминала:

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

На этот раз в хранилище очередей выходная привязка также создает очередь с именем outqueue и с помощью этой же строки добавляет сообщение.

Затем Azure CLI следует использовать для просмотра новой очереди и проверки добавленного сообщения. Кроме того, очередь можно просматривать с помощью Обозревателя службы хранилища Microsoft Azure или на портале Azure.

Установка подключения к учетной записи хранилища

Откройте файл local.settings.json и скопируйте значение AzureWebJobsStorage, которое является строкой подключения к учетной записи хранилища. В качестве значения переменной среды AZURE_STORAGE_CONNECTION_STRING установите значение строки подключения, использовав эту команду Bash:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Когда значение строки подключения будет установлено вместо переменной среды AZURE_STORAGE_CONNECTION_STRING, вы можете получить доступ к учетной записи хранения без необходимости проходить проверку подлинности каждый раз.

Запрос в очередь хранилища

Команду az storage queue list можно использовать для просмотра очередей хранилища в учетной записи, как показано в следующем примере.

az storage queue list --output tsv

Выходные данные, полученные после выполнения этой команды, включают в себя очередь outqueue, содранную при выполнении функции.

Затем для просмотра сообщения в очереди используйте команду az storage message peek, как показано в следующем примере.

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

Возвращаемая строка должна совпадать с сообщением, которое было отправлено для проверки функции.

Примечание

В предыдущем примере приведена декодированная строка, возвращенная из base64. Это происходит потому, что запись и чтение привязок хранилища очередей выполняется в хранилище Azure в качестве строк base64.

Повторное развертывание проекта

Чтобы обновить опубликованное приложение, выполните следующую команду еще раз:

mvn azure-functions:deploy

Чтобы проверить развернутую функцию, можно снова использовать cURL. Как и ранее, передайте значение AzureFunctions в тексте запроса POST к URL-адресу, как показано в следующем примере:

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

Чтобы убедиться, что выходная привязка снова создает новое сообщение в очереди, как и ожидалось, можно проверить сообщение очереди службы хранилища.

Очистка ресурсов

Другие краткие руководства в этой коллекции созданы на основе этого документа. Если вы планируете продолжать работу с последующими краткими руководствами или обычными руководствами, не удаляйте созданные ресурсы. Если вы не планируете продолжать работу, удалите все созданные ресурсы с помощью следующей команды:

az group delete --name myResourceGroup

Выберите y при появлении соответствующего запроса.

Дальнейшие действия

Вы обновили функцию, активируемую HTTP, которую теперь можно использовать для записи данных в очередь службы хранилища. Чтобы получить дополнительные сведения о разработке Функций Azure с помощью Java, просмотрите статьи Руководство разработчика Java по Функциям Azure и Основные понятия триггеров и привязок в Функциях Azure. Примеры завершенных проектов Функций в Java см. в этой статье.

Затем для мониторинга приложения-функции следует включить Application Insights.