Compartilhar via


Migrar aplicativos Spring Boot para Aplicativos de Contêiner do Azure

Este guia descreve as informações que você deve ter em mente ao migrar um aplicativo Spring Boot existente para executar em Aplicativos de Contêiner do Azure.

Pré-migração

Antes de tudo, para garantir uma migração bem-sucedida, conclua as etapas de avaliação e de inventário descritas nas seções a seguir.

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

  • Migrar aplicativos JAR executáveis para contêineres no Serviço de Kubernetes do Azure (diretrizes planejadas)
  • Migrar aplicativos JAR executáveis para Máquinas Virtuais do Azure (diretrizes planejadas)

Inspecionar os componentes de aplicativo

Identificar o estado local

Em ambientes PaaS, não é garantido que nenhum aplicativo esteja sendo executado exatamente uma vez em determinado momento. Mesmo quando você configurar um aplicativo para ser executado em uma só instância, uma instância duplicada poderá ser criada nos seguintes casos:

  • O aplicativo precisa ser relocado para um host físico devido a uma falha ou uma 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 inicialização da nova instância seja concluída. Esse padrão pode ter as seguintes implicações potencialmente significativas para o aplicativo:

  • Não é possível garantir que nenhum singleton seja verdadeiramente único.
  • Todos os dados que não foram persistidos no armazenamento externo provavelmente serão perdidos muito antes do que seriam em um servidor físico ou uma VM individual.

Antes de fazer a migração 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 nem duplicado. Se o estado local existir, altere o código para armazenar esse estado fora do aplicativo. Os aplicativos prontos para a nuvem normalmente armazenam o estado do aplicativo em localizações como as seguintes opções:

Determinar se e como o sistema de arquivos é usado

Localize instâncias nas quais os serviços gravem e/ou leiam do sistema de arquivos local. Identifique onde os arquivos de curto prazo/temporários 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 temporário 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, confira Usar montagens de armazenamento nos Aplicativos de Contêiner do Azure.

Conteúdo estático somente leitura

Se seu aplicativo estiver servindo conteúdo estático no momento, você precisará de um local alternativo para ele. Talvez você queira considerar a movimentação de conteúdo estático para o Armazenamento de Blobs do Azure e a adição da CDN do Azure para downloads extremamente rápidos, globalmente. Para obter mais informações, confira Hospedagem de site estático no Armazenamento do Microsoft Azure e Início rápido: Integrar uma conta de armazenamento do Azure à CDN do Azure.

Conteúdo estático publicado dinamicamente

Se o aplicativo oferecer suporte a conteúdo estático, seja carregado ou gerado pelo próprio aplicativo, que permanece inalterado após sua criação, você poderá integrar o Armazenamento de Blobs do Azure e a CDN do Azure. Você também pode usar o Azure Function para gerenciar uploads e disparar atualizações de CDN quando necessário. Fornecemos uma implementação de exemplo para seu uso em Carregar conteúdo estático e fazer o pré-carregamento desse conteúdo pela CDN com o Azure Functions.

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

Se seu aplicativo contiver qualquer código com dependências do sistema operacional do 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 com File.Separator ou Paths.get se o aplicativo estiver em execução no Windows.

Alternar para uma plataforma compatível

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

Para implantação 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 Spring Boot e Spring Cloud. Para garantir a compatibilidade, primeiro migre o aplicativo para uma das versões com suporte do Java no ambiente atual e depois continue com as etapas de migração restantes. É necessário testar completamente a configuração resultante. Use a versão estável mais recente da sua distribuição do Linux nesses testes.

Observação

Essa validação é especialmente importante se o servidor atual estiver sendo executado em um JDK não compatível (como Oracle JDK ou IBM OpenJ9).

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

java -version

Para obter versões compatíveis do Java, Spring Boot e Spring Cloud, bem como instruções para atualização, confira Visão geral do Java nos Aplicativos de Contêiner do Azure.

Determinar se o aplicativo depende de trabalhos agendados

Aplicativos efêmeros, como trabalhos cron do Unix ou aplicativos de curta duração baseados na estrutura do Spring Batch, devem ser executados como um trabalho nos Aplicativos de Contêiner do Azure. Para obter mais informações, confira Trabalhos em Aplicativos de Contêiner do Azure. Se seu aplicativo for de longa execução e executar tarefas regularmente usando uma estrutura de agendamento, como o Quartz ou o Spring Batch, os Aplicativos de Contêiner do Azure poderão hospedar esse aplicativo. No entanto, o aplicativo deve gerenciar o dimensionamento de forma adequada 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 sem interrupção.

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

Identificar as versões do Spring Boot

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

Maven

Em projetos Maven, a versão do Spring Boot normalmente se encontra no elemento <parent> 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 do Spring Boot normalmente se encontrará na seção plugins, como a versão do plug-in org.springframework.boot:

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

Para todos os aplicativos que usam versões do Spring Boot anteriores à 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 compatível do Spring Boot. Para obter as versões compatíveis, confira Versões do Spring Boot e Spring Cloud.

Identificar as soluções de agregação de log

Identifique as soluções de agregação de log 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, confira a seção Verificar o registro em log de console e definir as configurações de diagnóstico.

Identificar os agentes de APM (gerenciamento de desempenho de aplicativo)

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

Recursos externos de inventário

Identifique recursos externos, como fontes de dados, agentes de mensagens JMS e URLs de outros serviços. Em aplicativos Spring Boot, normalmente é possível encontrar a configuração desses recursos na pasta src/main/resources, em um arquivo geralmente chamado de application.properties ou de application.yml.

Bancos de dados

Para um aplicativo Spring Boot, as cadeias de conexão geralmente aparecem em arquivos de configuração quando dependem de um banco de dados externo. Este é um exemplo de um arquivo application.properties:

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

Este é um exemplo de um arquivo application.yaml:

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

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

Agentes de mensagem JMS

Identifique os agentes em uso examinando o manifesto de build (normalmente, um arquivo pom.xml ou um build.gradle) para as dependências relevantes.

Por exemplo, um aplicativo Spring Boot que usa o ActiveMQ normalmente conteria essa dependência no arquivo pom.xml:

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

Os aplicativos Spring Boot que usam agentes comerciais normalmente contêm dependências diretamente nas bibliotecas de driver JMS dos agentes. Este é um exemplo de um arquivo build.gradle:

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

Depois de identificar os agentes em uso, localize as configurações correspondentes. Em aplicativos Spring Boot, normalmente é possível encontrá-las nos arquivos application.properties e application.yml no diretório de aplicativo.

Observação

A Microsoft recomenda usar o fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento, como bancos de dados, caches, mensagens ou serviços de IA, requer um grau muito alto de confiança no aplicativo e traz riscos não presentes em outros fluxos. Use esse fluxo somente quando opções mais seguras, como identidades gerenciadas para conexões sem senha ou sem chave, não forem viáveis. Para operações de computador local, prefira identidades de usuário para conexões sem senha ou sem chave.

Aqui está um exemplo do ActiveMQ em 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=<password>

Para obter mais informações sobre o ActiveMQ, confira a Documentação de mensagens do Spring Boot.

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

ibm:
  mq:
    queueManager: qm1
    channel: dev.ORDERS
    connName: localhost(14)
    user: admin
    password: <password>

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

Identificar os caches externos

Identifique os caches externos em uso. Frequentemente, o Redis é usado por meio do Spring Data Redis. Para obter informações de configuração, confira a Documentação do Spring Data Redis.

Determine se os dados de sessão estão sendo armazenados em cache por meio do Spring Session pesquisando a respectiva configuração (no Java ou no XML).

Provedores de identidade

Identifique os provedores de identidade usados pelo aplicativo. Para obter informações sobre como os provedores de identidade podem ser configurados, confira o seguinte:

Identificar qualquer cliente que dependa 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 uma variável de ambiente SERVER_PORT, conforme necessário.

Todos os outros recursos externos

É inviável que este guia documente todas as dependências externas possíveis. Após a migração, é sua responsabilidade verificar se você pode satisfazer todas as dependência externas do aplicativo.

Inventariar as fontes e os segredos de configuração

Inventariar as senhas e proteger as cadeia de caracteres

Verifique todas as propriedades e os arquivos de configuração, assim como as variáveis de ambiente, nas implantações de produção em busca de senhas e cadeias de caracteres secretas. Em um aplicativo Spring Boot, normalmente é possível encontrar essas cadeias de caracteres no arquivo application.properties ou no application.yml.

Inventariar os certificados

Documente todos os certificados usados para pontos de extremidade SSL públicos ou comunicação com bancos de dados de back-end e outros sistemas. Você pode exibir todos os certificados nos servidores de produção executando o seguinte comando:

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 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.

Documentar a replicação geográfica/distribuição

Determine se as instâncias do aplicativo Spring Boot estão atualmente distribuídas entre várias regiões ou datacenters. Documente os requisitos de tempo de atividade/SLA (Contrato de Nível de Serviço) para os aplicativos que você está migrando.

Migração

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

Provisione uma instância de Aplicativos de Contêiner do Azure na assinatura do Azure. Seu ambiente de hospedagem seguro é criado junto com ele. Para obter mais informações, confira Guia de Início Rápido: implantar seu primeiro aplicativo de contêiner usando o portal do Azure.

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

Configure o log para garantir que toda a saída seja roteada para o console e não para arquivos.

Depois que um aplicativo é implantado nos Aplicativos de Contêiner do Azure, você pode configurar as opções de log no ambiente de Aplicativos de Contêiner para definir um ou mais destinos dos logs. Esses destinos podem incluir o Log Analytics do Azure Monitor, 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 dados de log e exibir os logs somente em runtime. Para obter instruções de configuração detalhadas, confira Opções de armazenamento e monitoramento de log nos Aplicativos de Contêiner do Azure.

Configurar um armazenamento persistente

Se qualquer parte do 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 para montar 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, confira Usar montagens de armazenamento nos Aplicativos de Contêiner do Azure.

Migrar todos os certificados para o Key Vault

Os Aplicativos de Contêiner do Azure têm suporte para comunicação segura entre aplicativos. Seu aplicativo não precisa gerenciar o processo de estabelecer comunicação segura. Você pode carregar o certificado privado nos 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, confira Certificados nos Aplicativos de Contêiner do Azure.

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

Se seu aplicativo for implantado de uma imagem de contêiner ou de código, os Aplicativos de Contêiner do Azure não interferirão em sua imagem ou código. Portanto, a integração do aplicativo a uma ferramenta APM depende de suas próprias preferências e implementação.

Se o aplicativo não estiver usando um APM compatível, considere usar o Azure Application Insights. Para obter mais informações, consulte Usar o Application Insights do Azure Monitor com o Spring Boot.

Implantar o aplicativo

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 os segredos por serviço e definir as configurações externas

Você pode injetar as 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 a configuração, confira Gerenciar variáveis de ambiente nos Aplicativos de Contêiner do Azure.

Migrar e habilitar o provedor de identidade

Se qualquer um dos aplicativos Spring Cloud requerer 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 deve ser necessária.
  • Se o provedor de identidade for uma floresta local do Active Directory, considere implementar uma solução de identidade híbrida com o Microsoft Entra ID. Para obter mais informações, confira a Documentação sobre identidade híbrida.
  • Se o provedor de identidade for outra solução local, como o PingFederate, confira o tópico Instalação personalizada do Microsoft Entra Connect para configurar a federação com o Microsoft Entra ID. Como alternativa, considere o Spring Security para o uso do provedor de identidade por meio do OAuth2/OpenID Connect ou do SAML.

Expor o aplicativo

Por padrão, um aplicativo implantado em Aplicativos de Contêiner do Azure pode ser acessado por meio de uma URL do aplicativo. Se o 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 de sua rede virtual. Para obter mais informações, consulteRede no ambiente de Aplicativos de Contêiner do Azure.

Após a migração

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

  • Considere a possibilidade de habilitar seu aplicativo para que ele funcione com o Registro do Spring Cloud. Esse componente permite que o aplicativo seja descoberto dinamicamente por outros aplicativos e clientes Spring implantados. Para obter mais informações, confira Definir configurações para o componente Eureka Server for Spring nos Aplicativos de Contêiner do Azure. Em seguida, modifique todos os clientes do aplicativo para que usem 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 não responder. Para obter mais informações, confira Dicas do Spring: Spring Cloud Load Balancer no Blog do Spring.

  • Em vez de tornar seu aplicativo público, considere a possibilidade de 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 de Aplicativos de Contêiner do Azure. Se um Spring Cloud Gateway já estiver implantado, verifique se uma regra de roteamento está configurada para rotear o tráfego para o aplicativo recém-implantado.

  • Considere a possibilidade de adicionar um Config Server do Spring Cloud para gerenciar de maneira centralizada a configuração e fazer o controle de versão dela para todos os aplicativos do 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, confira Definir configurações para o componente Config Server for Spring nos 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 do Git de configuração, crie um arquivo <nome-do-aplicativo>.yml, em que your-application-name é o mesmo que na etapa anterior. Mova as configurações do arquivo application.yml em src/main/resources para o novo arquivo que você acabou de criar. Se as configurações estavam antes em um arquivo .properties, elas precisam ser convertidas para YAML primeiro. Você pode encontrar ferramentas online 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 as configurações e os recursos que serão compartilhados entre todos os aplicativos no ambiente dos Aplicativos de Contêiner do Azure. Essas configurações normalmente incluem fontes de dados, configurações de registro em log, configuração do acionador do Spring Boot, entre outros.

    4. Faça commit dessas alterações e efetue push delas 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 Spring Boot que expõem pontos de extremidade do atuador. Para obter mais informações, confira Configurar o componente Spring Boot Admin nos 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 o Azure Pipelines e para o GitHub Actions.

  • Considere a possibilidade de usar 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, confira Implantação azul-verde nos Aplicativos de Contêiner do Azure.

  • Considere adicionar associações de serviço para conectar o 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, para os aplicativos Spring Cloud.

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

  • Considere adicionar as regras de alerta e os grupos de ações do Azure Monitor para detectar e abordar as condições anormais rapidamente. Para obter mais informações, confira Configurar alertas nos Aplicativos de Contêiner do Azure.

  • Considere replicar seu aplicativo entre as zonas da região, habilitando a redundância de zona dos Aplicativos de Contêiner do Azure. O tráfego tem balanceamento de carga e é roteado automaticamente para réplicas se ocorre uma interrupção de zona. Para obter mais informações sobre configurações redundantes, confira Confiabilidade nos Aplicativos de Contêiner do Azure.

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