Migrar aplicações JBoss EAP para o JBoss EAP no Serviço de Aplicações do Azure
Este guia descreve o que você deve saber quando deseja migrar um aplicativo JBoss EAP existente para ser executado no JBoss EAP em uma instância do Serviço de Aplicativo 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.
Fazer o inventário da capacidade do servidor
Documente o hardware (memória, CPU, disco) do(s) servidor(es) de produção atual e as contagens médias e de pico de solicitações e a utilização de recursos. Independentemente do caminho de migração que escolher, vai precisar destas informações. É útil, por exemplo, para ajudar a orientar a seleção do tamanho das VMs em seu pool de nós, a quantidade de memória a ser usada pelo contêiner e quantas CPUs compartilham as necessidades do contêiner.
É possível redimensionar pools de nós no AKS. Para saber como, consulte Redimensionar pools de nós no Serviço Kubernetes do Azure (AKS).
Inventariar todos os segredos
Procure segredos e palavras-passe nas propriedades e nos ficheiros de configuração do servidor ou servidores de produção. Não se esqueça de verificar jboss-web.xml nos seus WARs. Também poderá encontrar ficheiros de configuração com palavras-passe ou credenciais dentro da aplicação.
Considere armazenar esses segredos no Azure Key Vault. Para obter mais informações, veja Conceitos básicos do Azure Key Vault.
Você pode usar segredos do Cofre da Chave em sua instância do Serviço de Aplicativo com referências do Cofre da Chave. As referências do Key Vault permitem que você use os segredos em seu aplicativo, mantendo-os protegidos e criptografados em repouso. Para obter mais informações, consulte Usar referências do Cofre da Chave para o Serviço de Aplicativo e o Azure Functions.
Inventariar todos os certificados
Documente todos os certificados utilizados para os pontos finais SSL públicos. Pode ver todos os certificados no servidor ou servidores de produção com o comando seguinte:
keytool -list -v -keystore <path to keystore>
Verificar se a versão de Java suportada funciona corretamente
O JBoss EAP em VMs do Azure requer uma versão suportada do Java. Para obter orientação sobre qual versão do JDK usar, consulte Configurações suportadas na documentação da Red Hat.
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
Inventariar os recursos externos
Os recursos externos, como origens de dados, mediadores de mensagens JMS, entre outros, são injetados através de Java Naming and Directory Interface (JNDI). Alguns desses recursos podem precisar de migração ou reconfiguração.
Na aplicação
Inspecione os arquivos WEB-INF/jboss-web.xml e/ou WEB-INF/web.xml . Procure elementos <Resource>
dentro do elemento <Context>
.
Origens de Dados
Origens de dados e recursos JNDI com o atributo type
definido como javax.sql.DataSource
. Documente a seguinte informação de cada origem de dados:
- Qual é o nome da origem de dados?
- Qual é a configuração do conjunto de ligações?
- Onde posso obter o ficheiro JAR do controlador JDBC?
Para obter mais informações, veja Acerca das Origens de Dados do JBoss EAP na documentação do JBoss EAP.
Todos os outros recursos externos
Não é exequível documentar todas as dependências externas possíveis neste guia. Cabe à sua equipa verificar que pode satisfazer todas as dependências externas da sua aplicação após a migração.
Determinar se é utilizada a replicação de sessões
Se a sua aplicação depender da replicação de sessões, terá de alterar a sua aplicação para remover esta dependência. O Serviço de Aplicativo não permite que as instâncias se comuniquem diretamente entre si.
Determinar se e como é que o sistema de ficheiros é utilizado
Qualquer utilização do sistema de ficheiros no servidor de aplicações irá exigir uma reconfiguração ou, em casos raros, alterações da arquitetura. O sistema de arquivos pode ser usado pelos módulos EAP do JBoss ou pelo código do seu aplicativo. Poderá identificar alguns ou todos os cenários descritos nas secções seguintes.
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).
Conteúdo dinâmico ou interno
Para arquivos que são frequentemente gravados e lidos pelo seu aplicativo (como arquivos de dados temporários) ou arquivos estáticos que são visíveis apenas para seu aplicativo, você pode usar o armazenamento de arquivos local associado ao seu plano de serviço de aplicativo. Para obter mais informações, consulte Funcionalidade do sistema operacional no Serviço de Aplicativo do Azure e Noções básicas sobre o sistema de arquivos do Serviço de Aplicativo do Azure.
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 Serviço de Aplicativo do Azure. O Serviço de Aplicativo do Azure 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.
Determinar se é necessária uma ligação ao local
Se a sua aplicação precisar de aceder a um dos seus serviços no local, tem de aprovisionar um dos serviços de conectividade do Azure. Para obter mais informações, veja Ligar uma rede no local ao Azure. Em alternativa, tem de refatorizar a aplicação para utilizar as APIs publicamente disponíveis que os seus recursos no local expõem.
Determinar se os Tópicos ou Filas do Java Message Service (JMS) estão a ser utilizados
Se a sua aplicação utilizar Filas ou Tópicos do JMS, tem de os migrar para um servidor JMS alojado externamente. O Azure Service Bus e o Advanced Message Queuing Protocol (AMQP) podem ser uma excelente estratégia de migração para quem utiliza o JMS. Para obter mais informações, consulte Usar o Java Message Service 1.1 com o Azure Service Bus Standard e AMQP 1.0.
Se tiverem sido configurados arquivos persistentes do JMS, tem de capturar a respetiva configuração e aplicá-la após a migração.
Determinar se há conectores JCA em utilização
Se seu aplicativo usa conectores JCA, valide se você pode usar o conector JCA no JBoss EAP. Se você puder usar o conector JCA no JBoss EAP, para que ele esteja disponível, você deve adicionar os JARs ao classpath do servidor e colocar os arquivos de configuração necessários no local correto nos diretórios do servidor JBoss EAP.
Determinar se o JAAS está a ser utilizado
Se a sua aplicação utilizar o JAAS, tem de capturar a forma como este é configurado. Se estiver usando um banco de dados, você poderá convertê-lo em um domínio JAAS no JBoss EAP. Se for uma implementação personalizada, você precisará validar que ela pode ser usada no JBoss EAP.
Determinar se a aplicação utiliza um Adaptador de Recursos
Se seu aplicativo precisa de um adaptador de recursos (RA), ele precisa ser compatível com o JBoss EAP. Determine se o RA funciona bem em uma instância autônoma do JBoss EAP implantando-o no servidor e configurando-o corretamente. Se o RA funcionar corretamente, você precisará adicionar os JARs ao classpath do servidor do Serviço de Aplicativo e colocar os arquivos de configuração necessários no local correto nos diretórios do servidor JBoss EAP para que ele esteja disponível.
Determinar se a sua aplicação é composta por vários WARs
Se a sua aplicação for composta por vários WARs, deve tratar cada um desses WARs como aplicações separadas e seguir este guia para cada qual individualmente.
Determinar se a sua aplicação está empacotada como EAR
Se a sua aplicação estiver empacotada como ficheiro EAR, certifique-se de que examina o ficheiro application.xml e captura a configuração.
Nota
Se quiser ser capaz de dimensionar cada um dos seus aplicativos Web de forma independente para melhor usar os recursos do Serviço de Aplicativo, você deve dividir o EAR em aplicativos Web separados.
Identificar todos os processos e daemons externos em execução nos servidores de produção
Se tiver processos em execução fora do servidor de aplicações, como daemons de monitorização, terá de eliminar ou migrá-los para outro local.
Fazer testes no local
Antes de criar suas imagens de contêiner, migre seu aplicativo para as versões JDK e JBoss EAP que você pretende usar no Serviço de Aplicativo. Teste a aplicação de forma minuciosa para garantir a compatibilidade e o desempenho.
Notas de recursos do JBoss EAP no Serviço de Aplicativo
Ao usar o JBoss EAP no Serviço de Aplicativo, leve em consideração as seguintes notas.
Console de gerenciamento do JBoss EAP: o console da Web JBoss não está exposto no Serviço de Aplicativo. Em vez disso, o portal do Azure fornece as APIs de gerenciamento para seu aplicativo e você deve implantar usando a CLI do Azure, o Plug-in do Azure Maven ou outras ferramentas de desenvolvedor do Azure. A configuração adicional dos recursos do JBoss pode ser obtida usando a CLI do JBoss durante a inicialização do aplicativo.
Transações: A API de transações é suportada e há suporte para recuperação automática de transações. Para obter mais informações, consulte Gerenciando transações no JBoss EAP na documentação da Red Hat.
Modo de domínio gerenciado: em um ambiente de produção multisservidor, o modo de domínio gerenciado no JBoss EAP oferece recursos gerenciados centralizados. No entanto, com o JBoss EAP no Serviço de Aplicativo, a plataforma do Serviço de Aplicativo assume a responsabilidade pela configuração e gerenciamento das instâncias do servidor. O Serviço de Aplicativo elimina a necessidade do modo de domínio gerenciado do JBoss EAP. O modo de domínio é uma boa opção para implantações multisservidor baseadas em máquina virtual. Para obter mais informações, consulte Sobre domínios gerenciados na documentação da Red Hat.
Clustering de servidor para servidor: A partir de 28 de setembro de 2023, a implantação em cluster do JBoss EAP está disponível ao público. Esse suporte significa que você não precisa mais remover os seguintes recursos de seus aplicativos antes de implantá-los no Serviço de Aplicativo:
- Beans de sessão com monitoração de estado.
- Transações distribuídas.
- Recursos semelhantes que exigem comunicação instância a instância ou alta disponibilidade.
Para obter mais informações, consulte o anúncio de lançamento e a seção Clustering de Configurar um aplicativo Java para o Serviço de Aplicativo do Azure.
Migração
Red Hat Migration Toolkit for Apps
O Red Hat Migration Toolkit for Applications é uma extensão gratuita para o Visual Studio Code. Esta extensão analisa o código e a configuração do aplicativo para fornecer recomendações de migração local para a nuvem. Para obter mais informações, consulte Visão geral do Migration Toolkit for Applications.
O conteúdo deste guia ajudará você a abordar os outros componentes da jornada de migração, como escolher o tipo correto de Plano do Serviço de Aplicativo, externalizar o estado da sessão e usar o Azure para gerenciar suas instâncias EAP em vez da interface de Gerenciamento JBoss.
Provisionar o Serviço de Aplicativo do Azure para o tempo de execução do JBoss EAP
Use os comandos a seguir para criar um grupo de recursos e um Plano do Serviço de Aplicativo do Azure. Depois que o Plano do Serviço de Aplicativo é criado, um plano de aplicativo Web Linux é criado usando o tempo de execução do JBoss EAP. Você pode criar sites JBoss EAP somente nas camadas PremiumV3 e IsolatedV2 App Service Plan.
Certifique-se de que as variáveis de ambiente especificadas tenham valores apropriados.
Nota
O PremiumV3 e o IsolatedV2 são elegíveis para preços de Instância Reservada, o que pode reduzir seus custos. Para obter mais informações sobre as camadas do Plano do Serviço de Aplicativo e os preços da Instância Reservada, consulte Preços do Serviço de Aplicativo.
az group create --resource-group $resourceGroup --location eastus
az acr create --resource-group $resourceGroup --name $acrName --sku Standard
az appservice plan create \
--resource-group $resourceGroup \
--name $jbossAppService \
--is-linux \
--sku P1V2
az webapp create \
--resource-group $resourceGroup \
--name $jbossWebApp \
--plan $jbossAppServicePlan \
--runtime "JBOSSEAP|7-java8"
# Or use "JBOSSEAP|7-java11" if you're using Java 11
Criar a aplicação
Crie o aplicativo usando o seguinte comando Maven.
mvn clean install -DskipTests
Implementar a aplicação
Se a sua aplicação tiver sido criada a partir de um ficheiro POM do Maven, utilize o plug-in de aplicações Web para o Maven para criar a aplicação Web e implementar a sua aplicação. Para obter mais informações, consulte Guia de início rápido: criar um aplicativo Java no Serviço de Aplicativo do Azure.
Para automatizar a implantação de aplicativos EAP JBoss, você pode usar a tarefa Azure Pipelines for Web App ou GitHub Action para implantar no Azure WebApp.
Configurar origens de dados
Há três etapas principais ao registrar uma fonte de dados com o JBoss EAP: carregar o driver JDBC, adicionar o driver JDBC como um módulo e registrar o módulo. Para obter mais informações, consulte Gerenciamento de fonte de dados na documentação do JBoss EAP. O Serviço de Aplicativo é um serviço de hospedagem sem monitoração de estado, portanto, os comandos de configuração para adicionar e registrar o módulo de fonte de dados devem ser roteirizados e aplicados à medida que o contêiner é iniciado.
Para configurar fontes de dados, use as etapas a seguir.
Obtenha o driver JDBC do seu banco de dados.
Crie um arquivo de definição de módulo XML para o driver JDBC. O exemplo mostrado abaixo é uma definição de módulo para PostgreSQL. Certifique-se de substituir o
resource-root path
valor pelo caminho para o driver JDBC que você usa.<?xml version="1.0" ?> <module xmlns="urn:jboss:module:1.1" name="org.postgres"> <resources> <!-- ***** IMPORTANT: REPLACE THIS PLACEHOLDER *******--> <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" /> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Coloque os comandos da CLI do JBoss em um arquivo chamado jboss-cli-commands.cli. Os comandos do JBoss devem adicionar o módulo e registrá-lo como fonte de dados. O exemplo abaixo mostra os comandos JBoss CLI para PostgreSQL.
Nota
A Microsoft recomenda o uso do fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento, como para 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 máquina local, prefira identidades de usuário para conexões sem senha ou sem chave.
module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource) data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
Crie um script de inicialização chamado startup_script.sh que chame os comandos da CLI do JBoss. O exemplo abaixo mostra como chamar seu arquivo jboss-cli-commands.cli . Mais tarde, você configurará o Serviço de Aplicativo para executar esse script quando a instância for iniciada.
$JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
Usando um cliente FTP de sua escolha, carregue seu driver JDBC, jboss-cli-commands.cli, startup_script.sh e a definição do módulo para /site/deployments/tools/.
Configure seu site para executá startup_script.sh quando o contêiner for iniciado. No portal do Azure, navegue até Comando de Inicialização de Configurações > Gerais de Configuração>. Defina o campo de comando de inicialização como /home/site/deployments/tools/startup_script.sh e selecione Salvar.
Reinicie o aplicativo Web, o que fará com que ele execute o script de configuração.
Atualize a configuração da fonte de dados JTA para seu aplicativo. Abra o arquivo src/main/resources/META-INF/persistence.xml do seu aplicativo e localize o
<jta-data-source>
elemento . Substitua os respetivos conteúdos, conforme mostrado aqui:<jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
Criar a aplicação
Crie o aplicativo usando o seguinte comando Maven.
mvn clean install -DskipTests
Implementar a aplicação
Se a sua aplicação tiver sido criada a partir de um ficheiro POM do Maven, utilize o plug-in de aplicações Web para o Maven para criar a aplicação Web e implementar a sua aplicação. Para obter mais informações, consulte Guia de início rápido: criar um aplicativo Java no Serviço de Aplicativo do Azure.
Para automatizar a implantação de aplicativos EAP JBoss, você pode usar a tarefa Azure Pipelines for Web App ou GitHub Action para implantar no Azure WebApp.
Pós-migração
Agora que você migrou seu aplicativo para o Serviço de Aplicativo do Azure, verifique se ele funciona como esperado. Depois disso, temos algumas recomendações que podem tornar a sua aplicação mais nativa da cloud.
Recomendações
Se você optou por usar o diretório /home para armazenamento de arquivos, considere substituí-lo pelo Armazenamento do Azure. Para obter mais informações, consulte Acessar o Armazenamento do Azure como um compartilhamento de rede de um contêiner no Serviço de Aplicativo.
Se você tiver uma configuração no diretório /home que contenha cadeias de conexão, chaves SSL e outras informações secretas, considere usar o Cofre de Chaves do Azure e/ou a injeção de parâmetros com as configurações do aplicativo, sempre que possível. Para obter mais informações, consulte Usar referências do Cofre de Chaves para o Serviço de Aplicativo e o Azure Functions e Configurar um aplicativo do Serviço de Aplicativo no portal do Azure.
Considere o uso de slots de implantação para implantações confiáveis com zero tempo de inatividade. Para obter mais informações, veja Configurar ambientes de teste no Serviço de Aplicações do Azure.
Crie e implemente uma estratégia de DevOps. Para manter a fiabilidade ao mesmo tempo que aumenta a sua velocidade de desenvolvimento, considere automatizar implementações e testar com Pipelines do Azure. Para obter mais informações, consulte Compilar e implantar em um aplicativo Web Java. Ao usar slots de implantação, você pode automatizar a implantação em um slot seguido pela troca de slot. Para obter mais informações, consulte a seção Implantar em um slot de Implantar um aplicativo Web do Azure (Linux).
Crie e implemente uma estratégia de continuidade de negócio e recuperação após desastre. Caso a aplicação seja crítica para a missão, considere uma arquitetura de implementação multirregiões. Para obter mais informações, consulte Aplicativo Web multirregião altamente disponível.