Migrar aplicativos do Spring Boot para o Azure Spring Apps

Observação

Azure Spring Apps é o novo nome do serviço Azure Spring Cloud. Embora o serviço tenha um novo nome, você verá o nome antigo em alguns locais por um tempo enquanto trabalhamos para atualizar ativos como capturas de tela, vídeos e diagramas.

Este guia descreve o que você deve saber quando quiser migrar um aplicativo Spring Boot existente para ser executado nos Aplicativos Spring 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 permanecerá em execução até que a nova instância tenha terminado a inicialização. Isso tem 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 migrar para os Aplicativos Spring do Azure, verifique se seu código não contém 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 normalmente armazenam o estado do aplicativo em localizações como as seguintes:

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.

Observação

Os Aplicativos Spring do Azure fornecem 5 GB de armazenamento temporário por instância do Azure Spring Apps, montados no /tmp. Se os arquivos temporários forem gravados acima desse limite ou em uma localização diferente, alterações de código serão necessárias.

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 permitir conteúdo estático que é carregado/produzido pelo aplicativo, mas não puder ser alterado após sua criação, você poderá usar o Armazenamento de Blobs do Azure e a CDN do Azure, conforme descrito acima, com uma Função do Azure para lidar com uploads e atualização de CDN. 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.

Alternar para uma plataforma compatível

Os Aplicativos Spring do Azure oferecem versões específicas do Java e versões específicas do Spring Boot e do 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 com suporte do Java, Spring Boot e Spring Cloud, bem como instruções para atualização, consulte Preparar um aplicativo para implantação no Azure Spring Apps.

Determinar se o aplicativo depende de trabalhos agendados

Trabalhos agendados, como tarefas do Quartz Scheduler ou trabalhos do Unix cron, NÃO devem ser usados com os Aplicativos do Azure Spring. Os Aplicativos Spring do Azure não impedirão que você implante um aplicativo contendo tarefas agendadas internamente. No entanto, se o aplicativo for escalado horizontalmente, um mesmo trabalho agendado poderá ser executado mais de uma vez por período agendado. Essa situação pode levar a consequências indesejadas.

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>2.7.10</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 '2.7.10'
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
  id 'java'
}

Para os aplicativos que usam o Spring Boot 1.x, siga o Guia de migração do Spring Boot 2.0 para atualizá-los para uma versão do Spring Boot com suporte. Para obter versões com suporte, consulte a seção Spring Boot e versões Spring Cloud de Preparar um aplicativo para implantação no Azure Spring Apps.

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

Identifique quaisquer 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 os eventos registrados para consumo. Para obter mais informações, consulte a seção Garantir o log do console e definir configurações de diagnóstico.

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

Identifique quaisquer agentes de monitoramento de desempenho de aplicativos em uso com seus aplicativos. O Azure Spring Apps oferece suporte à integração com Application Insights, New Relic, Elastic APM, Dynatrace e AppDynamics. Se o aplicativo estiver usando um APM com suporte, configure a integração na migração. Se o aplicativo não estiver usando um APM compatível, considere usar o Application Insights. Para obter mais informações, consulte 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/directory, em um arquivo geralmente chamado de application.properties ou de application.yml.

Bancos de dados

Para qualquer banco de dados SQL, identifique a cadeia de conexão.

Para um aplicativo Spring Boot, as cadeias de conexão normalmente aparecem em arquivos de configuração.

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 brokers comerciais normalmente contêm dependências diretamente nas bibliotecas de drivers JMS dos brokers. Este é um exemplo de um arquivo build.gradle:

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

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.

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=tryandguess

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: big$ecr3t

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 Primavera do Azure sobrescrevem a server.port configuração no aplicativo implantado. Se qualquer cliente dos clientes depender do aplicativo estar disponível em uma porta diferente de 443, você precisará modificá-los.

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 uma instância e aplicativos do Azure Spring Apps

Provisione uma instância do Azure Spring Apps em sua assinatura do Azure, se ainda não existir uma. Em seguida, crie um aplicativo nela. Para obter mais informações, confira Início Rápido: implantar o seu primeiro aplicativo ao Azure Spring Apps.

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

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

Depois que um aplicativo for implantado nos Aplicativos Spring do Azure, adicione uma configuração de diagnóstico para disponibilizar eventos registrados para consumo, por exemplo, por meio do Azure Monitor Log Analytics.

LogStash/ELK Stack

Se você usar o LogStash/ELK Stack para a agregação de log, defina a configuração de diagnóstico para transmitir a saída de console para um hub de eventos do Azure. Em seguida, use o Plug-in do LogStash para Hub de Eventos a fim de ingerir eventos registrados no LogStash.

Splunk

Se você usar o Splunk para a agregação de log, defina a configuração de diagnóstico para transmitir a saída de console para o Armazenamento de Blobs do Azure. Em seguida, use o Complemento do Splunk para os serviços em nuvem da Microsoft para ingerir eventos registrados no Splunk.

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. Para obter mais informações, consulte Usar armazenamento persistente interno no Azure Spring Apps.

Você deveria gravar arquivos temporários no diretório /tmp. Para a independência do SO, você pode obter esse diretório usando System.getProperty("java.io.tmpdir"). Você também pode usar java.nio.Files::createTempFile para criar arquivos temporários.

Migrar todos os certificados para o Key Vault

Os Aplicativos Spring do Azure não fornecem acesso ao armazenamento de chaves JRE, portanto, você deve migrar certificados para o Cofre de Chaves do Azure e alterar o código do aplicativo para acessar certificados no Cofre de Chaves. Para obter mais informações, confira Introdução aos certificados do Key Vault e Biblioteca de clientes de certificados do Azure Key Vault para Java.

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

Os Aplicativos de Primavera do Azure oferecem as seguintes integrações de APM. Siga os links para ativar o APM que você precisa.

Se seu aplicativo não estiver usando um APM compatível, considere usar o Application Insights. O Azure Spring Apps oferece integração profunda com o Application Insights para gerenciamento de desempenho e resposta em tempo real a aberrações.

Desabilitar os clientes e os pontos de extremidade de métricas nos aplicativos

Remova os clientes de métricas usados ou os pontos de extremidade de métricas expostos nos aplicativos.

Implantar o aplicativo

Implante cada um dos microsserviços migrados (não incluindo os servidores Spring Cloud Config e Registro), conforme descrito em Guia de início rápido: implantar seu primeiro aplicativo nos aplicativos Spring do Azure.

Configurar os segredos por serviço e definir as configurações externas

Você pode injetar as definições de configuração por serviço em cada serviço como variáveis de ambiente. Use as seguintes etapas no portal do Azure:

  1. Navegue até a Instância de Aplicativos Spring do Azure e selecione Aplicativos.
  2. Escolha o serviço a ser configurado.
  3. Selecione Configuração.
  4. Insira as variáveis para a configuração.
  5. Selecione Salvar.

Spring Cloud App Configuration Settings

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 deverá ser necessária.
  • Se o provedor de identidade for uma floresta do Active Directory local, 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, consulte 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, os aplicativos implantados nos Aplicativos Spring do Azure não são visíveis externamente. Você pode expor seu aplicativo tornando-o público com o seguinte comando:

az spring app update --name <application name> --is-public true

Ignore esta etapa se estiver usando ou pretender usar um Spring Cloud Gateway. Para saber mais, veja a seção a seguir.

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. Isso permitirá que seu aplicativo seja descoberto dinamicamente por outros aplicativos e clientes Spring implantados. Para obter mais informações, consulte Preparar um aplicativo para implantação no Azure Spring Apps. Em seguida, modifique todos os clientes do aplicativo para que eles usem o balanceador de carga do Cliente Spring. Isso permite que o cliente obtenha endereços de todas as instâncias em execução do aplicativo e localize uma instância que funcione se outra instância ficar 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 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 sua instância do Azure Spring Apps. Se um Spring Cloud Gateway já estiver implantado, verifique se ele está configurado para rotear o tráfego para o aplicativo recém-implantado.

  • Considere adicionar um servidor Spring Cloud Config 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 abrigar a configuração e configure a instância do Azure Spring Apps para usá-la. Para saber mais, confira Configurar uma instância do Spring Cloud Config Server para seu serviço. 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 da 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 configurações e recursos que serão compartilhados entre todos os aplicativos na instância do Azure Spring Apps. 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 um pipeline de implantação para implantações automáticas e consistentes. As instruções estão disponíveis Para o Azure Pipelines, Para o GitHub Actions e Para o Jenkins.

  • Considere usar implantações de preparo para testar alterações de código em produção antes que elas sejam disponibilizadas para alguns ou todos os usuários finais. Para obter mais informações, confira Configurar um ambiente de preparo no Azure Spring Apps.

  • 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 usar o Azure Application Insights para monitorar o desempenho e as interações de seus aplicativos. Para obter mais informações, confira Agente em processo do Java do Application Insights no Azure Spring Apps.

  • 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, consulte Tutorial: Monitorar recursos do Spring Cloud usando alertas e grupos de ação.

  • Considere replicar a implantação do Azure Spring Apps em outra região para menor latência e maior confiabilidade e tolerância a falhas. Use o Gerenciador de Tráfego do Azure para balancear a carga entre implantações ou o Azure Front Door para adicionar o descarregamento de SSL e o firewall do aplicativo Web com proteção contra DDoS.

  • Se a replicação geográfica não for necessária, considere adicionar um Gateway de Aplicativo do Azure para adicionar o descarregamento de SSL e o Firewall do aplicativo Web com proteção contra DDoS.