教程:在 Azure 虚拟机(VM)上手动安装 JBoss EAP

本教程介绍了在 Red Hat Enterprise Linux(RHEL)上安装 Red Hat JBoss Enterprise 应用程序平台(EAP)并在 Azure 虚拟机(VM)上配置群集的步骤。

本教程介绍如何执行以下任务:

  • 创建自定义虚拟网络并在网络中创建 VM。
  • 使用手动命令行在 VM 上安装所需的 JDK 和 Red Hat JBoss EAP。
  • 使用命令行接口(CLI)在域模式下配置 Red Hat JBoss EAP 群集。
  • 在群集中配置 PostgreSQL 数据源连接。
  • 在群集中部署并运行示例 Java EE 应用程序。
  • 通过Azure 应用程序网关向公共 Internet 公开应用程序。
  • 验证成功配置。

如果你更喜欢代表 GNU/Linux VM 执行所有这些步骤的完全自动化解决方案,请直接从Azure 门户参阅快速入门:在 Azure 虚拟机(VM)上部署 JBoss EAP 群集。

如果你有兴趣提供反馈或与开发 Azure 上的 JBoss EAP 解决方案的工程团队就迁移方案展开密切合作,请填写这份简短的 Boss EAP 迁移调查并提供你的联系信息。 项目经理、架构师和工程师团队会及时与你联系,以开展密切合作。

注意

本文包含对术语“从属”的引用,这是 Microsoft 不再使用的术语。 在从软件中删除该术语后,我们会将其从本文中删除。

先决条件

  • Azure 订阅。 如果还没有 Azure 订阅,可以在开始前创建一个免费帐户

  • 安装 Azure CLI 2.51.0 或更高版本 以运行 Azure CLI 命令。

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展
    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade
  • 确保拥有必要的 Red Hat 许可证。 需要拥有 Red Hat 订阅管理(RHSM)的 Red Hat 帐户(RHSM)权利才能获得 Red Hat JBoss EAP。 此权利允许完全自动化的解决方案(在快速入门:在 Azure 虚拟机(VM)上部署 JBoss EAP 群集)安装经过测试和认证的 JBoss EAP 版本。

    注意

    如果你没有 EAP 权利,可以通过适用于个人的 Red Hat 开发人员订阅注册免费的开发人员订阅。 将帐户详细信息保存为下一部分中的 RHSM 用户名RHSM 密码

  • 如果已注册或完成注册后,可以使用以下步骤找到所需的凭据(池 ID)。 后续步骤中,这些 池 ID 还用作 具有 EAP 权利 的 RHSM 池 ID。

    1. 登录到你的 Red Hat 帐户

    2. 首次登录时,系统会提示你完成个人资料。 根据使用情况,选择 “个人 ”或 “公司 帐户 类型”,如以下屏幕截图所示:

      Red Hat 帐户窗口的屏幕截图,其中显示了“个人”选项的“帐户类型”选项。

    3. 打开 个人 Red Hat 开发人员订阅。 此链接可访问你的帐户中相应 SKU 的所有订阅。

    4. 在“所有已购买的订阅”表下的控件行中,选择“活动”。

    5. 选择结束日期可排序列标题,直到将来最远的值显示为第一行。

    6. 选择第一行。 然后,从池 ID 复制并保存以下主池的值。

  • Java 开发工具包 (JDK),版本 11。 在本指南中,建议 使用 OpenJDK 的 Red Hat 内部版本。 确保在运行命令的 shell 中正确设置 JAVA_HOME 环境变量。

  • Git;用于 git --version 测试是否 git 正常工作。 本教程已使用版本 2.25.1 进行测试。

  • Maven;用于 mvn -version 测试是否 mvn 正常工作。 本教程已使用版本 3.6.3 进行测试。

准备环境

在本部分中,将设置在其中安装 JDK、Red Hat JBoss EAP 和 PostgreSQL Java 数据库连接(JDBC)驱动程序的基础结构。

假设

本教程在域模式下配置 Red Hat JBoss EAP 群集,总共在三台 VM 上配置了一台管理服务器和两个托管服务器。 若要配置群集,需要创建以下三个 Azure VM:

  • 管理员 VM(VM 名称 adminVM)以域控制器身份运行。
  • 两个托管 VM(VM 名称和mspVM1mspVM2)作为主机控制器运行。

登录 Azure

如果尚未登录,请使用 az login 命令并按照屏幕上的说明登录到 Azure 订阅。

az login

注意

如果有多个 Azure 租户与 Azure 凭据相关联,则必须指定要登录的租户。 可以使用此选项 --tenant 执行此操作。 例如 az login --tenant contoso.onmicrosoft.com

创建资源组

使用 az group create 创建资源组。 资源组名称在订阅中必须全局唯一。 因此,请考虑将一些唯一标识符追加到创建的任何必须唯一的名称。 一种有用的方法是使用首字母缩写,后跟今天的日期(格式为 mmdd)。 此示例创建一个名为位置的westus资源组abc1110rg

az group create \
    --name abc1110rg \
    --location westus

创建虚拟网络

由 Red Hat JBoss EAP 群集组成的资源必须使用虚拟网络相互通信,以及公共 Internet。 有关规划虚拟网络的完整指南,请参阅 Azure 指南规划虚拟网络云采用框架。 有关详细信息,请参阅 Azure 虚拟网络常见问题

本部分中的示例创建具有地址空间 192.168.0.0/16 的虚拟网络,并创建用于 VM 的子网。

首先,使用 az network vnet create 创建虚拟网络。 以下示例创建一个名为 myVNet

az network vnet create \
    --resource-group abc1110rg \
    --name myVNet \
    --address-prefixes 192.168.0.0/24

使用 az network vnet subnet create 为 Red Hat JBoss EAP 群集创建子网。 以下示例创建名为 mySubnet 的子网:

az network vnet subnet create \
    --resource-group abc1110rg \
    --name mySubnet \
    --vnet-name myVNet \
    --address-prefixes 192.168.0.0/25

使用 az network vnet subnet create 为 应用程序网关 创建子网。 以下示例创建名为 jbossVMGatewaySubnet 的子网:

az network vnet subnet create \
    --resource-group abc1110rg \
    --name jbossVMGatewaySubnet \
    --vnet-name myVNet \
    --address-prefixes 192.168.0.128/25

创建网络安全组并向其分配子网

在使用公共 IP 创建 VM 之前,请创建网络安全组(NSG),以保护之前创建的虚拟网络和子网。

使用 az network nsg create 创建网络安全组。 以下示例创建名为 mynsg的网络安全组:

az network nsg create \
    --resource-group abc1110rg \
    --name mynsg

使用 az network nsg rule create 创建网络安全组规则。 以下示例创建名为 ALLOW_APPGW 的网络安全组规则。ALLOW_HTTP_ACCESS 这些规则允许应用网关接受 Red Hat JBoss EAP 使用的 HTTP 端口上的入站流量:

az network nsg rule create \
    --resource-group abc1110rg \
    --nsg-name mynsg \
    --name ALLOW_APPGW \
    --protocol Tcp \
    --destination-port-ranges 65200-65535 \
    --source-address-prefix GatewayManager \
    --destination-address-prefix '*' \
    --access Allow \
    --priority 500 \
    --direction Inbound

az network nsg rule create \
    --resource-group abc1110rg \
    --nsg-name mynsg \
    --name ALLOW_HTTP_ACCESS \
    --protocol Tcp \
    --destination-port-ranges 22 80 443 9990 8080 \
    --source-address-prefix Internet \
    --destination-address-prefix '*' \
    --access Allow \
    --priority 510 \
    --direction Inbound

使用 az network vnet subnet update 将之前创建的子网关联到此网络安全组,如以下示例所示:

az network vnet subnet update \
    --resource-group abc1110rg \
    --vnet-name myVNet \
    --name mySubnet \
    --network-security-group mynsg

az network vnet subnet update \
    --resource-group abc1110rg \
    --vnet-name myVNet \
    --name jbossVMGatewaySubnet \
    --network-security-group mynsg

为管理员创建 Red Hat Enterprise Linux 计算机

创建管理员 VM

用于创建 VM 的市场映像是 RedHat:rhel-raw:86-gen2:latest。 有关其他映像,请参阅 Azure 中提供的 Red Hat Enterprise Linux (RHEL) 映像。

注意

可以使用 az vm image list 命令查询 Red Hat 提供的所有可用 Red Hat Enterprise Linux 映像,例如: az vm image list --offer RHEL --publisher RedHat --output table --all 有关详细信息,请参阅 Red Hat Enterprise Linux 映像概述。

如果使用其他映像,可能需要安装额外的库才能启用本指南中使用的基础结构。

创建基本 VM,在它上安装所有必需的工具,拍摄其快照,然后基于快照创建副本。

运行 az vm create 创建 VM。 在此 VM 上运行管理服务器。

以下示例使用用于身份验证的用户名和密码对创建 Red Hat Enterprise Linux VM。 如果需要,可以改用 TLS/SSL 身份验证。

az vm create \
    --resource-group abc1110rg \
    --name adminVM \
    --image RedHat:rhel-raw:86-gen2:latest \
    --size Standard_DS1_v2  \
    --admin-username azureuser \
    --admin-password Secret123456 \
    --public-ip-sku Standard \
    --nsg mynsg \
    --vnet-name myVnet \
    --subnet mySubnet

安装 OpenJDK 11 和 Red Hat JBoss EAP 7.4

使用以下步骤进行安装:

  1. 使用以下命令获取公共 IP:adminVM

    export ADMIN_VM_PUBLIC_IP=$(az vm show \
        --resource-group abc1110rg \
        --name adminVM \
        --show-details \
        --query publicIps | tr -d '"')
    
  2. 使用以下命令打开终端并 SSH 连接到 adminVM 该终端:

    ssh azureuser@$ADMIN_VM_PUBLIC_IP
    
  3. 以密码的形式提供 Secret123456

  4. 使用以下命令为端口配置防火墙:

    sudo firewall-cmd --zone=public --add-port={9999/tcp,8443/tcp,8009/tcp,8080/tcp,9990/tcp,9993/tcp,45700/tcp,7600/tcp} --permanent
    sudo firewall-cmd --reload
    sudo iptables-save
    

    前两个命令后应会看到该单词 success 。 第三个命令后,应会看到类似于以下示例的输出:

    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *filter
    :INPUT ACCEPT [20:3546]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [24:5446]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *security
    :INPUT ACCEPT [19:3506]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [5:492]
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m owner --uid-owner 0 -j ACCEPT
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m conntrack --ctstate INVALID,NEW -j DROP
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *raw
    :PREROUTING ACCEPT [20:3546]
    :OUTPUT ACCEPT [24:5446]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *mangle
    :PREROUTING ACCEPT [20:3546]
    :INPUT ACCEPT [20:3546]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [24:5446]
    :POSTROUTING ACCEPT [24:5446]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *nat
    :PREROUTING ACCEPT [1:40]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [4:240]
    :OUTPUT ACCEPT [4:240]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    
  5. 使用以下命令将管理员主机注册到 Red Hat 订阅管理(RHSM)帐户:

    export RHSM_USER=<your-rhsm-username>
    export RHSM_PASSWORD='<your-rhsm-password>'
    export EAP_POOL=<your-rhsm-pool-ID>
    
    sudo subscription-manager register --username ${RHSM_USER} --password ${RHSM_PASSWORD} --force
    

    应会看到与如下示例类似的输出:

    Registering to: subscription.rhsm.redhat.com:443/subscription
    The system has been registered with ID: redacted
    The registered system name is: adminVM
    
  6. 使用以下命令将管理员主机附加到 Red Hat JBoss EAP 池:

    sudo subscription-manager attach --pool=${EAP_POOL}
    

    注意

    如果使用 简单内容访问 模式,将忽略此命令。

  7. 使用以下命令安装 OpenJDK 11:

    sudo yum install java-11-openjdk -y
    

    应会看到许多输出行,以结尾 Complete!

  8. 使用以下命令安装 Red Hat JBoss EAP 7.4:

    sudo subscription-manager repos --enable=jb-eap-7.4-for-rhel-8-x86_64-rpms
    sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'
    sudo yum groupinstall -y jboss-eap7
    

    对于第二个和第三个命令,应会看到许多输出行,以结尾 Complete!

  9. 使用以下命令设置权限和网络配置:

    sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
    echo 'AllowTcpForwarding no' | sudo tee -a /etc/ssh/sshd_config
    sudo systemctl restart sshd
    
  10. 使用以下命令配置环境变量:

    echo 'export EAP_RPM_CONF_DOMAIN="/etc/opt/rh/eap7/wildfly/eap7-domain.conf"' >> ~/.bash_profile
    echo 'export EAP_HOME="/opt/rh/eap7/root/usr/share"' >> ~/.bash_profile
    source ~/.bash_profile
    sudo touch /etc/profile.d/eap_env.sh
    echo 'export EAP_HOME="/opt/rh/eap7/root/usr/share"' | sudo tee -a /etc/profile.d/eap_env.sh
    
  11. 通过键入退出退出 SSH 连接。

为托管服务器创建计算机

你安装了 OpenJDK 11 和 Red Hat JBoss EAP 7.4 adminVM,该版本作为域控制器服务器运行。 你仍然需要准备计算机来运行两台主机控制器服务器。 接下来,创建一个快照, adminVM 并为两个托管的分机准备计算机, mspVM1 以及 mspVM2

本部分介绍使用快照 adminVM准备计算机的方法。 返回到已登录 Azure CLI 的终端,然后使用以下步骤:

  1. 使用以下命令停止 adminVM

    az vm stop --resource-group abc1110rg --name adminVM
    
  2. 使用 az snapshot create 创建 OS 磁盘的 adminVM 快照,如以下示例所示:

    export ADMIN_OS_DISK_ID=$(az vm show \
        --resource-group abc1110rg \
        --name adminVM \
        --query storageProfile.osDisk.managedDisk.id \
        --output tsv)
    az snapshot create \
        --resource-group abc1110rg \
        --name myAdminOSDiskSnapshot \
        --source ${ADMIN_OS_DISK_ID}
    
  3. 使用以下命令启动 adminVM

    az vm start --resource-group abc1110rg --name adminVM
    
    
  4. 使用以下步骤创建 mspVM1

    1. 首先,使用 az disk create 创建托管磁盘mspVM1

      #Get the snapshot ID
      export SNAPSHOT_ID=$(az snapshot show \
          --name myAdminOSDiskSnapshot \
          --resource-group abc1110rg \
          --query '[id]' \
          --output tsv)
      
      #Create a new Managed Disks using the snapshot Id
      #Note that managed disk is created in the same location as the snapshot
      az disk create \
          --resource-group abc1110rg \
          --name mspVM1_OsDisk_1 \
          --source ${SNAPSHOT_ID}
      
    2. 接下来,使用以下命令创建 VM mspVM1并附加 OS 磁盘 mspVM1_OsDisk_1

      #Get the resource Id of the managed disk
      export MSPVM1_DISK_ID=$(az disk show \
          --name mspVM1_OsDisk_1 \
          --resource-group abc1110rg \
          --query '[id]' \
          --output tsv)
      
      #Create VM by attaching existing managed disks as OS
      az vm create \
          --resource-group abc1110rg \
          --name mspVM1 \
          --attach-os-disk ${MSPVM1_DISK_ID} \
          --os-type linux \
          --public-ip-sku Standard \
          --nsg mynsg \
          --vnet-name myVnet \
          --subnet mySubnet
      
    3. 使用 OpenJDK 11 和 Red Hat JBoss EAP 7.4 安装创建 mspVM1 。 由于 VM 是从 OS 磁盘的 adminVM 快照创建的,因此这两个 VM 具有相同的主机名。 使用 az vm run-command 调用 将主机名更改为值 mspVM1

      az vm run-command invoke \
          --resource-group abc1110rg \
          --name mspVM1 \
          --command-id RunShellScript \
          --scripts "sudo hostnamectl set-hostname mspVM1"
      

      命令成功完成后,会看到类似于以下示例的输出:

      {
          "value": [
              {
              "code": "ProvisioningState/succeeded",
              "displayStatus": "Provisioning succeeded",
              "level": "Info",
              "message": "Enable succeeded: \n[stdout]\n\n[stderr]\n",
              "time": null
              }
          ]
      }
      
  5. 使用相同的命令创建 mspVM2

    #Create a new Managed Disks for mspVM2
    az disk create \
        --resource-group abc1110rg \
        --name mspVM2_OsDisk_1 \
        --source ${SNAPSHOT_ID}
    
    #Get the resource Id of the managed disk
    export MSPVM2_DISK_ID=$(az disk show \
        --name mspVM2_OsDisk_1 \
        --resource-group abc1110rg \
        --query '[id]' \
        --output tsv)
    
    #Create VM by attaching existing managed disks as OS
    az vm create \
        --resource-group abc1110rg \
        --name mspVM2 \
        --attach-os-disk ${MSPVM2_DISK_ID} \
        --os-type linux \
        --public-ip-sku Standard \
        --nsg mynsg \
        --vnet-name myVnet \
        --subnet mySubnet
    
    #Set hostname
    az vm run-command invoke \
        --resource-group abc1110rg \
        --name mspVM2 \
        --command-id RunShellScript \
        --scripts "sudo hostnamectl set-hostname mspVM2"
    

使用以下命令获取并显示专用 IP 地址,稍后部分将用到这些地址:

export ADMINVM_NIC_ID=$(az vm show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name adminVM \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export ADMINVM_IP=$(az network nic show \
    --ids ${ADMINVM_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
export MSPVM1_NIC_ID=$(az vm show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name mspVM1 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM1_IP=$(az network nic show \
    --ids ${MSPVM1_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
export MSPVM2_NIC_ID=$(az vm show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name mspVM2 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM2_IP=$(az network nic show \
    --ids ${MSPVM2_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
echo "Private IP of adminVM: ${ADMINVM_IP}"
echo "Private IP of mspVM1: ${MSPVM1_IP}"
echo "Private IP of mspVM2: ${MSPVM2_IP}"

现在,所有三台计算机都已准备就绪。 接下来,在托管域模式下配置 Red Hat JBoss EAP 群集。

配置托管域和群集

配置启用了会话复制的群集。 有关详细信息,请参阅 会话复制

若要启用会话复制,请使用群集的 Red Hat JBoss EAP 高可用性。 Microsoft Azure 不支持基于多播的 JGroups 发现协议。 尽管可以使用其他 JGroups 发现协议(如静态配置()、共享数据库(TCPPINGJDBC_PING)、基于共享文件系统的 ping(FILE_PINGTCPGOSSIP),但我们强烈建议使用为 Azure 开发的共享文件发现协议: AZURE_PING 有关详细信息,请参阅 Microsoft Azure 中使用 JBoss EAP 高可用性。

为 AZURE_PING 创建 Azure 存储帐户和 Blob 容器

使用以下命令创建存储帐户和 Blob 容器:

# Define your storage account name
export STORAGE_ACCOUNT_NAME=azurepingstgabc1110rg
# Define your Blob container name
export CONTAINER_NAME=azurepingcontainerabc1110rg

# Create storage account
az storage account create \
    --resource-group abc1110rg \
    --name ${STORAGE_ACCOUNT_NAME} \
    --location westus \
    --sku Standard_LRS \
    --kind StorageV2 \
    --access-tier Hot

然后,使用以下命令检索存储帐户密钥供以后使用。 如果看到错误,请等待几分钟,然后重试。 尚未完成用于创建存储帐户的上一个命令。

export STORAGE_ACCESS_KEY=$(az storage account keys list \
    --resource-group abc1110rg \
    --account-name ${STORAGE_ACCOUNT_NAME} \
    --query "[0].value" \
    --output tsv)

# Create blob container
az storage container create \
    --name ${CONTAINER_NAME} \
    --account-name ${STORAGE_ACCOUNT_NAME} \
    --account-key ${STORAGE_ACCESS_KEY}

应会看到以下输出:

{
  "created": true
}

配置域控制器(管理员节点)

本教程使用 Red Hat JBoss EAP 管理 CLI 命令配置域控制器。 有关详细信息,请参阅 管理 CLI 指南

以下步骤在上 adminVM设置域控制器配置。 使用 SSH 以用户身份azureuser连接到adminVM该用户。 回想一下,以前捕获到环境变量中的ADMIN_VM_PUBLIC_IP公共 IP 地址adminVM

ssh azureuser@$ADMIN_VM_PUBLIC_IP

首先,使用以下命令使用协议配置 HA 配置文件和 JGroups AZURE_PING

export HOST_VM_IP=$(hostname -I)
export STORAGE_ACCOUNT_NAME=azurepingstgabc1110rg
export CONTAINER_NAME=azurepingcontainerabc1110rg
export STORAGE_ACCESS_KEY=<the-value-from-before-you-connected-with-SSH>


#-Configure the HA profile and JGroups using AZURE_PING protocol
sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --echo-command \
'embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-master.xml',\
':write-attribute(name=name,value=domain1)',\
'/profile=ha/subsystem=jgroups/stack=tcp:remove',\
'/profile=ha/subsystem=jgroups/stack=tcp:add()',\
'/profile=ha/subsystem=jgroups/stack=tcp/transport=TCP:add(socket-binding=jgroups-tcp,properties={ip_mcast=false})',\
"/profile=ha/subsystem=jgroups/stack=tcp/protocol=azure.AZURE_PING:add(properties={storage_account_name=\"${STORAGE_ACCOUNT_NAME}\", storage_access_key=\"${STORAGE_ACCESS_KEY}\", container=\"${CONTAINER_NAME}\"})",\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MERGE3:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_SOCK:add(socket-binding=jgroups-tcp-fd)',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_ALL:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=VERIFY_SUSPECT:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.NAKACK2:add(properties={use_mcast_xmit=false,use_mcast_xmit_req=false})',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=UNICAST3:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.STABLE:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.GMS:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MFC:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FRAG3:add',\
'/profile=ha/subsystem=jgroups/channel=ee:write-attribute(name="stack", value="tcp")',\
'/server-group=main-server-group:write-attribute(name="profile", value="ha")',\
'/server-group=main-server-group:write-attribute(name="socket-binding-group", value="ha-sockets")',\
"/host=master/subsystem=elytron/http-authentication-factory=management-http-authentication:write-attribute(name=mechanism-configurations,value=[{mechanism-name=DIGEST,mechanism-realm-configurations=[{realm-name=ManagementRealm}]}])",\
"/host=master/interface=unsecure:add(inet-address=${HOST_VM_IP})",\
"/host=master/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})",\
"/host=master/interface=public:add(inet-address=${HOST_VM_IP})"

# Save a copy of the domain.xml, later you need to share it with all host controllers
cp $EAP_HOME/wildfly/domain/configuration/domain.xml /tmp/domain.xml

输出的最后一个部分应类似于以下示例。 如果没有,请在继续操作之前进行故障排除并解决问题。

[domain@embedded /] /host=master/interface=public:add(inet-address=192.168.0.4 )
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined,
    "response-headers" => {"process-state" => "reload-required"}
}
02:05:55,019 INFO  [org.jboss.as] (MSC service thread 1-1) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 28ms

然后,使用以下命令配置 JBoss 服务器并设置 EAP 服务:

# Configure the JBoss server and setup EAP service
echo 'WILDFLY_HOST_CONFIG=host-master.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN

# Configure JBoss EAP management user
export JBOSS_EAP_USER=jbossadmin
export JBOSS_EAP_PASSWORD=Secret123456
sudo $EAP_HOME/wildfly/bin/add-user.sh  -u $JBOSS_EAP_USER -p $JBOSS_EAP_PASSWORD -g 'guest,mgmtgroup'

输出应类似于以下示例:

Added user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-users.properties'
Added user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-users.properties'
Added user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-groups.properties'
Added user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-groups.properties'

最后,使用以下命令启动 EAP 服务:

# Start the JBoss server and setup EAP service
sudo systemctl enable eap7-domain.service

# Edit eap7-domain.services
sudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service
sudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service

# Reload and restart EAP service
sudo systemctl daemon-reload
sudo systemctl restart eap7-domain.service

# Check the status of EAP service
systemctl status eap7-domain.service

输出应类似于以下示例:

● eap7-domain.service - JBoss EAP (domain mode)
   Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>
   Active: active (running) since Thu 2023-03-30 02:11:44 UTC; 5s ago
 Main PID: 3855 (scl)
    Tasks: 82 (limit: 20612)
   Memory: 232.4M
   CGroup: /system.slice/eap7-domain.service
           ├─3855 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>
           ├─3856 /bin/bash /var/tmp/sclfYu7yW
           ├─3858 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>
           ├─3862 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>
           ├─3955 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>
           └─3967 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>

Mar 30 02:11:44 adminVM systemd[1]: Started JBoss EAP (domain mode).

键入 q 退出寻呼程序。 通过键入退出退出 SSH 连接。

启动 Red Hat JBoss EAP 服务后,可以通过 Web 浏览器中访问管理控制台http://$ADMIN_VM_PUBLIC_IP:9990。 使用配置的用户名和密码jbossadminSecret123456登录。

Red Hat JBoss Enterprise Application Platform 域控制器管理控制台的屏幕截图。

选择“运行时”选项卡。在导航窗格中,选择“拓扑”。 此时,群集应仅包含一个域控制器:

Red Hat JBoss Enterprise Application Platform 的屏幕截图,其中显示了“运行时”选项卡和“仅包含域控制器的拓扑”窗格。

配置主机控制器(工作器节点)

使用 SSH 作为用户进行mspVM1azureuser连接。 使用以下命令获取 VM 的公共 IP 地址:

MSPVM_PUBLIC_IP=$(az vm show \
    --resource-group abc1110rg \
    --name mspVM1 \
    --show-details \
    --query publicIps)

ssh azureuser@$MSPVM_PUBLIC_IP

请记住密码与以前相同,因为 mspVM1 只是克隆密码 adminVM

使用以下命令设置主机控制器 mspVM1

# environment variables
export DOMAIN_CONTROLLER_PRIVATE_IP=<adminVM-private-IP>
export HOST_VM_NAME=$(hostname)
export HOST_VM_NAME_LOWERCASE=$(echo "${HOST_VM_NAME,,}")
export HOST_VM_IP=$(hostname -I)

export JBOSS_EAP_USER=jbossadmin
export JBOSS_EAP_PASSWORD=Secret123456

# Save default domain configuration as backup
sudo -u jboss mv $EAP_HOME/wildfly/domain/configuration/domain.xml $EAP_HOME/wildfly/domain/configuration/domain.xml.backup

# Fetch domain.xml from domain controller
sudo -u jboss scp azureuser@${DOMAIN_CONTROLLER_PRIVATE_IP}:/tmp/domain.xml $EAP_HOME/wildfly/domain/configuration/domain.xml

系统要求你输入连接的密码。 对于此示例,密码为 Secret123456

使用以下命令将主机控制器更改应用到 mspVM1

# Setup host controller
sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --echo-command \
"embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-slave.xml",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-one:remove",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-two:remove",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=${HOST_VM_NAME_LOWERCASE}-server0:add(group=main-server-group)",\
"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-configuration=slave:add(authentication-name=${JBOSS_EAP_USER}, credential-reference={clear-text=${JBOSS_EAP_PASSWORD}})",\
"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-context=slave-context:add(match-rules=[{authentication-configuration=slave}])",\
"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote.username, value=${JBOSS_EAP_USER})",\
"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote, value={host=${DOMAIN_CONTROLLER_PRIVATE_IP}, port=9990, protocol=remote+http, authentication-context=slave-context})",\
"/host=${HOST_VM_NAME_LOWERCASE}/core-service=discovery-options/static-discovery=primary:write-attribute(name=host, value=${DOMAIN_CONTROLLER_PRIVATE_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=unsecured:add(inet-address=${HOST_VM_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=public:write-attribute(name=inet-address, value=${HOST_VM_IP})"

输出的最后一个部分应类似于以下示例。 如果没有,请在继续操作之前进行故障排除并解决问题。

[domain@embedded /] /host=mspvm1/interface=public:write-attribute(name=inet-address, value=192.168.0.5 )
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined,
    "response-headers" => {"process-state" => "reload-required"}
}
02:58:59,388 INFO  [org.jboss.as] (MSC service thread 1-2) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 58ms

然后,使用以下命令配置 JBoss 服务器并设置 EAP 服务:

echo 'WILDFLY_HOST_CONFIG=host-slave.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN

# Enable the JBoss server and setup EAP service
sudo systemctl enable eap7-domain.service

# Edit eap7-domain.services
sudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service
sudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service

# Reload and restart EAP service
sudo systemctl daemon-reload
sudo systemctl restart eap7-domain.service

# Check the status of EAP service
systemctl status eap7-domain.service

输出应类似于以下示例:

● eap7-domain.service - JBoss EAP (domain mode)
   Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>
   Active: active (running) since Thu 2023-03-30 03:02:15 UTC; 7s ago
 Main PID: 9699 (scl)
    Tasks: 51 (limit: 20612)
   Memory: 267.6M
   CGroup: /system.slice/eap7-domain.service
           ├─9699 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>
           ├─9700 /bin/bash /var/tmp/sclgJ1hRD
           ├─9702 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>
           ├─9706 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>
           ├─9799 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>
           └─9811 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>

Mar 30 03:02:15 mspVM1 systemd[1]: Started JBoss EAP (domain mode).

键入 q 退出寻呼程序。 通过键入退出退出 SSH 连接。

使用 SSH 作为用户进行mspVM2azureuser连接。 使用以下命令获取 VM 的公共 IP 地址:

az vm show \
    --resource-group abc1110rg \
    --name mspVM2 \
    --show-details \
    --query publicIps

重复上述步骤 mspVM2,然后通过键入 退出退出退出来退出 SSH 连接。

连接到 adminVM两个主机控制器后,应能够看到群集拓扑,如以下屏幕截图所示:

Red Hat JBoss Enterprise Application Platform 的屏幕截图,其中显示了“运行时”选项卡和包含所有主机的“拓扑”窗格。

使用 Azure 应用程序网关 公开 Red Hat JBoss EAP 群集

在 Azure VM 上创建了群集后,本部分将指导你使用 Azure 应用程序网关 向 Internet 公开 JBoss EAP。

创建 Azure 应用程序网关

若要向 Internet 公开 Red Hat JBoss EAP,需要公共 IP 地址。 创建公共 IP 地址,然后将Azure 应用程序网关与其相关联。 使用 az network public-ip create 创建它,如以下示例所示:

az network public-ip create \
    --resource-group abc1110rg \
    --name myAGPublicIPAddress \
    --allocation-method Static \
    --sku Standard

接下来,将后端服务器添加到应用程序网关后端池。 使用以下命令查询后端 IP 地址。 只有主机控制器(工作节点)配置为后端服务器。

export MSPVM1_NIC_ID=$(az vm show \
    --resource-group abc1110rg \
    --name mspVM1 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM1_IP=$(az network nic show \
    --ids ${MSPVM1_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
export MSPVM2_NIC_ID=$(az vm show \
    --resource-group abc1110rg \
    --name mspVM2 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM2_IP=$(az network nic show \
    --ids ${MSPVM2_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)

接下来,创建Azure 应用程序网关。 以下示例在默认后端池中创建具有主机控制器的应用程序网关:

az network application-gateway create \
    --resource-group abc1110rg \
    --name myAppGateway \
    --public-ip-address myAGPublicIPAddress \
    --location westus \
    --capacity 2 \
    --http-settings-port 8080 \
    --http-settings-protocol Http \
    --frontend-port 80 \
    --sku Standard_V2 \
    --subnet jbossVMGatewaySubnet \
    --vnet-name myVNet \
    --priority 1001 \
    --servers ${MSPVM1_IP} ${MSPVM2_IP}

注意

此示例使用 HTTP 设置对 Red Hat JBoss EAP 服务器的简单访问。 如果想要安全访问,请按照“端到端 TLS”中的说明配置 TLS/SSL 终止,并应用程序网关

此示例公开端口 8080 上的主机控制器。 在后续步骤中,你将使用数据库连接到群集部署示例应用程序。

连接 Azure Database for PostgreSQL

本部分介绍如何在 Azure 上创建 PostgreSQL 实例,以及如何在 Red Hat JBoss EAP 群集上配置与 PostgreSQL 的连接。

创建 Azure Database for PostgreSQL 实例

使用以下步骤创建数据库实例:

  1. 使用 az postgres server create 在 Azure 上预配 PostgreSQL 实例,如以下示例所示:

    export DATA_BASE_USER=jboss
    export DATA_BASE_PASSWORD=Secret123456
    
    DB_SERVER_NAME="jbossdb$(date +%s)"
    echo "DB_SERVER_NAME=${DB_SERVER_NAME}"
    az postgres flexible-server create \
        --resource-group abc1110rg \
        --name ${DB_SERVER_NAME}  \
        --location westus \
        --admin-user ${DATA_BASE_USER} \
        --admin-password ${DATA_BASE_PASSWORD} \
        --version 16 \
        --public-access 0.0.0.0 \
        --tier Burstable \
        --sku-name Standard_B1ms \
        --yes
    
  2. 使用以下命令允许从 Azure 服务进行访问:

    # Save aside the following names for later use
    export fullyQualifiedDomainName=$(az postgres flexible-server show \
        --resource-group abc1110rg \
        --name ${DB_SERVER_NAME} \
        --query "fullyQualifiedDomainName" \
        --output tsv)
    export name=$(az postgres flexible-server show \
        --resource-group abc1110rg \
        --name ${DB_SERVER_NAME} \
        --query "name" \
        --output tsv)
    
    az postgres flexible-server firewall-rule create \
        --resource-group abc1110rg \
        --name ${DB_SERVER_NAME} \
        --rule-name "AllowAllWindowsAzureIps" \
        --start-ip-address "0.0.0.0" \
        --end-ip-address "0.0.0.0"
    
  3. 使用以下命令创建数据库:

    az postgres flexible-server db create \
        --resource-group abc1110rg \
        --server-name ${DB_SERVER_NAME} \
        --database-name testdb
    

安装驱动程序

使用以下步骤通过 JBoss 管理 CLI 安装 JDBC 驱动程序。 有关 Red Hat JBoss EAP 上的 JDBC 驱动程序的详细信息,请参阅 安装 JDBC 驱动程序作为 JAR 部署

  1. 使用以下命令通过 SSH 连接到 adminVM 。 如果已打开连接,则可以跳过此步骤。

    ssh azureuser@$ADMIN_VM_PUBLIC_IP
    
  2. 使用以下命令下载 JDBC 驱动程序。 此处使用 postgresql-42.5.2.jar。 有关 JDBC 驱动程序下载位置的详细信息,请参阅 Red Hat 提供的 JDBC 驱动程序下载位置

    jdbcDriverName=postgresql-42.5.2.jar
    sudo curl --retry 5 -Lo /tmp/${jdbcDriverName} https://jdbc.postgresql.org/download/${jdbcDriverName}
    
  3. 使用以下 JBoss CLI 命令部署 JDBC 驱动程序:

    sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \
    "deploy /tmp/${jdbcDriverName} --server-groups=main-server-group"
    

    服务器日志位于和mspVM1mspVM2位置/var/opt/rh/eap7/lib/wildfly/domain/servers/mspvm1-server0/log/server.log。 如果部署失败,请检查此日志文件并解决问题,然后再继续。

配置 Red Hat JBoss EAP 群集的数据库连接

你已启动数据库服务器,获取了所需的资源 ID,并安装了 JDBC 驱动程序。 接下来,本部分中的步骤说明如何使用 JBoss CLI 配置与之前创建的 PostgreSQL 实例的数据源连接。

  1. 使用以下命令打开终端并通过 SSH 连接到 adminVM

    ssh azureuser@$ADMIN_VM_PUBLIC_IP
    
  2. 使用以下命令创建数据源:

    # Replace the following values with your own
    export DATA_SOURCE_CONNECTION_STRING=jdbc:postgresql://<database-fully-qualified-domain-name>:5432/testdb
    export DATA_BASE_USER=jboss
    export JDBC_DATA_SOURCE_NAME=dataSource-postgresql
    export JDBC_JNDI_NAME=java:jboss/datasources/JavaEECafeDB
    export DATA_BASE_PASSWORD=Secret123456
    export JDBC_DRIVER_NAME=postgresql-42.5.2.jar
    
    sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \
    "data-source add --driver-name=${JDBC_DRIVER_NAME} --profile=ha --name=${JDBC_DATA_SOURCE_NAME} --jndi-name=${JDBC_JNDI_NAME} --connection-url=${DATA_SOURCE_CONNECTION_STRING} --user-name=${DATA_BASE_USER} --password=${DATA_BASE_PASSWORD}"
    

已成功配置名为 的 java:jboss/datasources/JavaEECafeDB数据源。

部署 Java EE Cafe 示例应用程序

使用以下步骤将 Java EE Cafe 示例应用程序部署到 Red Hat JBoss EAP 群集:

  1. 使用以下步骤生成 Java EE 咖啡馆。 以下步骤假定你安装了 Git 和 Maven 的本地环境:

    1. 使用以下命令从 GitHub 克隆源代码:

      git clone https://github.com/Azure/rhel-jboss-templates.git
      
    2. 运行以下命令以生成源代码:

      mvn clean install --file rhel-jboss-templates/eap-coffee-app/pom.xml
      

      此命令创建文件 eap-coffee-app/target/javaee-café.war。 在下一步中上传此文件。

  2. 打开 Web 浏览器,转到管理控制台,http://<adminVM-public-IP>:9990然后使用用户名和密码jbossadminSecret123456登录。

  3. 使用以下步骤将 javaee-café.war 上传到 内容存储库

    1. 在 Red Hat JBoss EAP 管理控制台的“部署”选项卡中,选择导航窗格中的内容存储库

    2. 选择“ 添加 ”按钮,然后选择“ 上传内容”。

      Red Hat JBoss Enterprise Application Platform Deployments 选项卡的屏幕截图,其中突出显示了“上传内容”菜单选项。

    3. 使用浏览器文件选择器选择“javaee-cafe.war”文件。

    4. 选择下一步

    5. 接受下一个屏幕上的默认值,然后选择“完成”

    6. 选择“查看内容”

  4. 使用以下步骤将应用程序部署到 main-server-group

    1. 从“内容存储库”中选择“javaee-cafe.war”

    2. 在下拉菜单中,选择“ 部署”。

    3. 选择 main-server-group 为部署 javaee-café.war 的服务器组。

    4. 选择“部署”以启动部署。 应该会看到类似于以下屏幕截图的通知:

      部署成功通知的屏幕截图。

测试 Red Hat JBoss EAP 群集配置

你配置了 JBoss EAP 群集,并向其部署了应用程序。 使用以下步骤访问应用程序以验证所有设置:

  1. 使用以下命令获取Azure 应用程序网关的公共 IP 地址:

    az network public-ip show \
        --resource-group abc1110rg \
        --name myAGPublicIPAddress \
        --query '[ipAddress]' \
        --output tsv
    
  2. 打开 Web 浏览器。

  3. 使用 URL http://<gateway-public-ip-address>/javaee-cafe/ 导航到应用程序。 不要忘记尾部斜杠。

  4. 尝试添加和删除 coffee。

清理资源

若要避免 Azure 费用,应清除不需要的资源。 如果不再需要在 Azure VM 上部署的 Red Hat JBoss EAP 群集,请注销 Red Hat JBoss EAP 服务器并删除 Azure 资源。

使用以下命令从 Red Hat 订阅管理中注销 Red Hat JBoss EAP 服务器和 VM:

# Unregister domain controller
az vm run-command invoke \
    --resource-group abc1110rg \
    --name adminVM \
    --command-id RunShellScript \
    --scripts "sudo subscription-manager unregister"

# Unregister host controllers
az vm run-command invoke \
    --resource-group abc1110rg \
    --name mspVM1 \
    --command-id RunShellScript \
    --scripts "sudo subscription-manager unregister"
az vm run-command invoke \
    --resource-group abc1110rg \
    --name mspVM2 \
    --command-id RunShellScript \
    --scripts "sudo subscription-manager unregister"

使用以下命令删除资源组 abc1110rg

az group delete --name abc1110rg --yes --no-wait

后续步骤

继续探索在 Azure 上运行 JBoss EAP 的选项。