Migrar aplicativos do Spring Boot para o Azure Spring Apps

Nota

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

Este guia descreve o que você deve estar ciente quando deseja migrar um aplicativo Spring Boot existente para ser executado no Azure Spring Apps.

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 permanecerá em execução até que a nova instância termine de iniciar. Isso tem as seguintes implicações potencialmente significativas para seu aplicativo:

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

Antes de migrar para o Azure Spring Apps, 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 normalmente armazenam o estado do aplicativo em locais como os seguintes:

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.

Nota

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

Conteúdo estático só de leitura

Se a sua aplicação servir conteúdo estático atualmente, precisa de uma localização alternativa para o mesmo. Pode considerar mover o conteúdo estático para o Armazenamento de Blobs do Azure e adicionar a CDN do Azure para obter transferências super-rápidas a nível global. 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 a sua aplicação permitir conteúdo estático carregado/produzido pela mesma, mas que é imutável após a criação, pode utilizar o Armazenamento de Blobs do Azure e a CDN do Azure conforme descrito acima, com uma função das Funções do Azure que lide com os carregamentos e as atualizações da CDN. 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 a sua aplicação contiver código com dependências no SO anfitrião, terá de a refatorizar para remover essas dependências. Por exemplo, poderá ter de substituir qualquer utilização de / ou \ em caminhos do sistema de ficheiros por File.Separator ou Paths.get.

Mudar para uma plataforma suportada

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

Determinar se a aplicação depende de trabalhos agendados

Trabalhos agendados, como tarefas do Agendador de Quartzo ou trabalhos cron do Unix, NÃO devem ser usados com o Azure Spring Apps. O Azure Spring Apps não impedirá que você implante um aplicativo contendo tarefas agendadas internamente. Contudo, se a sua aplicação estiver ampliada, a mesma tarefa agendada pode ser executada mais de uma vez por período agendado. Esta situação pode provocar consequências não intencionais.

Inventarie todas as tarefas agendadas em execução no(s) servidor(es) 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>2.7.10</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 '2.7.10'
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
  id 'java'
}

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

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 monitoramento de desempenho de aplicativos em uso com seus aplicativos. O Azure Spring Apps suporta a integração com Application Insights, New Relic, Elastic APM, Dynatrace e AppDynamics. Se o aplicativo estiver usando um APM suportado, 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 .

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/directory , em um arquivo normalmente chamado application.properties ou application.yml.

Bases de Dados

Para qualquer base de dados SQL, identifique a cadeia de ligação.

Para uma aplicação do Spring Boot, as cadeias de ligação aparecem normalmente em ficheiros de configuração.

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 corretor ou corretores 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.0.4.0")
      ...
    }

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 qualquer provedor de identidade usado 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

O Azure Spring Apps substitui a server.port configuração no aplicativo implantado. Se algum cliente dos clientes depender que o aplicativo esteja disponível em uma porta diferente da 443, você precisará modificá-los.

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 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. Em seguida, crie um aplicativo lá. Para obter mais informações, consulte Guia de início rápido: implantar seu primeiro aplicativo no Azure Spring Apps.

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

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

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

Pilha LogStash/ELK

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

Splunk

Se você usar o Splunk para agregação de log, configure a configuração de diagnóstico para transmitir a saída do console para o Armazenamento de Blobs do Azure. Em seguida, use o complemento Splunk para Microsoft Cloud Services para ingerir eventos registrados no Splunk.

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

Você deve gravar todos os arquivos temporários no /tmp diretório. Para independência do sistema operacional, você pode obter este 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 KeyVault

O Azure Spring Apps não fornece acesso ao keystore JRE, portanto, você deve migrar certificados para o Azure KeyVault e alterar o código do aplicativo para acessar certificados no KeyVault. Para obter mais informações, consulte Introdução aos certificados do Cofre da Chave e Biblioteca de cliente do Azure Key Vault Certificate para Java.

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

O Azure Spring Apps oferece as seguintes integrações 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.

Desative clientes e endpoints de métricas em seus aplicativos

Remova todas as métricas que os clientes usaram ou quaisquer pontos de extremidade de métricas expostos em seus aplicativos.

Implementar a aplicação

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

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

Você pode injetar quaisquer 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 do Azure Spring Apps e selecione Aplicativos.
  2. Selecione o serviço a ser configurado.
  3. Selecione Configuração.
  4. Insira as variáveis a serem configuradas.
  5. Selecione Guardar.

Spring Cloud App Configuration Settings

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, os aplicativos implantados no Azure Spring Apps 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 obter mais informações, consulte a seção a seguir.

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. 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 de aplicativo para usar o balanceador de carga do Spring Client. Isso 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 sua instância do Azure Spring Apps. Se um Spring Cloud Gateway já estiver implantado, certifique-se de que ele esteja configurado para rotear o tráfego para seu 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 hospedar a configuração e configure a instância do Azure Spring Apps para usá-la. Para obter mais informações, consulte 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 é o mesmo que your-application-name 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 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 serão compartilhados entre todos os aplicativos na instância do Azure Spring Apps. 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 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 o uso de implantações de preparo para testar alterações de código na produção antes que elas estejam disponíveis para alguns ou todos os usuários finais. Para obter mais informações, consulte Configurar um ambiente de preparo no Azure Spring Apps.

  • 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 usar o Azure Application Insights para monitorar o desempenho e as interações de seus aplicativos. Para obter mais informações, consulte Application Insights Java In-Process Agent in Azure Spring Apps.

  • 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 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 obter 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 use o Azure Front Door para adicionar descarregamento SSL e Firewall de 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 descarregamento SSL e Firewall de Aplicativo Web com proteção contra DDoS.