Share via


Implantar um aplicativo Java com o Quarkus em um aplicativo de contêiner do Azure

Este artigo mostra como implantar rapidamente o Red Hat Quarkus em aplicativos de contêiner do Microsoft Azure com um aplicativo CRUD simples. O aplicativo é uma "lista de tarefas" com um front-end JavaScript e um ponto de extremidade REST. O Banco de Dados do Azure para PostgreSQL fornece a camada de persistência para o aplicativo. O artigo mostra como testar seu aplicativo localmente e implantá-lo em Aplicativos de Contêiner.

Pré-requisitos

  • Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
  • O Azure Cloud Shell tem todos esses pré-requisitos pré-instalados. Para saber mais, consulte Guia de início rápido para o Azure Cloud Shell.
  • Se você estiver executando os comandos neste guia localmente (em vez de usar o Azure Cloud Shell), conclua as seguintes etapas:
    • Prepare uma máquina local com o sistema operacional Unix-like instalado (por exemplo, Ubuntu, macOS ou Windows Subsystem for Linux).
    • Instale uma implementação Java SE versão 17 ou posterior (por exemplo, compilação Microsoft do OpenJDK).
    • Instale o Maven 3.5.0 ou superior.
    • Instale o Docker ou o Podman para o seu sistema operacional.
    • Instale o jq.
    • Instale o cURL.
    • Instale a CLI do Quarkus 3.4.1 ou superior.
  • CLI do Azure para ambientes Unix-like. Este artigo requer apenas a variante Bash da CLI do Azure.
    • Instale a CLI do Azure e entre interativamente com o comando az login para fazer logon no Azure antes de usar DefaultAzureCredential no código.
      az login
      
    • Este artigo requer pelo menos a versão 2.31.0 da CLI do Azure. Se você estiver usando o Azure Cloud Shell, a versão mais recente já está instalada.

Criar o projeto de aplicativo

Use o comando a seguir para clonar o projeto Java de exemplo para este artigo. O exemplo está no GitHub.

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

Se você vir uma mensagem sobre estar no estado HEAD desanexado, essa mensagem é segura para ignorar. Como este artigo não requer nenhuma confirmação, o estado HEAD destacado é apropriado.

Teste seu aplicativo Quarkus localmente

As etapas nesta seção mostram como executar o aplicativo localmente.

O Quarkus suporta o provisionamento automático de serviços não configurados no modo de desenvolvimento e teste. O Quarkus refere-se a esse recurso como serviços de desenvolvimento. Digamos que você inclua um recurso do Quarkus, como conectar-se a um serviço de banco de dados. Você deseja testar o aplicativo, mas ainda não configurou totalmente a conexão com um banco de dados real. O Quarkus inicia automaticamente uma versão de stub do serviço relevante e conecta seu aplicativo a ele. Para obter mais informações, consulte Visão geral dos serviços de desenvolvimento na documentação do Quarkus.

Verifique se seu ambiente de contêiner, Docker ou Podman, está em execução e use o seguinte comando para entrar no modo de desenvolvimento do Quarkus:

quarkus dev

Em vez de quarkus dev, você pode realizar a mesma coisa com o Maven usando mvn quarkus:dev.

Você pode ser perguntado se deseja enviar telemetria do seu uso do modo de desenvolvimento do Quarkus. Se sim, responda como quiser.

O modo de desenvolvimento do Quarkus permite a recarga ao vivo com compilação em segundo plano. Se você modificar qualquer aspeto do código-fonte do aplicativo e atualizar o navegador, poderá ver as alterações. Se houver algum problema com a compilação ou implantação, uma página de erro informará você. O modo de desenvolvimento do Quarkus escuta um depurador na porta 5005. Se você quiser esperar que o depurador anexe antes de executar, passe -Dsuspend a linha de comando. Se você não quiser o depurador, você pode usar -Ddebug=falseo .

A saída deve ser semelhante ao exemplo a seguir:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
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>

Pressione w no terminal onde o modo de desenvolvimento do Quarkus está sendo executado. A tecla w abre o navegador da Web padrão para mostrar o Todo aplicativo. Você também pode acessar a GUI do aplicativo diretamente http://localhost:8080 .

Screenshot of the Todo sample app.

Tente selecionar alguns itens de todo na lista de tarefas. A interface do usuário indica a seleção com um estilo de texto tachado. Você também pode adicionar um novo item todo à lista todo digitando Verify Todo apps e pressionando ENTER, conforme mostrado na captura de tela a seguir:

Screenshot of the Todo sample app with new items added.

Acesse a API RESTful (/api) para obter todos os itens que são armazenados no banco de dados PostgreSQL local:

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

A saída deve ser semelhante ao exemplo a seguir:

* 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
  }
]

Pressione q para sair do modo de desenvolvimento do Quarkus.

Criar os recursos do Azure para executar o aplicativo Quarkus

As etapas nesta seção mostram como criar os seguintes recursos do Azure para executar o aplicativo de exemplo Quarkus:

  • Banco de Dados do Microsoft Azure para PostgreSQL
  • Registro de contêiner do Microsoft Azure
  • Aplicativos de contêiner

Alguns desses recursos devem ter nomes exclusivos dentro do escopo da assinatura do Azure. Para garantir essa exclusividade, você pode usar as iniciais, sequência, data, padrão de sufixo. Para aplicar esse padrão, nomeie seus recursos listando suas iniciais, algum número de sequência, a data de hoje e algum tipo de sufixo específico de recurso - por exemplo, rg para "grupo de recursos". Use os seguintes comandos para definir algumas variáveis de ambiente a serem usadas posteriormente:

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

Criar uma Base de Dados do Azure para o PostgreSQL

O Banco de Dados do Azure para PostgreSQL é um serviço gerenciado para executar, gerenciar e dimensionar bancos de dados PostgreSQL altamente disponíveis na nuvem do Azure. Esta seção direciona você para um início rápido separado que mostra como criar um único Banco de Dados do Azure para o servidor PostgreSQL e conectar-se a ele. No entanto, ao seguir as etapas no início rápido, você precisa usar as configurações na tabela a seguir para personalizar a implantação do banco de dados para o aplicativo Quarkus de exemplo. Substitua as variáveis de ambiente por seus valores reais ao preencher os campos no portal do Azure.

Definição valor Description
Grupo de recursos ${RESOURCE_GROUP_NAME} Selecione Criar novo. A implantação cria esse novo grupo de recursos.
Nome do servidor ${DB_SERVER_NAME} Esse valor faz parte do nome do host para o servidor de banco de dados.
Localização ${LOCATION} Selecione um local na lista suspensa. Tome nota da localização. Você deve usar esse mesmo local para outros recursos do Azure criados.
Nome de utilizador de administrador Quarkus O código de exemplo assume esse valor.
Palavra-passe ${DB_PASSWORD} Sua senha deve ter no mínimo 8 caracteres e no máximo 128 caracteres. das três categorias seguintes: letras em maiúscula inglesas, letras em minúscula inglesas, números (0 - 9) e carateres não alfanuméricos (!, $, #, %, etc.). A sua palavra-passe não pode conter a totalidade ou parte do nome de início de sessão. Parte de um nome de entrada é definida como três ou mais caracteres alfanuméricos consecutivos.

Com essas substituições de valor em mente, siga as etapas em Guia de início rápido: criar um banco de dados do Azure para o servidor PostgreSQL usando o portal do Azure até a seção "Configurar uma regra de firewall". Em seguida, na seção "Configurar uma regra de firewall", selecione Sim para Permitir acesso aos serviços do Azure e selecione Salvar. Se você negligenciar isso, seu aplicativo Quarkus não poderá acessar o banco de dados e simplesmente não será iniciado.

Depois de concluir as etapas no início rápido através da seção "Configurar uma regra de firewall", incluindo a etapa para permitir o acesso aos serviços do Azure, volte a este artigo.

Criar um banco de dados Todo no Banco de Dados do Azure para PostgreSQL

O servidor PostgreSQL que você criou anteriormente está vazio. Ele não tem nenhum banco de dados que você possa usar com o aplicativo Quarkus. Crie um novo banco de dados chamado todo usando o seguinte comando:

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

Você deve usar todo como o nome do banco de dados porque o código de exemplo pressupõe esse nome do banco de dados.

Se o comando for bem-sucedido, a saída será semelhante ao exemplo a seguir:

{
  "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"
}

Criar uma instância do Registro de Contêiner do Microsoft Azure

Como o Quarkus é uma tecnologia nativa da nuvem, ele tem suporte interno para a criação de contêineres que são executados em aplicativos de contêiner. Aplicativos de contêiner depende inteiramente de ter um registro de contêiner a partir do qual ele encontra as imagens de contêiner para executar. As Aplicações de Contentor têm suporte incorporado para o Registo de Contentores do Azure.

Use o comando az acr create para criar a instância do Container Registry. O exemplo a seguir cria n instância do Registro de Contêiner nomeada com o valor da variável ${REGISTRY_NAME}de ambiente :

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

Após um curto período de tempo, você verá a saída JSON que contém as seguintes linhas:

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

Conecte seu docker à instância do Registro de Contêiner

Entre na instância do Registro de Contêiner. Iniciar sessão permite-lhe enviar uma imagem por push. Use os seguintes comandos para verificar a conexão:

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

Se você estiver usando o Podman em vez do Docker, faça as alterações necessárias no comando.

Se você entrou na instância do Registro de Contêiner com êxito, deverá ver Login Succeeded no final da saída do comando.

Criar um ambiente

Um ambiente em Aplicativos de Contêiner do Azure cria um limite seguro em torno de um grupo de aplicativos de contêiner. Os aplicativos de contêiner implantados no mesmo ambiente são implantados na mesma rede virtual e gravam logs no mesmo espaço de trabalho do Log Analytics. Use o comando az containerapp env create para criar um ambiente, conforme mostrado no exemplo a seguir:

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

Se lhe for pedido para instalar uma extensão, responda Y.

Personalizar a configuração nativa da nuvem

Como uma tecnologia nativa da nuvem, o Quarkus oferece a capacidade de gerar automaticamente imagens de contêiner. Para obter mais informações, consulte Imagens de contêiner. Os desenvolvedores podem implantar a imagem do aplicativo em uma plataforma conteinerizada de destino, por exemplo, Aplicativos de Contêiner do Azure.

Para gerar a imagem do contêiner, use o seguinte comando para adicionar a container-image-jib extensão no terminal local:

quarkus ext add container-image-jib

O Quarkus modifica o POM para garantir que a extensão seja incluída entre os <dependencies>. Se você for solicitado a instalar algo chamado JBang, responda sim e permita que ele seja instalado.

A saída deve ser semelhante ao exemplo a seguir:

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

Para verificar se as extensões foram adicionadas, você pode executar git diff e examinar a saída.

Como uma tecnologia nativa da nuvem, o Quarkus suporta a noção de perfis de configuração. O Quarkus tem os seguintes três perfis integrados:

  • dev - Ativado quando em modo de desenvolvimento.
  • test - Ativado durante a execução de testes.
  • prod - O perfil padrão quando não está em execução no modo de desenvolvimento ou teste.

O Quarkus suporta qualquer número de perfis nomeados, conforme necessário.

As etapas restantes nesta seção direcionam você para descomentar e personalizar valores no arquivo src/main/resources/application.properties . Certifique-se de que todas as linhas que começam com # %prod. não são comentadas, removendo a entrelinha #.

O %prod. prefixo indica que essas propriedades estão ativas quando executadas prod no perfil. Para obter mais informações sobre perfis de configuração, consulte a documentação do Quarkus.

Personalizar a configuração do banco de dados

Adicione as seguintes variáveis de configuração do banco de dados. Substitua os valores de e pelos valores reais das ${DB_SERVER_NAME} variáveis e <DB_PASSWORD_VALUE>${DB_PASSWORD} de <DB_SERVER_NAME_VALUE> ambiente, respectivamente.

# 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

Geralmente, você não espera que os dados persistentes no banco de dados sejam descartados e preenchidos novamente com os dados de exemplo em um ambiente de produção. É por isso que você pode ver que o esquema para quarkus.hibernate-orm.database.generation é especificado de create modo que o aplicativo só cria o esquema quando ele não existe na inicialização inicial. Além disso, o banco de dados não é pré-preenchido com nenhum dado de exemplo porque hibernate-orm.sql-load-script é especificado como no-file. Essa configuração é diferente de quando você executou o aplicativo localmente no modo de desenvolvimento anteriormente. Os valores padrão no modo de desenvolvimento para e são drop-and-create e respectivamente, o que significa que o aplicativo sempre descarta e recria o esquema de banco de dados e hibernate-orm.sql-load-scriptimport.sql carrega os dados definidos em import.sql.quarkus.hibernate-orm.database.generation O arquivo .sql importação é uma facilidade de conveniência do Quarkus. Se o arquivo src/main/resources/import.sql existir no jar do Quarkus e o hibernate-orm.sql-load-script valor da propriedade for import.sql, as instruções SQL DML nesse arquivo serão executadas no momento da inicialização do aplicativo.

Personalizar a configuração da imagem do contêiner

Como uma tecnologia nativa da nuvem, o Quarkus suporta a geração de imagens de contêiner OCI compatíveis com Docker e Podman. Adicione as seguintes variáveis de imagem de contêiner. Substitua os valores de <LOGIN_SERVER_VALUE> e pelos valores dos valores reais das ${LOGIN_SERVER} variáveis e ${USER_NAME}<USER_NAME_VALUE> ambiente, respectivamente.

# 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

Crie a imagem do contêiner e envie-a para o Registro do Contêiner

Agora, use o seguinte comando para criar o próprio aplicativo. Este comando usa a extensão Jib para criar a imagem do contêiner.

quarkus build --no-tests

A saída deve terminar com BUILD SUCCESS.

Você pode verificar se a imagem do contêiner também é gerada usando a linha de docker comando ou podman (CLI). A saída é semelhante ao exemplo a seguir:

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

Envie as imagens de contêiner para o Registro de contêiner usando o seguinte comando:

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}

O resultado deverá ter um aspeto semelhante ao seguinte exemplo:

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

Agora que você enviou a imagem do aplicativo para o Registro de Contêiner, use o seguinte comando para criar uma instância de Aplicativos de Contêiner para executar o aplicativo depois de extrair a imagem do Registro de Contêiner:

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'

A saída bem-sucedida é um objeto JSON que inclui a propriedade "type": "Microsoft.App/containerApps".

Obtenha uma url totalmente qualificada para acessar o aplicativo Todo usando o seguinte comando:

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

Abra um novo navegador da Web com o valor de ${QUARKUS_URL}. Em seguida, adicione um novo item todo com o texto Deployed the Todo app to Container Apps. Selecione este item para marcá-lo como concluído.

Screenshot of the Todo sample app running in Container Apps.

Acesse a API RESTful (/api) para obter todos os itens de todo armazenados no Banco de Dados do Azure para PostgreSQL, conforme mostrado no exemplo a seguir:

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

A saída deve ser semelhante ao exemplo a seguir:

* 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
  }
]

Verifique se o banco de dados foi atualizado usando o Azure Cloud Shell

Abra o Azure Cloud Shell no portal do Azure selecionando o ícone do Cloud Shell ( ) ao lado da caixa de pesquisa.

Execute o seguinte comando localmente e cole o resultado no Azure Cloud Shell:

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

Quando for solicitada a senha, use o valor usado quando criou o banco de dados.

Use a seguinte consulta para obter todos os itens de todo:

select * from todo;

A saída deve ser semelhante ao exemplo a seguir e deve incluir os mesmos itens na GUI do aplicativo Todo mostrada anteriormente:

Screenshot of the query output as an ASCII table.

Digite \q para sair do psql programa e retornar ao Cloud Shell.

Clean up resources (Limpar recursos)

Para evitar cobranças do Azure, você deve limpar recursos desnecessários. Quando o cluster não for mais necessário, use o comando az group delete para remover o grupo de recursos, o serviço de contêiner, o registro de contêiner e todos os recursos relacionados.

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

Você também pode querer usar docker rmi para excluir as postgres imagens e testcontainers contêiner geradas pelo modo de desenvolvimento do Quarkus.

Próximos passos