在 Azure Red Hat OpenShift 叢集上使用 JBoss EAP 手動部署 Java 應用程式
本文說明如何將 Red Hat JBoss 企業應用程式平臺 (EAP) 應用程式部署至 Azure Red Hat OpenShift 叢集。 這個範例是由 SQL 資料庫支援的 Java 應用程式。 應用程式是使用 JBoss EAP Helm 圖表來部署。
在本指南中,您會了解如何:
- 準備適用於 OpenShift 的 JBoss EAP 應用程式。
- 建立 Azure SQL 資料庫 的單一資料庫實例。
- 由於 Azure OpenShift 尚不支援 Azure 工作負載身分識別,本文仍會使用使用者名稱和密碼進行資料庫驗證,而不是使用無密碼的資料庫連線。
- 使用 JBoss Helm 圖表和 OpenShift Web 控制台,在 Azure Red Hat OpenShift 叢集上部署應用程式
範例應用程式是可設定狀態的應用程式,會將資訊儲存在 HTTP 會話中。 它會使用 JBoss EAP 叢集功能,並使用下列 Jakarta EE 和 MicroProfile 技術:
- Jakarta 伺服器臉部
- Jakarta Enterprise Beans
- Jakarta 持續性
- MicroProfile Health
本文是在 Azure Red Hat OpenShift 叢集上執行 JBoss EAP 應用程式的逐步手動指引。 如需加速 Azure Red Hat OpenShift 叢集旅程的自動化解決方案,請參閱快速入門:使用 Azure 入口網站 在 Azure Red Hat OpenShift 上部署 JBoss EAP。
如果您想要提供意見反應,或與在 Azure 解決方案上開發 JBoss EAP 的工程小組密切合作,請填寫關於 JBoss EAP 移轉的簡短問卷,並包含您的連絡資訊。 專案經理、結構設計師和工程師組成的小組會立即連絡您,以展開緊密合作。
重要
本文會使用 JBoss EAP Helm 圖表來部署應用程式。 在撰寫本文時,這項功能仍會以技術預覽的形式提供。 在生產環境上使用 JBoss EAP Helm 圖表部署應用程式之前,請確定此功能是 JBoss EAP/XP 產品版本的支援功能。
重要
雖然 Azure Red Hat OpenShift 是由 Red Hat 和 Microsoft 共同設計、操作和支援,以提供整合式支持體驗,但您在 Azure Red Hat OpenShift 上執行的軟體,包括本文中所述的軟體,受限於其本身的支持和授權條款。 如需 Azure Red Hat OpenShift 支援的詳細數據,請參閱 Azure Red Hat OpenShift 4 的支援生命週期。 如需本文所述軟體支援的詳細資訊,請參閱本文所列軟體的主頁面。
必要條件
注意
Azure Red Hat OpenShift 至少需要 40 個核心,才能建立和執行 OpenShift 叢集。 新 Azure 訂用帳戶的預設 Azure 資源配額不符合這項需求。 若要要求增加資源限制,請參閱標準配額:透過 VM 序列提升限制。 請注意,免費試用訂用帳戶不符合增加配額的資格,請在要求增加配額之前升級至隨用隨付訂用帳戶。
準備已安裝各種產品支援的類似 Unix 作業系統的本機電腦,例如 Ubuntu、macOS 或 Windows 子系統 Linux 版。
安裝 Java Standard Edition (SE) 實作。 本文中的本機開發步驟已使用 OpenJDK Microsoft組建的 Java 開發工具包 (JDK) 17 進行測試。
安裝 Maven 3.8.6 或更新版本。
安裝 Azure CLI 2.40 或更新版本。
將此示範應用程式的程式代碼 (todo-list) 複製到您的本機系統。 示範應用程式位於 GitHub。
遵循建立 Azure Red Hat OpenShift 4 叢集中的指示。
雖然「取得 Red Hat 提取秘密」步驟已標示為選擇性, 但本文需要此步驟。 提取密碼可讓您的 Azure Red Hat OpenShift 叢集尋找 JBoss EAP 應用程式映像。
如果您打算在叢集上執行需要大量記憶體的應用程式,請使用
--worker-vm-size
參數為背景工作節點指定適當的虛擬機大小。 如需詳細資訊,請參閱遵循連線至 Azure Red Hat OpenShift 4 叢集中的步驟 來連線到叢集。
- 請遵循「安裝 OpenShift CLI」中的步驟
- 使用 OpenShift CLI 與用戶連線到 Azure Red Hat OpenShift 叢集
kubeadmin
執行下列命令來建立此示範應用程式的 OpenShift 專案:
oc new-project eap-demo
執行下列命令,將檢視角色新增至預設服務帳戶。 需要此角色,讓應用程式可以探索其他 Pod,並使用它們設定叢集:
oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
準備應用程式
使用下列命令複製範例應用程式:
git clone https://github.com/Azure-Samples/jboss-on-aro-jakartaee
您複製了 Todo-list
示範應用程式,而本機存放庫位於 分支上 main
。 示範應用程式是簡單的 Java 應用程式,可建立、讀取、更新及刪除 Azure SQL 上的記錄。 您可以在本機電腦上安裝的 JBoss EAP 伺服器上部署此應用程式。 您只需要使用必要的資料庫驅動程式和數據源來設定伺服器。 您也需要可從本機環境存取的資料庫伺服器。
不過,當您以 OpenShift 為目標時,可能會想要修剪 JBoss EAP 伺服器的功能。 例如,您可能想要減少布建伺服器的安全性暴露,並減少整體使用量。 您可能也想要包含一些 MicroProfile 規格,讓您的應用程式更適合在 OpenShift 環境中執行。 當您使用 JBoss EAP 時,完成這項工作的其中一種方式是將應用程式和伺服器封裝在稱為可開機 JAR 的單一部署單位中。 讓我們藉由將必要的變更新增至我們的示範應用程式來執行此動作。
瀏覽至您的示範應用程式本機存放庫,並將分支變更為 bootable-jar
:
## cd jboss-on-aro-jakartaee
git checkout bootable-jar
讓我們快速檢閱我們在此分支中變更的內容:
- 我們已新增
wildfly-jar-maven
外掛程式,以在單一可執行檔 JAR 檔案中布建伺服器和應用程式。 OpenShift 部署單位是具有應用程式的伺服器。 - 在 Maven 外掛程式上,我們指定了一組 Galleon 層。 此設定可讓我們將伺服器功能修剪為僅需要的功能。 如需 Galleon 的完整檔,請參閱 WildFly 檔。
- 我們的應用程式會使用 Jakarta Face 搭配 Ajax 要求,這表示 HTTP 工作階段中儲存的資訊。 如果移除 Pod,我們不想遺失這類資訊。 我們可以將此資訊儲存在用戶端上,並在每個要求上傳回。 不過,在某些情況下,您可能會決定不將特定資訊散發給用戶端。 在此示範中,我們選擇在所有 Pod 複本之間複寫會話。 若要這麼做,我們已將 新增
<distributable />
至web.xml
。 這與伺服器叢集功能一起,可讓 HTTP 會話分散到所有 Pod。 - 我們新增了兩個 MicroProfile 健康情況檢查,可讓您識別應用程式何時上線並準備好接收要求。
在本機執行應用程式
在 OpenShift 上部署應用程式之前,我們會在本機執行應用程式,以確認其運作方式。 下列步驟假設您有 Azure SQL 正在執行,且可從本機環境取得。
若要建立資料庫,請遵循快速入門:建立 Azure SQL 資料庫 單一資料庫中的步驟,但請使用下列替代專案。
- 針對 [ 資源群組 ],請使用您先前建立的資源群組。
- 針對 資料庫名稱 ,請使用
todos_db
。 - 針對 [伺服器管理員登入 ] 使用
azureuser
。 - 針對 [密碼 ] 使用
Passw0rd!
。 - 在 [防火牆規則] 區段中,將 [允許 Azure 服務和資源存取此伺服器] 切換為 [是]。
所有其他設定都可以從連結的文章中安全地使用。
在 [ 其他設定 ] 頁面上,您不需要選擇選項,即可使用範例數據預先填入資料庫,但這樣做不會造成任何傷害。
建立資料庫之後,請從 [概觀] 頁面取得伺服器名稱的值。 將滑鼠停留在 [伺服器名稱] 字段的值上方,然後選取值旁邊出現的複製圖示。 請將此值儲存在一旁以供稍後使用(我們將名為 MSSQLSERVER_HOST
的變數設定為此值)。
注意
為了降低貨幣成本,快速入門會指示讀取器選取無伺服器計算層。 當沒有任何活動時,此層會調整為零。 發生這種情況時,資料庫不會立即回應。 如果在本文中執行步驟時的任何時間點,您都會觀察資料庫問題,請考慮停用自動暫停。 若要瞭解如何,請在 Azure SQL 資料庫 無伺服器中搜尋自動暫停。 在撰寫本文時,下列 AZ CLI 命令會停用本文中所設定資料庫的自動暫停。 az sql db update --resource-group $RESOURCEGROUP --server <Server name, without the .database.windows.net part> --name todos_db --auto-pause-delay -1
請遵循後續步驟,在本機建置並執行應用程式。
建置可開機 JAR。 因為我們正搭配 MS SQL Server 資料庫使用
eap-datasources-galleon-pack
,因此我們必須指定我們想要與這個特定環境變數搭配使用的資料庫驅動程式版本。 如需 和 MS SQL Server 的詳細資訊eap-datasources-galleon-pack
,請參閱 Red Hat 中的檔export MSSQLSERVER_DRIVER_VERSION=7.4.1.jre11 mvn clean package
使用下列命令啟動可開機 JAR。
您必須確定 Azure SQL 資料庫允許此伺服器執行所在的主機的網路流量。 因為您在執行快速入門:建立 Azure SQL 資料庫 單一資料庫中的步驟時選取 [新增目前的用戶端 IP 位址],如果執行伺服器的主機與瀏覽器連線到 Azure 入口網站 所在的主機相同,則應該允許網路流量。 如果執行伺服器的主機是其他一些主機,您必須參閱使用 Azure 入口網站 來管理伺服器層級 IP 防火牆規則。
當我們啟動應用程式時,我們需要傳遞必要的環境變數來設定資料來源:
export MSSQLSERVER_USER=azureuser export MSSQLSERVER_PASSWORD='Passw0rd!' export MSSQLSERVER_JNDI=java:/comp/env/jdbc/mssqlds export MSSQLSERVER_DATABASE=todos_db export MSSQLSERVER_HOST=<server name saved aside earlier> export MSSQLSERVER_PORT=1433 mvn wildfly-jar:run
如果您想要深入瞭解此示範所使用的基礎運行時間, 用於整合數據源 檔的 Galleon Feature Pack 具有可用環境變數的完整清單。 如需功能套件概念的詳細資訊,請參閱 WildFly檔。
如果您收到類似下列範例的文字錯誤:
Cannot open server '<your prefix>mysqlserver' requested by the login. Client with IP address 'XXX.XXX.XXX.XXX' is not allowed to access the server.
此訊息表示您的步驟可確保允許網路流量無法運作。 確定錯誤訊息中的IP位址包含在防火牆規則中。
如果您收到類似下列範例的文字訊息:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: There is already an object named 'TODOS' in the database.
此訊息表示範例數據已在資料庫中。 您可以忽略此訊息。
(選擇性)如果您想要驗證叢集功能,您也可以將 自變數傳遞至可開機 JAR
jboss.node.name
來啟動更多相同應用程式的實例,並避免與埠號碼發生衝突,使用jboss.socket.binding.port-offset
來轉移埠號碼。 例如,若要啟動代表 OpenShift 上新 Pod 的第二個實例,您可以在新的終端機視窗中執行下列命令:export MSSQLSERVER_USER=azureuser export MSSQLSERVER_PASSWORD='Passw0rd!' export MSSQLSERVER_JNDI=java:/comp/env/jdbc/mssqlds export MSSQLSERVER_DATABASE=todos_db export MSSQLSERVER_HOST=<server name saved aside earlier> export MSSQLSERVER_PORT=1433 mvn wildfly-jar:run -Dwildfly.bootable.arguments="-Djboss.node.name=node2 -Djboss.socket.binding.port-offset=1000"
如果您的叢集運作正常,您可以在伺服器主控台記錄上看到類似下列追蹤的追蹤:
INFO [org.infinispan.CLUSTER] (thread-6,ejb,node) ISPN000094: Received new cluster view for channel ejb
注意
根據預設,可開機 JAR 會將 JGroups 子系統設定為使用 UDP 通訊協定,並將訊息傳送至 230.0.0.4 多播位址,以探索其他叢集成員。 若要正確驗證本機電腦上的叢集功能,您的操作系統應該能夠傳送和接收多播數據報,並透過乙太網路介面將其路由傳送至 230.0.0.0.4 IP。 如果您在伺服器記錄上看到與叢集相關的警告,請檢查您的網路設定,並確認它支援該位址上的多播。
在瀏覽器中開啟
http://localhost:8080/
以瀏覽應用程式首頁。 如果您建立更多實體,您可以藉由轉移埠號碼來存取它們,例如http://localhost:9080/
。 應用程式看起來應該類似下圖:檢查應用程式的活躍度和整備程度探查。 OpenShift 會使用這些端點來驗證您的 Pod 是否為實時狀態,並準備好接收使用者要求。
若要檢查活躍狀態,請執行:
curl http://localhost:9990/health/live
您應該會看見下列輸出:
{"status":"UP","checks":[{"name":"SuccessfulCheck","status":"UP"}]}
若要檢查整備狀態,請執行:
curl http://localhost:9990/health/ready
您應該會看見下列輸出:
{"status":"UP","checks":[{"name":"deployments-status","status":"UP","data":{"todo-list.war":"OK"}},{"name":"server-state","status":"UP","data":{"value":"running"}},{"name":"boot-errors","status":"UP"},{"name":"DBConnectionHealthCheck","status":"UP"}]}
按 Control-C 停止應用程式。
部署至 OpenShift
若要部署應用程式,我們將使用 Azure Red Hat OpenShift 中已提供的 JBoss EAP Helm 圖表。 我們也需要提供所需的組態,例如資料庫用戶、資料庫密碼、我們想要使用的驅動程式版本,以及數據源所使用的連接資訊。 下列步驟假設您已從 OpenShift 叢集執行並存取 Azure SQL,並將資料庫使用者名稱、密碼、主機名、埠和資料庫名稱儲存在名為mssqlserver-secret
的 OpenShift OpenShift Secret 物件中。
瀏覽至您的示範應用程式本機存放庫,並將最新分支變更為 bootable-jar-openshift
:
git checkout bootable-jar-openshift
讓我們快速檢閱我們在此分支中變更的內容:
- 我們新增了名為
bootable-jar-openshift
的新 Maven 配置檔,其會準備可開機 JAR 與雲端上執行伺服器的特定設定。 例如,它可讓 JGroups 子系統使用網路要求,使用 KUBE_PING 通訊協定來探索其他 Pod。 - 我們在 jboss-on-aro-jakartaee/deployment 目錄中新增了一組組組態檔。 在此目錄中,您可以找到要部署應用程式的組態檔。
在 OpenShift 上部署應用程式
後續步驟說明如何使用 OpenShift Web 控制台,使用 Helm 圖表來部署應用程式。 使用稱為「秘密」的功能,避免將敏感性值硬式編碼到 Helm 圖表。 秘密只是 name=value 配對的集合,其中值會在需要之前於某些已知位置指定。 在我們的案例中,Helm 圖表會使用兩個秘密,其中包含每個秘密的下列 name=value 組。
mssqlserver-secret
db-host
表示的值MSSQLSERVER_HOST
。db-name
傳達的值MSSQLSERVER_DATABASE
db-password
傳達的值MSSQLSERVER_PASSWORD
db-port
表示的值MSSQLSERVER_PORT
。db-user
表示的值MSSQLSERVER_USER
。
todo-list-secret
app-cluster-password
傳達任意的使用者指定密碼,讓叢集節點可以更安全地形成。app-driver-version
表示的值MSSQLSERVER_DRIVER_VERSION
。app-ds-jndi
表示的值MSSQLSERVER_JNDI
。
建立
mssqlserver-secret
。oc create secret generic mssqlserver-secret \ --from-literal db-host=${MSSQLSERVER_HOST} \ --from-literal db-name=${MSSQLSERVER_DATABASE} \ --from-literal db-password=${MSSQLSERVER_PASSWORD} \ --from-literal db-port=${MSSQLSERVER_PORT} \ --from-literal db-user=${MSSQLSERVER_USER}
建立
todo-list-secret
。export MSSQLSERVER_DRIVER_VERSION=7.4.1.jre11 oc create secret generic todo-list-secret \ --from-literal app-cluster-password=mut2UTG6gDwNDcVW \ --from-literal app-driver-version=${MSSQLSERVER_DRIVER_VERSION} \ --from-literal app-ds-jndi=${MSSQLSERVER_JNDI}
開啟 OpenShift 控制台並瀏覽至開發人員檢視。 您可以執行此命令來探索 OpenShift 叢集的主控台 URL。 使用您從上一個步驟取得的
kubeadmin
userid和密碼登入。az aro show \ --name $CLUSTER \ --resource-group $RESOURCEGROUP \ --query "consoleProfile.url" \ --output tsv
<從瀏覽窗格頂端的下拉功能表中選取 />開發人員檢視方塊。
在 / 開發人員檢視方塊中,從 [專案] 下拉功能表中選取 eap-demo 專案。><
選取 [+新增] 。 在 [ 開發人員類別目錄] 區段中,選取 [Helm 圖表]。 您會抵達 Azure Red Hat OpenShift 叢集上可用的 Helm 圖表目錄。 在 [ 依關鍵詞 篩選] 方塊中,輸入 eap。 您應該會看到數個選項,如下所示:
因為我們的應用程式使用 MicroProfile 功能,所以我們選取 EAP Xp 的 Helm 圖表。 代表
Xp
擴充套件。 透過 JBoss 企業應用程式平臺擴充套件,開發人員可以使用 Eclipse MicroProfile 應用程式開發介面(API)來建置和部署微服務型應用程式。選取 JBoss EAP XP 4 Helm 圖表,然後選取 [安裝 Helm 圖表]。
此時,我們需要設定圖表來建置和部署應用程式:
將發行的名稱變更為 eap-todo-list-demo。
我們可以使用窗體檢視或 YAML 檢視來設定 Helm 圖表。 在標示為 [ 透過設定] 的區段中,選取 [ YAML 檢視]。
變更 YAML 內容以設定 Helm Chart,方法是複製並貼上 deployment/application/todo-list-helm-chart.yaml 可用的 Helm Chart 檔案內容,而不是現有的內容:
此內容會參考您稍早設定的秘密。
最後,選取 [ 安裝] 以啟動應用程式部署。 此動作會 開啟拓撲 檢視,其中包含 Helm 版本的圖形表示法(名為 eap-todo-list-demo),以及其相關聯的資源。
Helm Release (縮寫 HR) 名為 eap-todo-list-demo。 它包含名為 eap-todo-list-demo 的部署資源(縮寫 D)。
如果您在 D 方塊左下方的圓形中選取具有兩個箭號的圖示,則會帶您前往 [記錄] 窗格。 您可以在這裏觀察組建的進度。 若要返回拓撲檢視,請選取 左側瀏覽窗格中的 [拓撲 ]。
建置完成時,左下角圖示會顯示綠色複選
部署完成時,圓形外框為深藍色。 如果您將滑鼠停留在深藍色上方,您應該會看到一則訊息,指出類似
3 Running
。 當您看到該訊息時,您可以從與部署相關聯的路由移至應用程式 URL(使用右上方圖示)。應用程式會在瀏覽器中開啟,看起來類似下圖,可供使用:
應用程式會顯示提供資訊之 Pod 的名稱。 若要確認叢集功能,您可以新增一些 Todos。 然後,使用
oc delete pod <pod-name>
在應用程式上出現的 [伺服器主機名] 字段中,刪除名稱為的 Pod。 刪除 Pod 之後,請在相同的應用程式視窗上建立新的 Todo。 您可以看到新的 Todo 是透過 Ajax 要求新增,而 [ 伺服器主機名 ] 字段現在會顯示不同的名稱。 在幕後,OpenShift 負載平衡器會分派新的要求,並將它傳遞給可用的 Pod。 Jakarta Face 檢視會從儲存在處理要求的 Pod 中的 HTTP 會話複本還原。 事實上,您可以看到 [會話標識符 ] 字段沒有變更。 如果會話未跨 Pod 複寫,您會收到 Jakarta FaceViewExpiredException
,而且您的應用程式無法如預期般運作。
清除資源
刪除應用程式
如果您只想要刪除應用程式,您可以開啟 OpenShift 控制台,然後在開發人員檢視中瀏覽至 Helm 選單選項。 在此功能表上,您可以看到叢集上安裝的所有 Helm 圖表版本。
找出 eap-todo-list-demo Helm 圖表,並在數據列結尾選取樹狀結構垂直點,以開啟動作內容功能表項。
選取 [卸載 Helm 版本 ] 以移除應用程式。 請注意,用來提供應用程式組態的秘密物件不是圖表的一部分。 如果您不再需要它,則必須將其分開移除。
如果您要刪除儲存應用程式群組態的秘密,請執行下列命令:
$ oc delete secrets/todo-list-secret
# secret "todo-list-secret" deleted
刪除 OpenShift 專案
您也可以刪除專案,以刪除 eap-demo
為此示範建立的所有組態。 若要這樣做,請執行下列命令:
$ oc delete project eap-demo
# project.project.openshift.io "eap-demo" deleted
刪除 Azure Red Hat OpenShift 叢集
遵循教學課程:刪除 Azure Red Hat OpenShift 4 叢集中的步驟 ,刪除 Azure Red Hat OpenShift 叢集。
刪除資源群組
如果您想要刪除上述步驟所建立的所有資源,請刪除您為 Azure Red Hat OpenShift 叢集建立的資源群組。
下一步
您可以從本指南中使用的參考深入瞭解:
繼續探索在 Azure 上執行 JBoss EAP 的選項。