Visão geral do Java on Azure Container Apps

Os Aplicativos de Contêiner do Azure podem executar qualquer aplicativo Java em contêiner na nuvem, oferecendo opções flexíveis para como você implanta seus aplicativos.


Ao usar Aplicativos de Contêiner para seus aplicativos Java em contêineres, você obtém:

  • Dimensionamento econômico: quando você usa o plano de consumo, seus aplicativos Java podem ser dimensionados para zero. O dimensionamento quando há pouca demanda para seu aplicativo reduz automaticamente os custos de seus projetos.

  • Opções de implementação: O Azure Container Apps integra-se com o Buildpacks, o que permite implementar diretamente a partir de uma build Maven, usando ficheiros de artefacto ou com o seu próprio Dockerfile.

    • Implantação JAR (Pré-visualização): Pode-se implantar a sua aplicação de contêiner diretamente a partir de um ficheiro JAR.

    • Implantação do WAR (Visualização): você pode implantar seu aplicativo de contêiner diretamente de um arquivo WAR.

    • Suporte IDE: você pode implantar seu aplicativo de contêiner diretamente do IntelliJ.

  • Ajuste automático de memória (Preview): Container Apps otimiza a forma como a Java Virtual Machine (JVM) gerencia a memória, disponibilizando o máximo de memória possível para seus aplicativos Java.

  • Variáveis de ambiente de construção (Visualização): Pode-se configurar pares de chave-valor personalizados para controlar a construção de imagem Java a partir do código-fonte.

Este artigo descreve a informação que precisa de saber ao construir aplicações Java em Azure Container Apps.

Tipos de implementação

Executar aplicativos em contêineres geralmente significa que você precisa criar um Dockerfile para seu aplicativo, mas executar aplicativos Java em aplicativos de contêiner oferece algumas opções.

Tipo Descrição Usa Buildpacks Utiliza um Dockerfile
Compilação do código-fonte Você pode implantar diretamente em Container Apps a partir do seu código-fonte. Sim Não
Construção de artefactos Você pode criar uma compilação do Maven para implantar em aplicativos de contêiner Sim Não
Dockerfile Você pode criar seu Dockerfile manualmente e assumir o controle total sobre sua implantação. Não Sim

Nota

As implementações dos Buildpacks suportam as versões 8, 11, 17 e 21 do Java Development Kit (JDK).

Tipos de aplicação

Diferentes tipos de aplicações são implementados ou como uma aplicação de contentor individual ou como um trabalho de Container Apps. Use a tabela a seguir para ajudá-lo a decidir qual tipo de aplicativo é melhor para seu cenário.

Os exemplos listados nesta tabela não se destinam a ser exaustivos, mas a ajudá-lo a entender melhor a intenção de diferentes tipos de aplicativos.

Tipo Exemplos Implementar como...
Aplicações Web e endpoints de API Bota de primavera, Quarkus, Apache Tomcat e Jetty Um aplicativo de contêiner individual
Aplicativos de console, tarefas agendadas, executores de tarefas, trabalhos em lote Spark-Jobs, tarefas ETL, Tarefa Spring Batch, tarefa de pipeline Jenkins Um trabalho de aplicativos de contêiner

Depuração

Ao depurar o seu aplicativo Java em Container Apps, certifique-se de inspecionar o agente em processo do Java em busca de mensagens de depuração de fluxo de log e console.

Resolução de Problemas

Tenha em mente os seguintes itens ao desenvolver seus aplicativos Java:

  • Recursos padrão: por padrão, um aplicativo tem meia CPU e 1 GB disponível.

  • Processos sem estado: À medida que o seu aplicativo de contêiner escala para cima e para baixo, novos processos são criados e encerrados. Certifique-se de planejar com antecedência para gravar dados no armazenamento compartilhado, como bancos de dados e compartilhamentos de sistema de arquivos. Não espere que nenhum arquivo gravado diretamente no sistema de arquivos do contêiner esteja disponível para qualquer outro contêiner.

  • Dimensionar para zero é o padrão: se você precisar garantir que uma ou mais instâncias do seu aplicativo estejam em execução contínua, certifique-se de definir uma regra de escala para melhor atender às suas necessidades.

  • Comportamento inesperado: se o aplicativo de contêiner falhar ao criar, iniciar ou executar, verifique se o caminho do artefato está definido corretamente no contêiner.

  • Problemas de suporte do Buildpack: Se o seu Buildpack não suportar dependências ou a versão do Java que você precisa, crie seu próprio Dockerfile para implantar seu aplicativo. Você pode exibir um Dockerfile de exemplo para referência.

  • Sinais SIGTERM e SIGINT: Por padrão, a JVM manipula os sinais SIGTERM e SIGINT e não os encaminha para a aplicação, a menos que você intercepte esses sinais e os manipule de acordo no seu aplicativo. Container Apps usa tanto SIGTERM como SIGINT para controlo de processos. Se não capturares estes sinais e a tua aplicação terminar inesperadamente, poderás perdê-los, a menos que os guardes em armazenamento.

  • Acesso a imagens de contentor: se utilizar a implementação de artefacto ou código-fonte em combinação com o registo padrão, não terá acesso direto às imagens de contentor.

Monitorização

Todas as ferramentas de observabilidade padrão funcionam com sua aplicação Java. Ao construir seus aplicativos Java para serem executados em Aplicativos de Contêiner, lembre-se dos seguintes itens:

  • Métricas: as métricas da Java Virtual Machine (JVM) são críticas para monitorar a integridade e o desempenho de seus aplicativos Java. Os dados recolhidos incluem insights sobre o uso de memória, recolha de lixo e contagem de threads da sua JVM. Você pode verificar métricas para ajudar a garantir a integridade e a estabilidade de seus aplicativos.

  • Registo: envie mensagens de aplicação e de erro para stdout ou stderror para que elas possam aparecer no fluxo de registos. Evite registrar diretamente no sistema de arquivos do contêiner, como é comum ao usar serviços de log populares.

  • Configuração de monitoramento de desempenho: implante serviços de monitoramento de desempenho como um contêiner separado em seu ambiente de Aplicativos de Contêiner para que ele possa acessar diretamente seu aplicativo.

Diagnóstico

Os Aplicativos de Contêiner do Azure oferecem ferramentas de diagnóstico internas exclusivamente para desenvolvedores Java. Esse suporte simplifica a depuração e a solução de problemas de aplicativos Java em execução nos Aplicativos de Contêiner do Azure para maior eficiência e facilidade.

  • Nível de logger dinâmico: Permite-lhe aceder e verificar diferentes níveis de detalhes dos registos sem alterações no código ou obrigação a reiniciar a aplicação. Você pode visualizar Definir nível de registrador dinâmico para referência.

Dimensionamento

Se você precisar garantir que as solicitações de seus aplicativos front-end cheguem ao mesmo servidor ou que seu aplicativo front-end esteja dividido entre vários contêineres, certifique-se de habilitar sessões adesivas.

Segurança

O runtime Container Apps termina o TLS por si dentro do seu ambiente Container Apps.

Gestão da memória

Para ajudar a otimizar a gestão de memória na sua aplicação Java, certifique-se de que o ajuste de memória da JVM está ativado na sua aplicação.

A memória é medida em gibibytes (GiB) e pares de núcleos da CPU. A tabela a seguir mostra o intervalo de recursos disponíveis para seu aplicativo de contêiner.

limiar Núcleos de CPU Memória em Gibibytes (GiB)
Mínimo 0.25 0.5
Máximo 4 8

Os núcleos estão disponíveis em incrementos de 0,25 núcleos, com memória disponível numa proporção de 2:1. Por exemplo, se precisar de 1,25 núcleos, tem 2,5 GiB de memória disponível para a sua aplicação container.

Nota

Para aplicativos que usam JDK versões 9 e inferiores, certifique-se de definir configurações de memória JVM personalizadas para corresponder à alocação de memória nos Aplicativos de Contêiner do Azure.

Suporte a componentes Java

Os Aplicativos de Contêiner do Azure oferecem suporte para os seguintes componentes Java como serviços gerenciados:

  • Eureka Server for Spring: O registro e a descoberta de serviços são requisitos fundamentais para manter uma lista de instâncias de aplicativos ativos. A sua aplicação utiliza esta lista para encaminhamento e balanceamento de carga de pedidos de entrada. Configurar cada cliente manualmente leva tempo e introduz a possibilidade de erro humano. O Eureka Server simplifica a gestão da descoberta de serviços, funcionando como um registo de serviços onde os microsserviços podem registar-se e descobrir outros serviços dentro do sistema.

  • Config Server for Spring: O Config Server fornece gerenciamento de configuração externo centralizado para sistemas distribuídos. Este componente foi concebido para responder aos desafios de gerir definições de configuração em múltiplos microserviços num ambiente cloud-native.

  • Gateway for Spring: Gateway for Spring oferece uma forma eficiente e poderosa de encaminhar, gerir e tratar pedidos de API como parte de uma arquitetura de microserviços. Serve como um API Gateway que encaminha pedidos externos para diferentes serviços, adicionando funcionalidades como filtragem e balanceamento de carga.

  • Admin for Spring: O componente gerido Admin for Spring fornece uma interface administrativa concebida para aplicações web Spring Boot que têm endpoints atuadores. Um componente gerenciado fornece integração e gerenciamento ao seu aplicativo de contêiner, permitindo que você vincule seu aplicativo de contêiner ao componente Admin for Spring.