本指南介绍在将现有 Red Hat JBoss 企业应用平台(EAP)应用程序迁移到 Azure 应用服务实例中的 JBoss EAP 上运行时应注意的事项。
预迁移
若要确保迁移成功,请在开始之前完成以下各节中所述的评估和清点步骤。
清点服务器容量
记录当前生产服务器的硬件(内存、CPU、磁盘)、平均值和峰值请求计数,以及资源利用率。 无论选择了哪种迁移路径,都将需要此信息。 例如,它有助于指导选择节点池中 VM 的大小、容器要使用的内存量以及容器需要多少 CPU 份额。
如果有负载测试数据,请拍摄当前测试结果的快照,以便在迁移后再次运行测试,以确保达到预期的性能目标。
可以在 AKS 中调整节点池的大小。 若要了解如何操作,请参阅重设 Azure Kubernetes 服务 (AKS) 中的节点池大小。
清点所有机密
检查生产服务器上的所有属性和配置文件,查找任何机密和密码。 请务必检查 Web 应用程序存档 WAR 文件中的 jboss-web.xml。 还可以在应用程序中找到包含密码或凭据的配置文件。
请考虑将这些机密存储到 Azure KeyVault 中。 有关详细信息,请参阅 Azure Key Vault 基本概念。
可以将应用服务实例中的 Key Vault 机密与 Key Vault 引用一起使用。 Key Vault 引用允许在应用程序中使用机密,同时保持机密的安全并静态加密。 有关详细信息,请参阅使用应用服务和 Azure Functions 的 Key Vault 引用。
清点所有证书
记录用于公共 SSL 终结点的所有证书。 可以通过运行以下命令来查看生产服务器上的所有证书:
keytool -list -v -keystore <path to keystore>
验证支持的 Java 版本是否正常运行
应用服务上的 JBoss EAP 需要受支持的 Java 版本。 有关要使用的 Java 开发工具包(JDK)版本的指南,请参阅 Red Hat 文档中 支持的配置 。
注意
如果当前服务器在不受支持的 JDK(如 Oracle JDK 或 IBM OpenJ9)上运行,则此验证尤其重要。
若要获取当前的 Java 版本,请登录到生产服务器并运行以下命令:
java -version
清点外部资源
外部资源(如数据源、Java 消息服务(JMS)消息中转站等是通过 Java 命名和目录接口(JNDI)注入的。 某些此类资源可能需要迁移或重新配置。
在应用程序中
检查 WEB-INF/jboss-web.xml 和/或 WEB-INF/web.xml 文件。 查找 <Resource>
元素中的 <Context>
元素。
数据源
数据源是 JNDI 资源,其 type
属性设置为 javax.sql.DataSource
。 对于每个数据源,请记录以下信息:
- 数据源名称是什么?
- 连接池配置是什么?
- 在哪里可以找到 Java 数据库连接 (JDBC) 驱动程序 JAR 文件?
有关详细信息,请参阅 JBoss EAP 文档中的 关于 JBoss Enterprise Application Platform (EAP) 数据源。
所有其他的外部资源
在本指南中,不可能记录每个可能的外部依赖项。 你的团队负责验证你是否可以在迁移之后满足应用程序的所有外部依赖项的要求。
确定是否使用以及如何使用文件系统
只要在应用程序服务器上使用文件系统,就需要重新配置,在极少数情况下,还需要更改体系结构。 JBoss EAP 模块或应用程序代码可以使用文件系统。 可以识别以下各部分中描述的部分或全部情境。
只读静态内容
如果应用程序当前提供静态内容,则需要一个备用位置。 应考虑将静态内容移动到 Azure Blob 存储,并添加 Azure Front Door,以便全局快速下载。 有关详细信息,请参阅 Azure 存储 中的静态网站托管,并 将 Azure 存储帐户与 Azure Front Door集成。
动态或内部内容
对于经常由应用程序写入和读取的文件(如临时数据文件),或者仅对应用程序可见的静态文件,可以使用与应用服务计划相关联的本地文件存储。 有关详细信息,请参阅 Azure 应用服务上的操作系统功能和了解 Azure 应用服务文件系统。
确定应用程序是否依赖于计划的作业
计划的作业(如 Quartz 计划程序任务或 Unix cron 作业)不应与 Azure 应用程序服务配合使用。 Azure 应用程序服务不会阻止你部署内含计划任务的应用程序。 但是,如果应用程序横向扩展,则同一个计划的作业可能会按照计划期间运行多次。 这种情况可能会导致意外的后果。
清点生产服务器上运行的任何计划任务,包括应用程序代码内部或外部的任务。
确定是否需要连接到本地
如果应用程序需要访问任何本地服务,则需预配 Azure 的某个连接服务。 有关详细信息,请参阅将本地网络连接到 Azure。 或者,你需要重构应用程序,以便使用本地资源公开的公开可用的 API。
确定 Java 消息服务 (JMS) 队列或主题是否正在使用中
如果应用程序使用 JMS 队列或主题,则需将其迁移到外部托管的 JMS 服务器。 Azure 服务总线和高级消息队列协议 (AMQP) 可成为那些使用 JMS 的项目的理想迁移策略。 有关详细信息,请参阅将 Java Message Service 1.1 与 Azure 服务总线标准和 AMQP 1.0 配合使用。
如果已配置 JMS 持久存储,则必须捕获其配置,并在迁移后应用它。
确定是否使用了 JCA 连接器
如果应用程序使用 Java 连接器体系结构(JCA)连接器,请验证是否可以在 JBoss EAP 上使用 JCA 连接器。 如果可以在 JBoss EAP 上使用 JCA 连接器,则必须将 Java 存档 (JAR) 文件添加到服务器类路径,并将必要的配置文件放在 JBoss EAP 服务器目录中的正确位置。
确定是否使用了 JAAS
如果应用程序使用的是 JAAS,则需要捕获 JAAS 的配置方式。 如果使用的是数据库,则可以将其转换为 JBoss EAP 上的 JAAS 域。 如果它是自定义实现,则需要验证它是否可在 JBoss EAP 上使用。
确定应用程序是否使用资源适配器
如果应用程序需要资源适配器 (RA),则它需要与 JBoss EAP 兼容。 若要确定此 RA 在独立的 JBoss EAP 实例上是否正常工作,需将其部署到服务器并对其进行正确配置。 如果 RA 正常工作,则需将这些 JAR 添加到应用服务的服务器类路径中,并将所需的配置文件放到 JBoss EAP 服务器目录中的正确位置,使其可用。
确定应用程序是否由多个 WAR 组成
如果应用程序由多个 WAR 组成,则应将这些 WAR 中的每一个都视为单独的应用程序,并通过本指南了解这其中的每个应用程序。
确定应用程序是否打包为 EAR
如果将应用程序打包为 EAR 文件,请务必检查 application.xml 文件并捕获配置。
注意
如果希望能够独立缩放每个 Web 应用程序,以便更好地使用应用服务资源,则应将 EAR 分解为单独的 Web 应用程序。
确定在生产服务器上运行的所有外部进程和守护程序
如果在应用程序服务器外运行任何进程(如监视守护程序),则需消除它们或将它们迁移到其他位置。
执行就地测试
在创建 Web 应用之前,请将应用程序迁移到要用于应用服务的 JDK 和 JBoss EAP 版本。 全面测试应用程序,确保兼容性和性能。
应用服务上的 JBoss EAP 的功能说明
在使用应用服务上的 JBoss EAP 时,请务必考虑以下注意事项。
JBoss EAP 管理控制台:JBoss Web 控制台未在应用服务上公开。 相反,Azure 门户为应用程序提供管理 API,并且你应该使用 Azure CLI、Azure Maven 插件或其他 Azure 开发人员工具进行部署。 在应用程序启动期间,可以使用 JBoss CLI 进一步配置 JBoss 资源。
事务:支持事务 API,并且支持自动事务恢复。 有关详细信息,请参阅 Red Hat 文档中的管理 JBoss EAP 上的事务。
托管域模式:在多服务器生产环境中,JBoss EAP 中的托管域模式提供集中式托管功能。 但是通过应用服务上的 JBoss EAP,应用服务平台将负责配置和管理服务器实例。 应用程序服务无需使用 JBoss EAP 的托管域模式。 对于基于虚拟机的多服务器部署,域模式是一个不错的选择。 有关详细信息,请参阅 Red Hat 文档中的关于托管域。
服务器到服务器群集:应用服务完全支持 JBoss EAP 群集部署。 这意味着你可以自信地使用:
- 有状态的会话 Bean。
- 分布式事务。
- 需要实例间通信或高可用性的类似功能。
有关详细信息,请参阅“为 Azure 应用服务配置 Java 应用”的“群集”部分。
迁移
适用于应用的 Red Hat 迁移工具包
Red Hat Migration Toolkit for Applications 是 Visual Studio Code 的免费扩展。 此扩展会分析应用程序代码和配置,以提供从本地迁移到云的建议。 有关详细信息,请参阅 Migration Toolkit for Applications 概述。
本指南的内容可帮助你解决迁移旅程的其他组件,例如选择正确的应用服务计划类型、外部化会话状态,以及使用 Azure 管理 EAP 实例而不是 JBoss 管理界面。
针对 JBoss EAP 运行时预配 Azure 应用服务
使用以下命令创建资源组和 Azure 应用服务计划。 创建应用服务计划后,将使用 JBoss Enterprise 应用程序平台(EAP)运行时创建 Linux Web 应用计划。
确保指定的环境变量具有适当的值。
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 P0v3
az webapp create \
--resource-group $resourceGroup \
--name $jbossWebApp \
--plan $jbossAppServicePlan \
--runtime "JBOSSEAP|8-java17"
# Or use "JBOSSEAP|8-java11" if you're using Java 11
构建应用程序
使用以下 Maven 命令构建应用程序。
mvn clean install -DskipTests
部署应用
如果应用程序是从 Maven POM 文件生成的,则请使用 Maven 的 Webapp 插件来创建 Web 应用并部署应用程序。 有关详细信息,请参阅快速入门:在 Azure 应用程序服务上创建 Java 应用。
若要自动部署 JBoss EAP 应用程序,可使用针对 Web 应用的 Azure Pipelines 任务或用于部署到 Azure WebApp 的 GitHub 操作。
设置数据源
将数据源注册到 JBoss Enterprise Application Platform(EAP):上传 Java 数据库连接(JDBC)驱动程序、将 JDBC 驱动程序添加为模块以及注册模块时,有三个核心步骤。 有关详细信息,请参阅 JBoss EAP 文档中的数据源管理。 应用服务是一种无状态托管服务,因此,必须对用于添加和注册数据源模块的配置命令编写脚本并在容器启动时应用该脚本。
若要设置数据源,请按以下步骤操作。
获取数据库的 JDBC 驱动程序。
为 JDBC 驱动程序创建 XML 模块定义文件。 显示的示例是 PostgreSQL 的模块定义。 请确保将
resource-root path
值替换为所使用的 JDBC 驱动程序的路径。<?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>
将 JBoss CLI 命令放入名为“jboss-cli-commands.cli”的文件中。 JBoss 命令必须添加模块,并将其注册为数据源。 此示例显示了 PostgreSQL 的 JBoss CLI 命令。
注意
Microsoft 建议使用最安全的可用身份验证流。 此过程中所述的身份验证流(例如数据库、缓存、消息传送或 AI 服务)需要高度信任应用程序,并且存在其他流中不存在的风险。 仅当更安全的选项(例如无密码连接或无密钥连接的托管标识)不可行时,才使用此流。 对于本地计算机操作,首选无密码连接或无密钥连接的用户标识。
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
创建一个名为 startup_script.sh 的 启动脚本,用于调用 JBoss CLI 命令。 该示例演示如何调用 jboss-cli-commands.cli 文件。 稍后将应用服务配置为在实例启动时运行此脚本。
$JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
使用选择的 FTP 客户端将 JDBC 驱动程序、jboss-cli-commands.cli、startup_script.sh 和模块定义上传到 /site/deployments/tools/。
将站点配置为在容器启动时运行 startup_script.sh。 在 Azure 门户中,导航到配置 > 通用设置 > 启动命令。 将“启动命令”字段设置为 /home/site/deployments/tools/startup_script.sh,然后选择“保存”。
重启 Web 应用,导致它运行配置脚本。
更新应用程序的 Java 事务 API (JTA) 数据源配置。 打开应用的 src/main/resources/META-INF/persistence.xml 文件,找到
<jta-data-source>
元素。 替换其内容,如下所示:<jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
构建应用程序
使用以下 Maven 命令构建应用程序。
mvn clean install -DskipTests
部署应用
如果应用程序是从 Maven POM 文件生成的,则请使用 Maven 的 Webapp 插件来创建 Web 应用并部署应用程序。 有关详细信息,请参阅快速入门:在 Azure 应用程序服务上创建 Java 应用。
若要自动部署 JBoss EAP 应用程序,可使用针对 Web 应用的 Azure Pipelines 任务或用于部署到 Azure WebApp 的 GitHub 操作。
迁移后
将应用程序迁移到 Azure 应用服务后,应验证它是否按预期工作。 在你完成这些之后,我们有一些建议,可以让你的应用程序更具云原生特性。
建议
如果选择使用 /home 目录进行文件存储,请考虑将其替换为 Azure 存储。 有关详细信息,请参阅从应用服务中的容器以网络共享形式访问 Azure 存储。
如果 /home 目录中的配置包含连接字符串、SSL 密钥和其他秘密信息,请考虑尽可能使用 Azure Key Vault 和/或应用程序设置的参数注入。 有关详细信息,请参阅使用应用服务和 Azure Functions 的 Key Vault 引用和在 Azure 门户中配置应用服务应用。
请考虑使用部署槽位实现可靠的部署,不需停机。 有关详细信息,请参阅设置 Azure 应用程序服务中的过渡环境。
设计和实施 DevOps 策略。 若要在提高开发速度的同时保持可靠性,请考虑通过 Azure Pipelines 自动进行部署和测试。 有关详细信息,请参阅生成并部署到 Java Web 应用。 如果使用部署槽位,则可自动部署到槽位,然后进行槽位交换。 有关详细信息,请参阅部署 Azure Web 应用 (Linux) 的部署到槽部分。
设计和实施业务连续性和灾难恢复策略。 对于关键应用程序,请考虑多区域部署体系结构。 有关详细信息,请参阅高可用性多区域 Web 应用程序。