Partilhar via


Migrar aplicativos do Spring Boot para aplicativos de contêiner do Azure

Este guia descreve o que você deve estar ciente quando deseja migrar um aplicativo Spring Boot existente para ser executado em Aplicativos de Contêiner do Azure.

Pré-migração

Para garantir uma migração bem-sucedida, antes de começar, conclua as etapas de avaliação e inventário descritas nas seções a seguir.

Se você não puder atender a nenhum desses requisitos de pré-migração, consulte os seguintes guias complementares de migração:

  • Migrar aplicações JAR executáveis para contentores no Azure Kubernetes Service (orientação planeada)
  • Migrar aplicações JAR executáveis para Máquinas Virtuais do Azure (orientação planeada)

Inspecionar componentes do aplicativo

Identificar o estado local

Em ambientes PaaS, nenhum aplicativo tem a garantia de ser executado exatamente uma vez em um determinado momento. Mesmo se você configurar um aplicativo para ser executado em uma única instância, uma instância duplicada poderá ser criada nos seguintes casos:

  • O aplicativo deve ser realocado para um host físico devido a falha ou atualização do sistema.
  • O aplicativo está sendo atualizado.

Em qualquer um desses casos, a instância original permanece em execução até que a nova instância termine de iniciar. Esse padrão pode ter as seguintes implicações potencialmente significativas para seu aplicativo:

  • Não se pode garantir que nenhum singleton seja verdadeiramente solteiro.
  • Quaisquer dados não persistidos para armazenamento externo provavelmente serão perdidos mais cedo do que seriam em um único servidor físico ou VM.

Antes de migrar para os Aplicativos de Contêiner do Azure, verifique se o código não contém o estado local que não deve ser perdido ou duplicado. Se o estado local existir, altere o código para armazenar esse estado fora do aplicativo. Os aplicativos prontos para a nuvem geralmente armazenam o estado do aplicativo em locais como as seguintes opções:

Determinar se e como é que o sistema de ficheiros é utilizado

Encontre todas as instâncias em que seus serviços gravam e/ou leem do sistema de arquivos local. Identifique onde os arquivos temporários/de curto prazo são gravados e lidos e onde os arquivos de longa duração são gravados e lidos.

Os Aplicativos de Contêiner do Azure oferecem vários tipos de armazenamento. O armazenamento efêmero pode ler e gravar dados temporários e estar disponível para um contêiner ou réplica em execução. O Arquivo do Azure fornece armazenamento permanente e pode ser compartilhado entre vários contêineres. Para obter mais informações, consulte Usar montagens de armazenamento em Aplicativos de Contêiner do Azure.

Conteúdo estático só de leitura

Se o seu aplicativo atualmente serve conteúdo estático, você precisa de um local alternativo para ele. Talvez você queira considerar mover conteúdo estático para o Armazenamento de Blobs do Azure e adicionar a CDN do Azure para downloads extremamente rápidos globalmente. Para obter mais informações, consulte Hospedagem de site estático no Armazenamento do Azure e Guia de início rápido: integrar uma conta de armazenamento do Azure com a CDN do Azure.

Conteúdo estático publicado dinamicamente

Se o seu aplicativo der suporte a conteúdo estático, seja carregado ou gerado pelo próprio aplicativo, que permanece inalterado após sua criação, você pode integrar o Armazenamento de Blob do Azure e a CDN do Azure. Você também pode usar uma Função do Azure para gerenciar carregamentos e acionar atualizações de CDN quando necessário. Disponibilizamos uma implementação de exemplo que pode utilizar, em Uploading and CDN-preloading static content with Azure Functions (Carregamento e pré-carregamento da CDN de conteúdo estático com as Funções do Azure).

Determinar se algum dos serviços contém código específico do SO

Se seu aplicativo contiver qualquer código com dependências no sistema operacional host, você precisará refatorá-lo para remover essas dependências. Por exemplo, talvez seja necessário substituir qualquer uso de ou \ em caminhos do sistema de / arquivos por File.Separator ou Paths.get se seu aplicativo estiver sendo executado no Windows.

Mudar para uma plataforma suportada

Se você criar seu Dockerfile manualmente e implantar o aplicativo em contêineres nos Aplicativos de Contêiner do Azure, assumirá o controle total sobre sua implantação, incluindo versões JRE/JDK.

Para implantação a partir de artefatos, os Aplicativos de Contêiner do Azure também oferecem versões específicas do Java (8, 11, 17 e 21) e versões específicas dos componentes do Spring Boot e do Spring Cloud. Para garantir a compatibilidade, primeiro migre seu aplicativo para uma das versões suportadas do Java em seu ambiente atual e, em seguida, prossiga com as etapas de migração restantes. Certifique-se de que testa a configuração resultante na íntegra. Utilize a versão estável mais recente da sua distribuição Linux nestes testes.

Nota

Esta validação é particularmente importante se o seu servidor atual estiver a ser executado num JDK não suportado (como Oracle JDK ou IBM OpenJ9).

Para obter a sua versão atual do Java, inicie sessão no servidor de produção e execute o comando seguinte:

java -version

Para obter versões suportadas do Java, Spring Boot e Spring Cloud, bem como instruções para atualização, consulte Visão geral do Java on Azure Container Apps.

Determinar se a aplicação depende de trabalhos agendados

O aplicativo efêmero, como trabalhos cron Unix ou aplicativos de curta duração baseados na estrutura do Spring Batch, deve ser executado como um trabalho nos Aplicativos de Contêiner do Azure. Para obter mais informações, consulte Trabalhos em aplicativos de contêiner do Azure. Se o seu aplicativo for um aplicativo de longa execução e executar tarefas regularmente usando uma estrutura de agendamento, como Quartz ou Spring Batch, os Aplicativos de Contêiner do Azure poderão hospedar esse aplicativo. No entanto, o aplicativo deve lidar com o dimensionamento adequadamente para evitar condições de corrida em que as mesmas instâncias do aplicativo são executadas mais de uma vez por período agendado durante a expansão ou a atualização contínua.

Inventarie todas as tarefas agendadas em execução nos servidores de produção, dentro ou fora do código do aplicativo.

Identificar versões do Spring Boot

Examine as dependências de cada aplicativo que está sendo migrado para determinar sua versão do Spring Boot.

Maven

Em projetos Maven, a versão Spring Boot normalmente é encontrada no <parent> elemento do arquivo POM:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
Gradle

Em projetos Gradle, a versão Spring Boot normalmente será encontrada na plugins seção, como a versão do org.springframework.boot plugin:

plugins {
  id 'org.springframework.boot' version '3.3.3'
  id 'io.spring.dependency-management' version '1.1.6'
  id 'java'
}

Para quaisquer aplicativos que usem versões do Spring Boot anteriores ao 3.x, siga o guia de migração do Spring Boot 2.0 ou o Guia de migração do Spring Boot 3.0 para atualizá-los para uma versão suportada do Spring Boot. Para obter as versões suportadas, consulte as versões Spring Boot e Spring Cloud.

Identificar soluções de agregação de logs

Identifique quaisquer soluções de agregação de logs em uso pelos aplicativos que você está migrando. Você precisa definir as configurações de diagnóstico na migração para disponibilizar eventos registrados para consumo. Para obter mais informações, consulte a seção Garantir o registro em log do console e definir configurações de diagnóstico.

Identificar agentes de gerenciamento de desempenho de aplicativos (APM)

Identifique todos os agentes de gerenciamento de desempenho de aplicativos usados por seus aplicativos. Os Aplicativos de Contêineres do Azure não oferecem suporte interno para integração com APM. Você precisa preparar sua imagem de contêiner ou integrar a ferramenta APM diretamente em seu código. Se você quiser medir o desempenho do seu aplicativo, mas ainda não integrou nenhum APM, considere usar o Azure Application Insights. Para obter mais informações, consulte a seção Migração .

Inventariar os recursos externos

Identifique os recursos externos, tais como origens de dados, mediadores de mensagens JMS e URLs de outros serviços. Em aplicativos Spring Boot, você normalmente pode encontrar a configuração para esses recursos na pasta src/main/resources , em um arquivo normalmente chamado application.properties ou application.yml.

Bases de Dados

Para um aplicativo Spring Boot, as cadeias de conexão normalmente aparecem em arquivos de configuração quando dependem de um banco de dados externo. Eis um exemplo de um ficheiro application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=dbuser
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Eis um exemplo de um ficheiro application.yaml:

spring:
  data:
    mongodb:
      uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017

Consulte a documentação do Spring Data para obter mais cenários de configuração possíveis:

Agentes de mensagens JMS

Identifique o broker ou brokers em uso procurando no manifesto de compilação (normalmente, um arquivo pom.xml ou build.gradle ) as dependências relevantes.

Por exemplo, um aplicativo Spring Boot usando ActiveMQ normalmente conteria essa dependência em seu arquivo pom.xml :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

Os aplicativos Spring Boot que usam corretores comerciais normalmente contêm dependências diretamente nas bibliotecas de drivers JMS dos corretores. Eis um exemplo de um ficheiro build.gradle:

    dependencies {
      ...
      compile("com.ibm.mq:com.ibm.mq.allclient:9.4.0.5")
      ...
    }

Depois de identificar o corretor ou corretores em uso, encontre as configurações correspondentes. Em aplicativos Spring Boot, você normalmente pode encontrá-los nos arquivos application.properties e application.yml no diretório do aplicativo.

Aqui está um exemplo do ActiveMQ de um arquivo application.properties :

spring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true
spring.activemq.user=admin
spring.activemq.password=tryandguess

Para obter mais informações sobre a configuração do ActiveMQ, consulte a documentação de mensagens do Spring Boot.

Aqui está um exemplo do IBM MQ de um arquivo application.yaml :

ibm:
  mq:
    queueManager: qm1
    channel: dev.ORDERS
    connName: localhost(14)
    user: admin
    password: big$ecr3t

Para obter mais informações sobre a configuração do IBM MQ, consulte a documentação dos componentes do IBM MQ Spring.

Identificar caches externos

Identifique todos os caches externos em uso. Frequentemente, o Redis é usado via Spring Data Redis. Para obter informações sobre configuração, consulte a documentação do Spring Data Redis .

Determine se os dados da sessão estão sendo armazenados em cache via Spring Session pesquisando a respetiva configuração (em Java ou XML).

Fornecedores de identidade

Identifique o(s) provedor(es) de identidade usado(s) pelo seu aplicativo. Para obter informações sobre como os provedores de identidade podem ser configurados, consulte o seguinte:

  • Para a configuração do OAuth2, consulte a referência do Spring Security.
  • Para a configuração do Auth0 Spring Security, consulte a documentação do Auth0 Spring Security.
  • Para a configuração do PingFederate Spring Security, consulte as instruções do Auth0 PingFederate.

Identificar todos os clientes que dependem de uma porta não padrão

Os Aplicativos de Contêiner do Azure permitem que você exponha a porta de acordo com a configuração de recursos dos Aplicativos de Contêiner do Azure. Por exemplo, um aplicativo Spring Boot escuta a porta 8080 por padrão, mas pode ser definido com server.port ou variável SERVER_PORT de ambiente conforme necessário.

Todos os outros recursos externos

Não é viável para este guia documentar todas as dependências externas possíveis. Após a migração, é sua responsabilidade verificar se você pode satisfazer todas as dependências externas do seu aplicativo.

Fontes e segredos de configuração de inventário

Senhas de inventário e strings seguras

Procure cadeias de segredos e palavras-passe nas propriedades e nos ficheiros de configuração e nas variáveis ambientais nas implementações de produção. Em um aplicativo Spring Boot, você normalmente pode encontrar essas cadeias de caracteres no arquivo application.properties ou application.yml .

Inventariar certificados

Documente todos os certificados utilizados em pontos finais SSL públicos ou em comunicações com bases de dados de back-end e outros sistemas. Pode ver todos os certificados no servidor ou servidores de produção com o comando seguinte:

keytool -list -v -keystore <path to keystore>

Inspecionar a arquitetura de implantação

Documentar os requisitos de hardware para cada serviço

Documente as seguintes informações para o seu aplicativo Spring Boot:

  • O número de instâncias em execução.
  • O número de CPUs alocadas para cada instância.
  • A quantidade de RAM alocada para cada instância.

Geo-replicação/distribuição de documentos

Determine se as instâncias do aplicativo Spring Boot estão atualmente distribuídas entre várias regiões ou data centers. Documente os requisitos de tempo de atividade/SLA dos aplicativos que você está migrando.

Migração

Criar um ambiente de Aplicativos de Contêiner do Azure e implantar aplicativos

Provisione uma instância do Azure Container Apps em sua assinatura do Azure. Seu ambiente de hospedagem segura é criado junto com ele. Para obter mais informações, veja o Início Rápido: implementar a primeira aplicação de contentor com o portal do Azure.

Garantir o registro em log do console e definir as configurações de diagnóstico

Configure o registro em log para garantir que toda a saída seja roteada para o console em vez de para os arquivos.

Depois que um aplicativo é implantado nos Aplicativos de Contêiner do Azure, você pode configurar as opções de log em seu ambiente de Aplicativos de Contêiner para definir um ou mais destinos dos logs. Esses destinos podem incluir o Azure Monitor Log Analytics, o hub de eventos do Azure ou até mesmo outras soluções de monitoramento de terceiros. Você também tem a opção de desabilitar os dados de log e exibir logs somente em tempo de execução. Para obter instruções detalhadas de configuração, consulte Opções de armazenamento e monitoramento de log em Aplicativos de Contêiner do Azure.

Configurar armazenamento persistente

Se qualquer parte do seu aplicativo ler ou gravar no sistema de arquivos local, você precisará configurar o armazenamento persistente para substituir o sistema de arquivos local. Você pode especificar o caminho a ser montado no contêiner por meio das configurações do aplicativo e alinhá-lo com o caminho que seu aplicativo está usando. Para obter mais informações, consulte Usar montagens de armazenamento em Aplicativos de Contêiner do Azure.

Migrar todos os certificados para o KeyVault

As Aplicações de Contentores do Azure suportam a comunicação segura entre aplicações. Seu aplicativo não precisa gerenciar o processo de estabelecimento de comunicação segura. Você pode carregar o certificado privado para os Aplicativos de Contêiner do Azure ou usar um certificado gerenciado gratuito fornecido pelos Aplicativos de Contêiner do Azure. Usar o Azure Key Vault para gerenciar certificados é uma abordagem recomendada. Para obter mais informações, consulte Certificados em aplicativos de contêiner do Azure.

Configurar integrações de gerenciamento de desempenho de aplicativos (APM)

Quer a sua aplicação seja implementada a partir de uma imagem de contentor ou de código, as Aplicações de Contentor do Azure não interferem com a sua imagem ou código. Portanto, integrar seu aplicativo com uma ferramenta APM depende de suas próprias preferências e implementação.

Se seu aplicativo não estiver usando um APM com suporte, o Azure Application Insights é uma opção. Para obter mais informações, consulte Usando o Azure Monitor Application Insights com o Spring Boot.

Implementar a aplicação

Implante cada um dos microsserviços migrados (não incluindo o Spring Cloud Config Server e o Spring Cloud Service Registry), conforme descrito em Implantar aplicativos de contêiner do Azure com o comando az containerapp up.

Configurar segredos por serviço e configurações externalizadas

Você pode injetar definições de configuração em cada aplicativo como variáveis de ambiente. Você pode definir essas variáveis como entradas manuais ou como referências a segredos. Para obter mais informações sobre configuração, consulte Gerenciar variáveis de ambiente em Aplicativos de Contêiner do Azure.

Migrar e habilitar o provedor de identidade

Se algum dos aplicativos do Spring Cloud exigir autenticação ou autorização, verifique se eles estão configurados para acessar o provedor de identidade:

  • Se o provedor de identidade for o Microsoft Entra ID, nenhuma alteração deverá ser necessária.
  • Se o provedor de identidade for uma floresta do Ative Directory local, considere implementar uma solução de identidade híbrida com o Microsoft Entra ID. Para obter mais informações, consulte a documentação de identidade híbrida.
  • Se o provedor de identidade for outra solução local, como o PingFederate, consulte o tópico Instalação personalizada do Microsoft Entra Connect para configurar a federação com o Microsoft Entra ID. Como alternativa, considere usar o Spring Security para usar seu provedor de identidade por meio do OAuth2/OpenID Connect ou SAML.

Expor o aplicativo

Por padrão, um aplicativo implantado nos Aplicativos de Contêiner do Azure é acessível por meio de uma URL de aplicativo. Se o seu aplicativo for implantado no contexto de um ambiente gerenciado com sua própria rede virtual, você precisará determinar o nível de acessibilidade do aplicativo para permitir a entrada pública ou a entrada somente da sua rede virtual. Para obter mais informações, consulte Rede no ambiente de Aplicativos de Contêiner do Azure.

Pós-migração

Agora que você concluiu a migração, verifique se o aplicativo funciona como esperado. Em seguida, você pode tornar seu aplicativo mais nativo da nuvem usando as recomendações a seguir.

  • Considere habilitar seu aplicativo para trabalhar com o Spring Cloud Registry. Esse componente permite que seu aplicativo seja descoberto dinamicamente por outros aplicativos e clientes Spring implantados. Para obter mais informações, consulte Definir configurações para o componente Eureka Server for Spring em Aplicativos de Contêiner do Azure. Em seguida, modifique todos os clientes de aplicativo para usar o Spring Client Load Balancer. O Spring Client Load Balancer permite que o cliente obtenha endereços de todas as instâncias em execução do aplicativo e encontre uma instância que funcione se outra instância for corrompida ou deixar de responder. Para obter mais informações, consulte Spring Tips: Spring Cloud Load Balancer no Spring Blog.

  • Em vez de tornar seu aplicativo público, considere adicionar uma instância do Spring Cloud Gateway . O Spring Cloud Gateway fornece um único ponto de extremidade para todos os aplicativos implantados em seu ambiente do Azure Container Apps. Se um Spring Cloud Gateway já estiver implantado, verifique se uma regra de roteamento está configurada para rotear o tráfego para seu aplicativo recém-implantado.

  • Considere adicionar um Spring Cloud Config Server para gerenciar centralmente e controlar a configuração de versão para todos os seus aplicativos Spring Cloud. Primeiro, crie um repositório Git para hospedar a configuração e configure a instância do aplicativo para usá-la. Para obter mais informações, consulte Definir configurações para o componente Config Server for Spring em Aplicativos de Contêiner do Azure. Em seguida, migre sua configuração usando as seguintes etapas:

    1. Dentro do diretório src/main/resources do aplicativo, crie um arquivo bootstrap.yml com o seguinte conteúdo:

        spring:
          application:
            name: <your-application-name>
      
    2. No repositório Git de configuração, crie um <arquivo your-application-name>.yml , onde your-application-name é o mesmo que na etapa anterior. Mova as configurações de application.yml arquivo em src/main/resources para o novo arquivo que você criou. Se as configurações estavam anteriormente em um arquivo .properties , converta-as para YAML primeiro. Você pode encontrar ferramentas on-line ou plug-ins IntelliJ para realizar essa conversão.

    3. Crie um arquivo application.yml no diretório acima. Você pode usar esse arquivo para definir configurações e recursos que são compartilhados entre todos os aplicativos no ambiente de Aplicativos de Contêiner do Azure. Essas configurações geralmente incluem fontes de dados, configurações de registro, configuração do Spring Boot Actuator e outras.

    4. Confirme e envie essas alterações para o repositório Git.

    5. Remova o arquivo application.properties ou application.yml do aplicativo.

  • Considere adicionar o componente gerenciado Admin for Spring para habilitar uma interface administrativa para aplicativos Web do Spring Boot que expõem pontos de extremidade atuadores. Para obter mais informações, consulte Configurar o componente Spring Boot Admin em Aplicativos de Contêiner do Azure.

  • Considere adicionar um pipeline de implantação para implantações automáticas e consistentes. As instruções estão disponíveis para Pipelines do Azure e para Ações do GitHub.

  • Considere o uso de revisões de aplicativos de contêiner, rótulos de revisão e pesos de tráfego de entrada para habilitar a implantação azul-verde, o que permite testar alterações de código na produção antes que elas sejam disponibilizadas para alguns ou todos os usuários finais. Para obter mais informações, consulte Implantação azul-verde em aplicativos de contêiner do Azure.

  • Considere adicionar associações de serviço para conectar seu aplicativo a bancos de dados do Azure com suporte. Essas associações de serviço eliminariam a necessidade de fornecer informações de conexão, incluindo credenciais, aos seus aplicativos do Spring Cloud.

  • Considere habilitar a pilha de desenvolvimento Java para coletar métricas principais da JVM para seus aplicativos. Para obter mais informações, consulte Métricas Java para aplicativos Java em Aplicativos de Contêiner do Azure.

  • Considere adicionar regras de alerta e grupos de ação do Azure Monitor para detetar e resolver rapidamente condições aberrantes. Para obter mais informações, consulte Configurar alertas em Aplicativos de Contêiner do Azure.

  • Considere replicar seu aplicativo nas zonas da região habilitando a redundância de zona dos Aplicativos de Contêiner do Azure. O tráfego é balanceado e roteado automaticamente para réplicas se ocorrer uma interrupção de zona. Para obter mais informações sobre configurações redundantes, consulte Confiabilidade em aplicativos de contêiner do Azure.

  • Considere proteger os Aplicativos de Contêiner do Azure contra explorações e vulnerabilidades comuns usando o Firewall de Aplicativo Web no Gateway de Aplicativo. Para obter mais informações, consulte Proteger aplicativos de contêiner do Azure com o Web Application Firewall no Application Gateway.