將 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 金鑰保存庫 參考。

清查所有憑證

記錄用於公用 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 Spring Apps 企業版方案中的應用程式。 如需詳細資訊,請參閱 部署Web靜態檔案

動態發佈的靜態內容

如果您的應用程式允許應用程式上傳/產生的靜態內容,但在應用程式建立後是不可變的,您可以使用如上所述 Azure Blob 儲存體 和 Azure CDN,搭配 Azure 函式來處理上傳和 CDN 重新整理。 我們在使用 Azure Functions 上傳和 CDN 預先載入靜態內容時,提供了範例實作。 您也可以直接將靜態內容部署到 Azure Spring Apps 企業版方案中的應用程式。 如需詳細資訊,請參閱 部署Web靜態檔案

動態或內部內容

對於應用程式經常寫入和讀取的檔案(例如暫存數據檔),或只有應用程式可見的靜態檔案,您可以使用與 App Service 方案相關聯的本機檔案記憶體。 如需詳細資訊,請參閱 Azure App 服務 和瞭解 Azure App 服務 文件系統上的操作系統功能。

判斷您的應用程式是否依賴排程的作業

排程的作業,例如[矽排程器工作] 或 [Unix cron] 作業,不應與 Azure App 服務 搭配使用。 Azure App 服務 不會防止您在內部部署包含排程工作的應用程式。 不過,如果您的應用程式相應放大,則每個排程期間,相同的排程工作可能會執行多次。 這種情況可能會導致非預期的後果。

清查在生產伺服器、應用程式程式碼內外執行的任何排程工作。

判斷是否需要連線至內部部署

如果您的應用程式需要存取任何內部部署服務,您必須布建其中一個 Azure 的連線服務。 如需詳細資訊,請參閱 選擇將內部部署網路連線至 Azure 的解決方案。 或者,您必須重構應用程式,才能使用內部部署資源公開的公開可用 API。

判斷 Java 訊息服務 (JMS) 佇列或主題是否正在使用中

如果您的應用程式使用 JMS 佇列或主題,您必須將它們移轉至外部裝載的 JMS 伺服器。 Azure 服務匯流排 和進階消息佇列通訊協定 (AMQP) 對於使用 JMS 的用戶來說,可能是絕佳的移轉策略。 如需詳細資訊,請參閱搭配 Azure 服務匯流排 和AMQP 1.0使用 JMS。

如果已設定 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 開發人員工具進行部署。

  • 交易:應用程式實例會以無狀態方式執行,因此目前不支援交易 API。 如需詳細資訊,請參閱 Red Hat 檔中管理 JBoss EAP 上的交易。

  • 受控網域模式:在多伺服器生產環境中,JBoss EAP 中的受控網域模式提供集中式受控功能。 不過,在 App Service 上使用 JBoss EAP 時,App Service 平臺會負責設定和管理伺服器實例。 App Service 不需要 JBoss EAP 的受控網域模式。 網域模式是虛擬機型多伺服器部署的絕佳選擇。 如需詳細資訊,請參閱 Red Hat 檔中關於受控網域

  • 伺服器對伺服器叢集:自 2022 年 3 月 15 日起,公開預覽版支援 JBoss EAP 的叢集部署。 此支援表示您不再需要從應用程式移除下列功能,才能將其部署至 App Service:

    • 具狀態會話豆類。
    • 分散式交易。
    • 需要實例對實例通訊或高可用性的類似功能。

    如需詳細資訊,請參閱設定java應用程式以進行 Azure App 服務的 JBoss EAP 中的發行公告和叢集一節。

遷移

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 應用程式方案。 您只能在 進階版 V3 和 IsolatedV2 App Service 方案層上建立 JBoss EAP 網站。

請確定指定的環境變數具有適當的值。

注意

進階版 V3 和 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 是無狀態裝載服務,因此在容器啟動時,必須編寫腳本並套用用於新增和註冊數據源模組的組態命令。

若要設定數據源,請使用下列步驟。

  1. 取得資料庫的 JDBC 驅動程式。

  2. 建立 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>
    
  3. 將您的 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
    
  4. 建立名為 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
    
  5. 使用您選擇的 FTP 用戶端,將 JDBC 驅動程式、jboss-cli-commands.cli、startup_script.sh 和模組定義上傳至 /site/deployments/tools/

  6. 將月臺設定為在容器啟動時執行 startup_script.sh 。 在 Azure 入口網站 中,流覽至 [設定>一般] 設定 > [啟動命令]。 將啟動命令欄位設定為 /home/site/deployments/tools/startup_script.sh,然後選取 [ 儲存]。

  7. 重新啟動 Web 應用程式,這會導致它執行設定腳本。

  8. 更新應用程式的 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 應用程式