Краткое руководство. Создание функции Java в Azure из командной строки

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

Если вы не хотите использовать Maven в качестве средства разработки, ознакомьтесь с аналогичными руководствами для разработчиков Java:

Выполнение этого краткого руководства предполагает небольшую дополнительную плату в несколько центов США в учетной записи Azure.

Настройка локальной среды

Перед началом работы убедитесь, что у вас есть такие компоненты.

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .

  • Azure CLI 2.4 или более поздней версии.

  • Пакет разработчиков Java версии 8, 11, 17, 21 (только Для Linux). Переменной среды JAVA_HOME необходимо присвоить расположение установки правильной версии JDK.

  • Apache Maven 3.0 или более поздней версии.

Установка основных инструментов Функций Azure

Рекомендуемый способ установки основных средств зависит от операционной системы локального компьютера разработки.

Следующая процедура устанавливает Core Tools версии v4.x с помощью установщика Windows (MSI). Дополнительные сведения о других установщиках на основе пакетов, см. в файле readme для Core Tools.

Скачайте и запустите установщик Core Tools для используемой версии Windows:

Если вы ранее использовали установщик Windows (MSI) для установки основных инструментов в Windows, перед установкой последней версии удалите старую версию из команды "Добавить программы".

Создание локального проекта службы "Функции"

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

  1. В пустой папке выполните следующую команду, чтобы создать проект функций из архетипа Maven.

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8
    

    Важно!

    • Используйте -DjavaVersion=11, чтобы функции выполнялись на Java 11. Дополнительные сведения см. в разделе Версии Java.
    • Чтобы выполнить задания из этой статьи, переменной среды JAVA_HOME необходимо присвоить расположение установки правильной версии JDK.
  2. Maven запрашивает значения, которые позволят завершить создание проекта развертывания.
    Предоставьте следующие значения в ответ на соответствующие запросы:

    Prompt значение Описание
    groupId com.fabrikam Это значение уникально идентифицирует проект среди всех остальных. Оно должно соответствовать правилам именования пакетов для Java.
    artifactId fabrikam-functions Это значение содержит имя JAR-файла, без номера версии.
    version 1.0-SNAPSHOT Выберите значение по умолчанию.
    package com.fabrikam Это значение определяет пакет Java для создаваемого кода функции. Используйте значение по умолчанию.
  3. Введите Y или нажмите клавишу ВВОД для подтверждения.

    Maven создаст файлы проекта в новой папке с именем artifactId, то есть fabrikam-functions в нашем примере.

  4. Перейдите в папку проекта:

    cd fabrikam-functions
    

    Эта папка содержит различные файлы проекта, в том числе файлы конфигурации local.settings.json и host.json. Файл local.settings.json может содержать секреты, скачанные из Azure, поэтому файл по умолчанию исключен из системы управления версиями в GITIGNORE-файле.

Проверка содержимого файла (дополнительно)

При необходимости можно сразу перейти к локальному запуску функции и просмотреть содержимое файла позже.

Function.java

Файл Function.java содержит метод run, получающий данные запроса в переменной request. Это запрос HttpRequestMessage, дополненный заметкой HttpTrigger, которая определяет поведение триггера.

package com.fabrikam;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;

import java.util.Optional;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/HttpExample". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/HttpExample
     * 2. curl "{your host}/api/HttpExample?name=HTTP%20Query"
     */
    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET, HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        final String query = request.getQueryParameters().get("name");
        final 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 {
            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
        }
    }
}

Сообщение-ответ создается API HttpResponseMessage.Builder.

pom.xml

Параметры ресурсов Azure, созданных для размещения приложения, определяются в элементе конфигурации подключаемого модуля с groupIdcom.microsoft.azure в созданном файле pom.xml. Например, элемент конфигурации ниже указывает развертыванию на основе Maven, что приложение-функцию необходимо создать в группе ресурсов java-functions-group в области westus. Само приложение-функция работает в Windows, размещенном в плане java-functions-app-service-plan, который по умолчанию является бессерверным планом потребления.

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-functions-maven-plugin</artifactId>
    <version>${azure.functions.maven.plugin.version}</version>
    <configuration>
        <!-- function app name -->
        <appName>${functionAppName}</appName>
        <!-- function app resource group -->
        <resourceGroup>java-functions-group</resourceGroup>
        <!-- function app service plan name -->
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <!-- function app region-->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values -->
        <region>westus</region>
        <!-- function pricingTier, default to be consumption if not specified -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values -->
        <!-- <pricingTier></pricingTier> -->
        <!-- Whether to disable application insights, default is false -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights-->
        <!-- <disableAppInsights></disableAppInsights> -->
        <runtime>
            <!-- runtime os, could be windows, linux or docker-->
            <os>windows</os>
            <javaVersion>8</javaVersion>
        </runtime>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    <executions>
        <execution>
            <id>package-functions</id>
            <goals>
                <goal>package</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Вы можете изменить эти параметры, чтобы управлять созданием ресурсов в Azure, например, изменив runtime.os с windows на linux перед первоначальным развертыванием. Полный список параметров, поддерживаемых подключаемым модулем Maven, см. в сведениях о конфигурации.

FunctionTest.java

Архетип также создает модульный тест для функции. При изменении функции для добавления привязок или добавления новых функций в проект необходимо также изменить тесты в файле FunctionTest.java.

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

  1. Выполните функцию, запустив локальное хост-приложение среды выполнения Функций Azure из папки LocalFunctionProj:

    mvn clean package
    mvn azure-functions:run
    

    Ближе к концу выходных данных появятся следующие строки:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    Примечание.

    Если результат HttpExample не похож на пример выше, скорее всего, вы запустили основное приложение из папки, отличной от корневой папки проекта. В этом случае остановите хост-приложение клавишами CTRL+C, перейдите в корневую папку проекта и снова выполните указанную выше команду.

  2. Скопируйте URL-адрес функции HttpExample из этих выходных данных в браузер и добавьте строку запроса ?name=<YOUR_NAME>, сформировав полный URL-адрес, например http://localhost:7071/api/HttpExample?name=Functions. Браузер отобразит сообщение, содержащее значение строки запроса. Терминал, в котором вы запустили проект, также выводит данные журнала при выполнении запросов.

  3. Когда все будет готово, нажмите клавиши Ctrl+C и выберите y, чтобы отключить хост-приложение функции.

Развертывание проекта функций в Azure

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

Совет

Чтобы создать приложение-функцию, работающее в Linux вместо Windows, измените элемент runtime.os в файле pom.xml с windows на linux. Работа Linux в плане потребления поддерживается в этих регионах. Приложения, работающие в Linux, и приложения, работающие под управлением ОС Windows, не могут находиться в одной группе ресурсов.

  1. Прежде чем выполнять развертывание, войдите в подписку Azure с помощью Azure CLI или Azure PowerShell.

    az login
    

    Чтобы войти в учетную запись Azure, выполните команду az login.

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

    mvn azure-functions:deploy
    

    Это создает в Azure такие ресурсы:

    • Группа ресурсов. С именем java-functions-group.
    • учетной записи хранения. Требуется для Функций Azure. Это имя создается случайным образом на основе требований к именованию учетных записей хранения.
    • План размещения. Бессерверное размещение для приложения-функции в регионе, который указан в параметре westus. Имя java-functions-app-service-plan.
    • Приложение-функция. Приложение-функция представляет собой минимальную единицу развертывания и выполнения для ваших функций. Имя создается случайным образом на основе artifactId, к которому добавляется случайное число.

    Развертывание упаковывает файлы проекта и развертывает их в новом приложении-функции из ZIP-файла Код выполняется из пакета развертывания в Azure.

Важно!

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

Вызов функции в Azure

Функция использует триггер HTTP, поэтому ее необходимо вызывать через HTTP-запрос по URL-адресу в браузере или с помощью такого средства, как curl.

Скопируйте полный URL-адрес вызова Invoke URL, показанный в выходных данных команды publish, в адресную строку браузера, добавив параметр запроса ?name=Functions. В браузере должны отображаться выходные данные, аналогичные данным при локальном запуске функции.

The output of the function run on Azure in a browser

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

func azure functionapp logstream <APP_NAME> 

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

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

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

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

az group delete --name java-functions-group

Следующие шаги