Развертывание приложения Java с помощью Quarkus в приложениях контейнеров Azure

В этой статье показано, как быстро развернуть Red Hat Quarkus в приложениях контейнеров Microsoft Azure с простым приложением CRUD. Приложение — это список действий с интерфейсом JavaScript и конечной точкой REST. База данных Azure для PostgreSQL предоставляет уровень сохраняемости для приложения. В этой статье показано, как протестировать приложение локально и развернуть его в контейнерных приложениях.

Необходимые компоненты

  • Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.
  • Azure Cloud Shell имеет все эти предварительные требования. Дополнительные сведения см . в кратком руководстве по Azure Cloud Shell.
  • Если вы выполняете команды в этом руководстве локально (вместо использования Azure Cloud Shell), выполните следующие действия:
    • Подготовьте локальный компьютер с установленной операционной системой Unix (например, Ubuntu, macOS или подсистема Windows для Linux).
    • Установите реализацию Java SE версии 17 или более поздней (например, сборку Microsoft OpenJDK).
    • Установите Maven 3.5.0 или более поздней версии.
    • Установите Docker или Podman для операционной системы.
    • Установите jq.
    • Установите cURL.
    • Установите Quarkus CLI 3.4.1 или более поздней версии.
  • Azure CLI для сред, таких как Unix. В этой статье требуется только вариант Azure CLI Bash.
    • Установите Azure CLI и войдите в интерактивном режиме с помощью команды az login , чтобы войти в Azure перед использованием DefaultAzureCredential в коде.
      az login
      
    • Для этой статьи требуется Azure CLI версии не ниже 2.31.0. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

Создание проекта приложения

Используйте следующую команду, чтобы клонировать пример проекта Java для этой статьи. Пример размещен на сайте GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2023-09-13
cd aca-quarkus

Если появится сообщение об отключенном состоянии HEAD , это сообщение безопасно игнорировать. Так как в этой статье нет фиксаций, отсоединяемое состояние HEAD подходит.

Тестирование приложения Quarkus локально

В этом разделе показано, как локально запустить приложение.

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

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

quarkus dev

Вместо этого quarkus devможно выполнить то же самое с Помощью Maven mvn quarkus:dev.

Вам может быть предложено отправить данные телеметрии использования режима разработки Quarkus. Если да, ответьте, как вам нравится.

Режим разработки Quarkus обеспечивает динамическую перезагрузку с фоновой компиляцией. Если изменить любой аспект исходного кода приложения и обновить браузер, вы увидите изменения. Если возникают проблемы с компиляцией или развертыванием, вы ознакаете сообщение об ошибке. Режим разработки Quarkus прослушивает отладчик через порт 5005. Если вы хотите дождаться подключения отладчика перед выполнением, перед -Dsuspend выполнением Если отладчик вообще не нужен, можно использовать -Ddebug=false.

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

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO  [io.quarkus] (Quarkus Main Thread) quarkus-todo-demo-app-aca 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.0.Final) started in 14.826s. 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: [agroal, cdi, hibernate-orm, hibernate-validator, jdbc-postgresql, narayana-jta, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]

--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>

Нажмите клавишу W в терминале, где выполняется режим разработки Quarkus. Ключ w открывает веб-браузер по умолчанию для отображения Todo приложения. Вы также можете получить доступ к графическому интерфейсу http://localhost:8080 приложения напрямую.

Screenshot of the Todo sample app.

Попробуйте выбрать несколько элементов todo в списке дел. Пользовательский интерфейс указывает выделение с помощью стиля текста с зачеркнутыми элементами. Вы также можете добавить новый элемент todo в список дел, введя "Проверить приложения Todo" и нажав клавишу ВВОД, как показано на следующем снимке экрана:

Screenshot of the Todo sample app with new items added.

Доступ к API RESTful (/api) для получения всех элементов todo, которые хранятся в локальной базе данных PostgreSQL:

curl --verbose http://localhost:8080/api | jq .

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

* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 664
< Content-Type: application/json;charset=UTF-8
<
{ [664 bytes data]
100   664  100   664    0     0  13278      0 --:--:-- --:--:-- --:--:-- 15441
* Connection #0 to host localhost left intact
[
  {
    "id": 1,
    "title": "Introduction to Quarkus Todo App",
    "completed": false,
    "order": 0,
    "url": null
  },
  {
    "id": 2,
    "title": "Quarkus on Azure App Service",
    "completed": false,
    "order": 1,
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "id": 3,
    "title": "Quarkus on Azure Container Apps",
    "completed": false,
    "order": 2,
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "id": 4,
    "title": "Quarkus on Azure Functions",
    "completed": false,
    "order": 3,
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "id": 5,
    "title": "Verify Todo apps",
    "completed": false,
    "order": 5,
    "url": null
  }
]

Нажмите q, чтобы выйти из режима разработки Quarkus.

Создание ресурсов Azure для запуска приложения Quarkus

В этом разделе показано, как создать следующие ресурсы Azure для запуска примера приложения Quarkus:

  • Microsoft База данных Azure для PostgreSQL
  • Microsoft Реестр контейнеров Azure
  • Контейнеры приложений

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

export UNIQUE_VALUE=<your unique value, such as ejb091223>
export RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg
export LOCATION=<your desired Azure region for deploying your resources. For example, eastus>
export REGISTRY_NAME=${UNIQUE_VALUE}reg
export DB_SERVER_NAME=${UNIQUE_VALUE}db
export DB_PASSWORD=Secret123456
export ACA_ENV=${UNIQUE_VALUE}env
export ACA_NAME=${UNIQUE_VALUE}aca

Создание базы данных Azure для PostgreSQL

База данных Azure для PostgreSQL — это управляемая служба для запуска, управления и масштабирования высокодоступных баз данных PostgreSQL в облаке Azure. В этом разделе описано, как создать один сервер База данных Azure для PostgreSQL и подключиться к нему. Однако при выполнении действий в кратком руководстве необходимо использовать параметры в следующей таблице для настройки развертывания базы данных для примера приложения Quarkus. Замените переменные среды фактическими значениями при заполнении полей в портал Azure.

Параметр значение Описание
Группа ресурсов ${RESOURCE_GROUP_NAME} Выберите Создать. Развертывание создает эту новую группу ресурсов.
Имя сервера ${DB_SERVER_NAME} Это значение является частью имени узла для сервера базы данных.
Местонахождение ${LOCATION} Выберите расположение из раскрывающегося списка. Запишите расположение. Это же расположение необходимо использовать для других создаваемых ресурсов Azure.
Имя администратора quarkus В примере кода предполагается, что это значение.
Пароль ${DB_PASSWORD} Пароль должен содержать не менее 8 символов и не более 128 символов. Пароль должен содержать символы трех из следующих категорий: прописные латинские буквы, строчные латинские буквы, цифры (0–9) и другие символы (!, $, #, % и т. д.). Пароль не может содержать все или часть имени входа. Часть имени входа определяется как три или более последовательных буквенно-цифровых символов.

Учитывая эти подстановки значений, выполните действия, описанные в кратком руководстве. Создайте сервер База данных Azure для PostgreSQL с помощью портал Azure до раздела "Настройка правила брандмауэра". Затем в разделе "Настройка правила брандмауэра" обязательно выберите "Да для разрешения доступа к службам Azure", а затем нажмите кнопку "Сохранить". Если вы игнорируете это, приложение Quarkus не может получить доступ к базе данных и просто не удается запустить.

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

Создание базы данных Todo в База данных Azure для PostgreSQL

Созданный вами ранее сервер PostgreSQL пуст. У него нет базы данных, которую можно использовать с приложением Quarkus. Создайте базу данных с именем todo, выполнив следующую команду:

az postgres db create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name todo \
    --server-name ${DB_SERVER_NAME}

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

Если команда выполнена успешно, выходные данные выглядят примерно так:

{
  "charset": "UTF8",
  "collation": "English_United States.1252",
  "id": "/subscriptions/REDACTED/resourceGroups/ejb091223rg/providers/Microsoft.DBforPostgreSQL/servers/ejb091223db/databases/todo",
  "name": "todo",
  "resourceGroup": "ejb091223rg",
  "type": "Microsoft.DBforPostgreSQL/servers/databases"
}

Создание экземпляра Microsoft Реестр контейнеров Azure

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

Используйте команду az acr create для создания экземпляра реестра контейнеров. В следующем примере создается экземпляр реестра контейнеров с именем значения переменной ${REGISTRY_NAME}среды:

az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location ${LOCATION} \
    --name $REGISTRY_NAME \
    --sku Basic \
    --admin-enabled

Через некоторое время вы увидите выходные данные JSON, содержащие следующие строки:

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "<YOUR_RESOURCE_GROUP>",

Подключение docker экземпляру реестра контейнеров

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

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
echo $LOGIN_SERVER
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'username' \
    --output tsv)
echo $USER_NAME
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'passwords[0].value' \
    --output tsv)
echo $PASSWORD
docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

Если вы используете Podman вместо Docker, внесите необходимые изменения в команду.

Если вы успешно вошли в экземпляр реестра контейнеров, вы увидите Login Succeeded в конце выходных данных команды.

Создать среду

Среда в Azure Container Apps создает безопасную границу вокруг группы приложений-контейнеров. Развертываемые в одной среде приложения-контейнеры развертываются в одной виртуальной сети и записывают журналы в одну рабочую область Log Analytics. Используйте команду az containerapp env create для создания среды, как показано в следующем примере:

az containerapp env create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --name $ACA_ENV

Если вам будет предложено установить расширение, ответ Y.

Настройка собственной конфигурации облака

Как облачная технология, Quarkus предлагает возможность автоматически создавать образы контейнеров. Дополнительные сведения см. в разделе "Образы контейнеров". Затем разработчики могут развернуть образ приложения на целевой контейнерной платформе, например приложения контейнеров Azure.

Чтобы создать образ контейнера, используйте следующую команду, чтобы добавить container-image-jib расширение в локальный терминал:

quarkus ext add container-image-jib

Quarkus изменяет POM, чтобы обеспечить включение расширения в число <dependencies>. Если вам будет предложено установить что-то вызываемое JBang, ответьте да и разрешите его установке.

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

[SUCCESS] ✅  Extension io.quarkus:quarkus-container-image-jib has been installed

Чтобы проверить добавление расширений, можно запустить git diff и проверить выходные данные.

Как облачная технология Quarkus поддерживает понятие профилей конфигурации. Quarkus имеет следующие три встроенных профиля:

  • dev — активируется в режиме разработки.
  • test — активируется при выполнении тестов.
  • prod — Профиль по умолчанию, если он не запущен в режиме разработки или тестирования.

Quarkus поддерживает любое количество именованных профилей по мере необходимости.

Остальные действия, описанные в этом разделе, позволяют раскомментировать и настроить значения в файле src/main/resources/application.properties . Убедитесь, что все строки, начинающиеся с # %prod. , раскомментированы путем удаления ведущего #.

Префикс %prod. указывает, что эти свойства активны при выполнении prod в профиле. Дополнительные сведения о профилях конфигурации см. в документации Quarkus.

Настройка конфигурации базы данных

Добавьте следующие переменные конфигурации базы данных. Замените значения <DB_SERVER_NAME_VALUE><DB_PASSWORD_VALUE> и ${DB_PASSWORD} фактическими значениями ${DB_SERVER_NAME} переменных среды соответственно.

# Database configurations
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://<DB_SERVER_NAME_VALUE>.postgres.database.azure.com:5432/todo
%prod.quarkus.datasource.jdbc.driver=org.postgresql.Driver
%prod.quarkus.datasource.username=quarkus@<DB_SERVER_NAME_VALUE>
%prod.quarkus.datasource.password=<DB_PASSWORD_VALUE>
%prod.quarkus.hibernate-orm.database.generation=create
%prod.quarkus.hibernate-orm.sql-load-script=no-file

Как правило, вы не ожидаете, что данные, сохраненные в базе данных, удаляются и повторяются с примерами данных в рабочей среде. Именно поэтому можно увидеть, что схема указана такcreate, чтобы приложение только создает схемуquarkus.hibernate-orm.database.generation, если она не существует при первоначальном запуске. Кроме того, база данных не заполняется образцами данных, так как hibernate-orm.sql-load-script указана как no-file. Этот параметр отличается от того, когда вы запустили приложение локально в режиме разработки ранее. Значения по умолчанию в режиме quarkus.hibernate-orm.database.generation разработки для и соответственно, это означает, что приложение всегда удаляет и hibernate-orm.sql-load-scriptimport.sqldrop-and-create создает схему базы данных и загружает данные, определенные в import.sql. Файл import.sql — это удобное средство из Quarkus. Если файл src/main/resources/import.sql существует в jar-файле Quarkus, а значение hibernate-orm.sql-load-script свойства равноimport.sql, инструкции SQL DML в этом файле выполняются во время запуска приложения.

Настройка конфигурации образа контейнера

В качестве облачной технологии Quarkus поддерживает создание образов контейнеров OCI, совместимых с Docker и Podman. Добавьте следующие переменные образа контейнера. Замените значения <LOGIN_SERVER_VALUE><USER_NAME_VALUE> и ${USER_NAME} значения фактических значений ${LOGIN_SERVER} переменных среды соответственно.

# Container Image Build
%prod.quarkus.container-image.build=true
%prod.quarkus.container-image.registry=<LOGIN_SERVER_VALUE>
%prod.quarkus.container-image.group=<USER_NAME_VALUE>
%prod.quarkus.container-image.name=todo-quarkus-aca
%prod.quarkus.container-image.tag=1.0

Создание образа контейнера и отправка его в реестр контейнеров

Теперь используйте следующую команду для создания самого приложения. Эта команда использует расширение Jib для создания образа контейнера.

quarkus build --no-tests

Выходные данные должны заканчиваться BUILD SUCCESS.

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

docker images | grep todo-quarkus-aca
<LOGIN_SERVER_VALUE>/<USER_NAME_VALUE>/todo-quarkus-aca   1.0       0804dfd834fd   2 minutes ago   402MB

Отправьте образы контейнеров в реестр контейнеров с помощью следующей команды:

export TODO_QUARKUS_TAG=$(docker images | grep todo-quarkus-aca | head -n1 | cut -d " " -f1):1.0
echo ${TODO_QUARKUS_TAG}
docker push ${TODO_QUARKUS_TAG}

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

The push refers to repository [<LOGIN_SERVER_VALUE>/<USER_NAME_VALUE>/todo-quarkus-aca]
188a550fce3d: Pushed
4e3afea591e2: Pushed
1db0eba807a6: Pushed
c72d9ccda0b2: Pushed
d7819b8a2d18: Pushed
d0e5cba6b262: Pushed
e0bac91f0f10: Pushed
1.0: digest: sha256:f9ccb476e2388efa0dfdf817625a94f2247674148a69b7e4846793e63c8be994 size: 1789

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

az containerapp create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --image $TODO_QUARKUS_TAG \
    --environment $ACA_ENV \
    --registry-server $LOGIN_SERVER \
    --registry-username $USER_NAME \
    --registry-password $PASSWORD \
    --target-port 8080 \
    --ingress 'external'

Успешные выходные данные — это объект JSON, включая свойство "type": "Microsoft.App/containerApps".

Получите полный URL-адрес для доступа к приложению Todo с помощью следующей команды:

export QUARKUS_URL=https://$(az containerapp show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --query properties.configuration.ingress.fqdn -o tsv)
echo $QUARKUS_URL

Откройте новый веб-браузер со значением ${QUARKUS_URL}. Затем добавьте новый элемент todo с текстом Deployed the Todo app to Container Apps. Выберите этот элемент, чтобы пометить его как завершенный.

Screenshot of the Todo sample app running in Container Apps.

Доступ к API RESTful (/api) для получения всех элементов todo, хранящихся в База данных Azure для PostgreSQL, как показано в следующем примере:

curl --verbose -k ${QUARKUS_URL}/api | jq .

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

* Connected to <aca-name>.<random-id>.eastus.azurecontainerapps.io (20.231.235.79) port 443 (#0)
> GET /api HTTP/2
> Host: <aca-name>.<random-id>.eastus.azurecontainerapps.io
> user-agent: curl/7.88.1
> accept: */*
>
< HTTP/2 200
< content-length: 88
< content-type: application/json;charset=UTF-8
<
[
  {
    "id": 1,
    "title": "Deployed the Todo app to Container Apps",
    "completed": true,
    "order": 1,
    "url": null
  }
]

Убедитесь, что база данных обновлена с помощью Azure Cloud Shell

Откройте Azure Cloud Shell в портал Azure, выбрав значок Cloud Shell () рядом с полем поиска.

Выполните следующую команду локально и вставьте результат в Azure Cloud Shell:

echo psql --host=${DB_SERVER_NAME}.postgres.database.azure.com --port=5432 --username=quarkus@${DB_SERVER_NAME} --dbname=todo

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

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

select * from todo;

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

Screenshot of the query output as an ASCII table.

Введите \q , чтобы выйти из psql программы и вернуться в Cloud Shell.

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

Чтобы избежать расходов за использование Azure, необходимо удалить ненужные ресурсы. Чтобы удалить ненужные кластер, группу ресурсов, службу контейнеров, реестр контейнеров и все связанные с ними ресурсы, выполните команду az group delete.

git reset --hard
docker rmi ${TODO_QUARKUS_TAG}
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Вы также можете использовать для docker rmi удаления образов контейнеров, testcontainers созданных postgres в режиме разработки Quarkus.

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