將 JBoss EAP 應用程式遷移至 Azure App Service 上的 JBoss EAP
本指南說明當您想要移轉現有的 JBoss EAP 應用程式,以在 Azure App 服務 實例的 JBoss EAP 上執行時,應該注意的事項。
移轉前
為確保成功移轉,在開始之前,請先完成下列各節中所述的評量和清查步驟。
清查伺服器容量
記錄目前生產伺服器的硬體(記憶體、CPU、磁碟),以及平均和尖峰要求計數和資源使用率。 無論您選擇哪一種遷移路徑,您都需要這項資訊。 例如,協助引導選取節點集區中 VM 的大小、容器要使用的記憶體數量,以及容器需要多少 CPU 共用。
它可以調整 AKS 中的節點集區大小。 若要瞭解如何,請參閱 調整 Azure Kubernetes Service (AKS) 中的節點集區大小。
清查所有秘密
檢查實際執行伺服器上的所有屬性和設定檔是否有任何秘密和密碼。 請務必檢查 您的 WAR 中的jboss-web.xml 。 您也可以在應用程式內找到包含密碼或認證的組態檔。
請考慮將這些秘密儲存在 Azure KeyVault 中。 如需詳細資訊,請參閱 Azure 金鑰保存庫 基本概念。
您可以在 App Service 實例中使用 金鑰保存庫 秘密搭配 金鑰保存庫 參考。 金鑰保存庫 參考可讓您在應用程式中使用秘密,同時保護秘密並加密待用。 如需詳細資訊,請參閱使用 App Service 和 Azure Functions 的 Key Vault 參考。
清查所有憑證
記載所有用於公用 SSL 端點的憑證。 您可以執行下列命令來檢視實際執行伺服器上的所有憑證:
keytool -list -v -keystore <path to keystore>
驗證支援的 Java 版本是否正常運作
Azure VM 上的 JBoss EAP 需要支援的 Java 版本。 如需要使用的 JDK 版本指引,請參閱 Red Hat 檔中支持的 設定。
注意
如果您的目前伺服器是在不支援的 JDK 上執行,此驗證特別重要(例如 Oracle JDK 或 IBM OpenJ9)。
若要取得目前的 Java 版本,請登入您的生產伺服器,然後執行下列命令:
java -version
清查外部資源
外部資源,例如數據源、JMS 訊息代理程式,以及其他資源會透過 Java 命名和目錄介面 (JNDI) 插入。 某些這類資源可能需要移轉或重新設定。
在應用程式內
檢查 WEB-INF/jboss-web.xml 和/或 WEB-INF/web.xml 檔案。 尋找 <Resource>
元素內的 <Context>
元素。
資料來源
資料來源是 JNDI 資源, type
屬性設定為 javax.sql.DataSource
。 針對每個數據源,記載下列資訊:
- 數據源名稱為何?
- 連線集區設定是什麼?
- 哪裡可以找到 JDBC 驅動程式 JAR 檔案?
如需詳細資訊,請參閱 JBoss EAP 檔中的關於 JBoss EAP 數據源 。
所有其他外部資源
在本指南中記載每個可能的外部相依性並不可行。 您的小組有責任確認您可以在移轉後滿足應用程式的每個外部相依性。
判斷是否使用會話複寫
如果您的應用程式依賴會話複寫,您必須變更應用程式以移除此相依性。 App Service 不允許實例彼此直接通訊。
判斷是否要使用檔案系統及如何使用
每當使用應用程式伺服器上的檔案系統時,都必須重新設定,或在罕見的情況下,還需要進行架構變更。 檔案系統可由 JBoss EAP 模組或您的應用程式程式代碼使用。 您可能會發現下列各節所述的部分或所有案例。
唯讀靜態內容
如果應用程式目前提供靜態內容,則必須為其提供替代位置。 您可能想要考慮將靜態內容移至 Azure Blob 儲存體,並新增 Azure CDN 以進行全球快速下載。 如需詳細資訊,請參閱 Azure 儲存體中的靜態網站裝載和快速入門:整合 Azure 儲存體帳戶與 Azure CDN。
動態發佈的靜態內容
如果您的應用程式允許您應用程式上傳/產生的靜態內容,但在建立後不可變,則您可以使用上述的 Azure Blob 儲存體和 CDN,搭配 Azure 函式來處理上傳和 CDN 重新整理。 我們已在使用 Azure Functions 上傳和透過 CDN 預先載入靜態內容中提供範例實作供您使用。
動態或內部內容
對於應用程式經常寫入和讀取的檔案(例如暫存數據檔),或只有應用程式可見的靜態檔案,您可以使用與 App Service 方案相關聯的本機檔案記憶體。 如需詳細資訊,請參閱 Azure App 服務 和瞭解 Azure App 服務 文件系統的操作系統功能。
判斷您的應用程式是否依賴排程的作業
排程的作業,例如[矽排程器工作] 或 [Unix cron] 工作,不應該與 Azure App 服務 搭配使用。 Azure App 服務 不會防止您在內部部署包含排程工作的應用程式。 不過,如果您的應用程式相應放大,則每個排程期間,相同的排程工作可能會執行多次。 這種情況可能會導致非預期的後果。
清查在生產伺服器、應用程式程式碼內外執行的任何排程工作。
判斷是否需要連線至內部部署環境
如果您的應用程式需要存取您的任何內部部署服務,您必須佈建其中一個 Azure 連線能力服務。 如需詳細資訊,請參閱將內部部署網路連線至 Azure。 或者,您必須重構應用程式,以使用內部部署資源所顯示的公開可用 API。
判斷 Java 訊息服務 (JMS) 佇列或主題是否正在使用中
如果應用程式使用 JMS 佇列或主題,您就必須將這些佇列或主題遷移到裝載在外部的 JMS 伺服器。 對於這些使用 JMS 的佇列或主題來說,Azure 服務匯流排和進階訊息佇列通訊協定 (AMQP) 會是絕佳的移轉策略。 如需詳細資訊,請參閱搭配 Azure 服務匯流排 標準和AMQP 1.0使用Java Message Service 1.1。
如果您已設定 JMS 持續性存放區,就必須在移轉之後擷取存放區的設定並加以套用。
判斷 JCA 連接器是否正在使用中
如果您的應用程式使用 JCA 連接器,請確認您可以在 JBoss EAP 上使用 JCA 連接器。 如果您可以在 JBoss EAP 上使用 JCA 連接器,則必須將 JAR 新增至伺服器類別路徑,並將必要的組態檔放在 JBoss EAP 伺服器目錄中的正確位置。
判斷 JAAS 是否正在使用中
如果您的應用程式使用 JAAS,您必須擷取 JAAS 的設定方式。 如果使用資料庫,您可以將它轉換成 JBoss EAP 上的 JAAS 網域。 如果是自定義實作,您必須驗證它是否可以在 JBoss EAP 上使用。
判斷您的應用程式是否使用資源配接器
如果您的應用程式需要資源配接器 (RA),它必須與 JBoss EAP 相容。 藉由將RA部署到伺服器並正確設定,判斷RA是否可在 JBoss EAP 的獨立實例上正常運作。 如果 RA 正常運作,您必須將 JAR 新增至 App Service 的伺服器類別路徑,並將必要的組態檔放在 JBoss EAP 伺服器目錄中的正確位置,以供使用。
判斷應用程式是否由多個 WAR 組成
如果應用程式由多個 WAR 組成,則應該將這些 WAR 視為個別應用程式,並瀏覽本指南以了解這些 WAR。
判斷應用程式是否封裝為 EAR
如果您的應用程式封裝為 EAR 檔案,請務必檢查 application.xml 檔案並擷取組態。
注意
如果您想要能夠獨立調整每個 Web 應用程式,以便更妥善地使用 App Service 資源,您應該將 EAR 分成個別的 Web 應用程式。
識別在生產伺服器上執行的所有外部處理序和精靈
如果您有任何在應用程式伺服器外部執行的處理序 (例如監視精靈),則必須加以消除或將其遷移到其他位置。
執行就地測試
建立容器映像之前,請先將應用程式移轉至您想要在App Service上使用的JDK和 JBoss EAP 版本。 徹底測試應用程式,以確保相容性和效能。
App Service 功能注意事項上的 JBoss EAP
在 App Service 上使用 JBoss EAP 時,請務必考慮下列注意事項。
JBoss EAP 管理控制台:App Service 上不會公開 JBoss Web 控制台。 相反地,Azure 入口網站 會提供應用程式的管理 API,而您應該使用 Azure CLI、Azure Maven 外掛程式或其他 Azure 開發人員工具進行部署。 在應用程式啟動時,可以使用 JBoss CLI 進一步設定 JBoss 資源。
交易:支援交易 API,而且支援自動交易復原。 如需詳細資訊,請參閱 Red Hat 檔中管理 JBoss EAP 上的交易。
受控網域模式:在多伺服器生產環境中,JBoss EAP 中的受控網域模式提供集中式受控功能。 不過,在 App Service 上使用 JBoss EAP 時,App Service 平臺會負責設定和管理伺服器實例。 App Service 不需要 JBoss EAP 的受控網域模式。 網域模式是虛擬機型多伺服器部署的絕佳選擇。 如需詳細資訊,請參閱 Red Hat 檔中關於受控網域 。
伺服器對伺服器叢集:從 2023 年 9 月 28 日起,JBoss EAP 的叢集部署已正式推出。 此支援表示您不再需要從應用程式移除下列功能,才能將其部署至 App Service:
- 具狀態會話豆類。
- 分散式交易。
- 需要實例對實例通訊或高可用性的類似功能。
如需詳細資訊,請參閱設定適用於 Azure App 服務的 Java 應用程式發行公告和叢集一節。
遷移
Red Hat Migration Toolkit for Apps
Red Hat Migration Toolkit for Applications 是 Visual Studio Code 的免費擴充功能。 此延伸模組會分析您的應用程式程式代碼和組態,以提供從內部部署移轉至雲端的建議。 如需詳細資訊,請參閱 移轉工具組 for Applications 概觀。
本指南的內容將協助您解決移轉旅程的其他元件,例如選擇正確的 App Service 方案類型、將會話狀態外部化,以及使用 Azure 來管理 EAP 實例,而不是 JBoss 管理介面。
布建 JBoss EAP 運行時間的 Azure App 服務
使用下列命令來建立資源群組和 Azure App 服務 方案。 建立 App Service 方案之後,會使用 JBoss EAP 運行時間建立 Linux Web 應用程式方案。 您只能在 PremiumV3 和 IsolatedV2 App Service 方案層上建立 JBoss EAP 網站。
請確定指定的環境變數具有適當的值。
注意
PremiumV3 和 IsolatedV2 都符合保留實例定價的資格,這可以降低您的成本。 如需 App Service 方案層和保留實例定價的詳細資訊,請參閱 App Service 定價。
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
建置應用程式
使用下列 Maven 命令建置應用程式。
mvn clean install -DskipTests
部署應用程式
如果您的應用程式是從 Maven POM 檔案建置的,請使用適用於 Maven 的 Webapp 外掛程式來建立 Web 應用程式並部署您的應用程式。 如需詳細資訊,請參閱快速入門:在 Azure App 服務 上建立Java應用程式。
若要將 JBoss EAP 應用程式的部署自動化,您可以使用 適用於 Web 應用程式的 Azure Pipelines 工作或 GitHub Action 來部署至 Azure WebApp。
設定數據源
使用 JBoss EAP 註冊資料來源時有三個核心步驟:上傳 JDBC 驅動程式、將 JDBC 驅動程式新增為模組,以及註冊模組。 如需詳細資訊,請參閱 JBoss EAP 檔中的數據源管理 。 App Service 是無狀態裝載服務,因此用於新增和註冊資料來源模組的設定命令,必須編寫到指令碼並於容器啟動時套用。
若要設定數據源,請使用下列步驟。
取得資料庫的 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 命令。
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 檔案。 稍後,您會將App Service 設定為在實例啟動時執行此腳本。
$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 應用程式,這會導致它執行設定腳本。
更新應用程式的 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 App 服務 上建立Java應用程式。
若要將 JBoss EAP 應用程式的部署自動化,您可以使用 適用於 Web 應用程式的 Azure Pipelines 工作或 GitHub Action 來部署至 Azure WebApp。
移轉後
既然您已將應用程式移轉至 Azure App 服務,您應該確認它如預期般運作。 完成之後,我們有一些建議可讓您的應用程式更雲端原生。
建議
如果您選擇使用 /home 目錄進行檔案記憶體,請考慮將它取代為 Azure 儲存體。 如需詳細資訊,請參閱從 App Service 中的容器存取 Azure 儲存體 作為網路共用。
如果您在包含 連接字串、SSL 金鑰和其他秘密資訊的 /home 目錄中設定,請考慮盡可能搭配應用程式設定使用 Azure 金鑰保存庫 和/或參數插入。 如需詳細資訊,請參閱在 Azure 入口網站 中使用App Service和 Azure Functions 的 金鑰保存庫 參考和設定 App Service 應用程式。
請考慮使用部署位置進行零停機的可靠部署。 如需詳細資訊,請參閱在 Azure App 服務 中設定預備環境。
設計和實作DevOps策略。 若要在提高開發速度的同時維護可靠性,請考慮使用 Azure Pipelines 將部署和測試自動化。 如需詳細資訊,請參閱 建置和部署至 Java Web 應用程式。 當您使用部署位置時,您可以將 部署自動化至位置 ,後面接著位置交換。 如需詳細資訊,請參閱部署 Azure Web 應用程式 (Linux) 的部署至位置一節。
設計和實作商務持續性和災害復原策略。 針對任務關鍵性應用程式,請考慮多區域部署架構。 如需詳細資訊,請參閱 高可用性多區域 Web 應用程式。