7.6. 自定义部署行为

7.6.1. 为部署内容定义自定义目录

您可以为 JBoss EAP 定义自定义位置,以存储已部署的内容。

为单机服务器定义自定义目录

默认情况下,单机服务器部署的内容存储在 EAP_HOME/standalone/data/content 目录中。可以通过在启动服务器时传递 -Djboss.server.deploy.dir 参数来更改此位置。

$ EAP_HOME/bin/standalone.sh -Djboss.server.deploy.dir=/path/to/new_deployed_content

在 JBoss EAP 实例中,所选位置应当是唯一的。

注意

jboss.server.deploy.dir 属性指定用于存储已使用管理控制台或管理 CLI 部署的内容的目录。要定义部署扫描程序要监控的自定义部署目录,请参阅 配置 Deployment Scanner

为受管域定义自定义目录

默认情况下,受管域部署的内容存储在 EAP_HOME/domain/data/content 目录中。可以通过在启动域时传递 -Djboss.domain.deployment.dir 参数来更改此位置。

$ EAP_HOME/bin/domain.sh -Djboss.domain.deployment.dir=/path/to/new_deployed_content

在 JBoss EAP 实例中,所选位置应当是唯一的。

7.6.2. 控制部署顺序

JBoss EAP 在服务器启动时提供精细的控制部署顺序。可以指定多个 EAR 文件中应用的部署顺序以及重启后顺序的持久性。

您可以使用 jboss-all.xml 部署描述符来声明顶级部署之间的依赖关系。

例如,如果您的 app.ear 依赖于 Framework .ear,则您可以创建一个 app.ear/META-INF/jboss-all.xml 文件,如下所示。

<jboss xmlns="urn:jboss:1.0">
  <jboss-deployment-dependencies xmlns="urn:jboss:deployment-dependencies:1.0">
    <dependency name="framework.ear" />
  </jboss-deployment-dependencies>
</jboss>
注意

您可以将部署的运行时名称用作 jboss-all.xml 文件中的依赖项名称。

这可确保在 app.ear 之前部署 Framework.ear

重要

如果您在 app.ear 中创建 jboss-all.xml 文件,并且您没有部署 框架.ear,则服务器将尝试部署 app.ear 和 失败。

7.6.3. 覆盖部署内容

部署 覆盖 可用于将内容覆盖到现有的部署中,而无需物理修改部署存档的内容。它允许您覆盖部署描述符、库 JAR 文件、类、Jkarta 服务器页面,以及运行时的其他文件,而无需重新构建存档。

如果您需要为需要不同配置或设置的不同环境调整部署,这将非常有用。例如,当将部署从开发到测试、到暂存再移到生产环境时,您可能需要交换部署描述符,修改静态 Web 资源以更改应用的品牌,或者根据目标环境将 JAR 库替换为不同的版本。对于需要更改配置但因为策略或安全限制而无法修改或破解归档的安装,此功能也非常有用。

在定义部署覆盖时,您将指定将替换部署存档中的 文件的文件系统中的 文件。您还必须指定哪些部署应受到部署覆盖的影响。必须重新部署任何受影响的部署,才能使更改生效。

参数

您可以使用以下任一参数来配置部署覆盖:

  • 名称 :部署覆盖的名称。
  • 内容:: 以逗号分隔的列表,将文件系统上的 文件映射到所替换的存档中的 文件。每个条目的格式为 ARCHIVE_PATH=FILESYSTEM_PATH
  • 部署 :此覆盖所链接到的部署组合。
  • 重新部署受影响:: 重新部署所有受影响的部署。

有关完整使用详情,请执行 deployment-overlay --help

流程

  1. 使用 deployment-overlay add management CLI 命令添加部署覆盖:

    deployment-overlay add --name=new-deployment-overlay --content=WEB-INF/web.xml=/path/to/other/web.xml --deployments=test-application.war --redeploy-affected
    注意

    在受管域中,使用 --server-groups 指定适用的服务器组,或者通过 --all-server-groups 指定所有服务器组。

  2. 创建部署覆盖后,您可以将内容添加到现有覆盖中,将覆盖链接到部署,或删除覆盖。
  3. 可选: 您可以使用 <overlay> 元素指定到包含静态 Web 资源的外部目录(如 HTML、镜像或视频) 的覆盖 配置。

    & lt;overlay > 元素指定覆盖 web 应用程序静态文件的静态文件,类似于 JAR 覆盖过程。此元素位于应用程序文件 jboss-web.xml 中。使用此元素配置时,您不需要重新打包应用程序。

    以下示例显示了 < overlay> 元素中 的系统属性替换,其中 {example.path.to.overlay} 定义 /PATH/TO/STATIC/WEB/CONTENT 位置。

    示例: jboss-web.xml 文件中的 <overlay> 元素

    <jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_10_0.xsd"
               version="10.0">
            <overlay>{example.path.to.overlay}</overlay>
    </jboss-web>

    如果 jboss-descriptor-property-replacement 设为 true,则您可以在 <overlay> 元素 中指定系统属性,这是 descriptor 属性的默认值。

    要配置 jboss-descriptor-property-replacement,请使用以下命令:

    /subsystem=ee:write-attribute(name=jboss-descriptor-property-replacement,value=true)

    此命令在 JBoss EAP 配置的 ee 子系统中添加以下 XML 内容:

    <subsystem xmlns="urn:jboss:domain:ee:4.0">
        <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement>
    </subsystem>
    注意

    & lt;overlay > 元素不会覆盖 EAP 项目中已存在的部署文件。如果多个 <overlay > 元素包含相同的文件,则根据应用程序 jboss-web.xml 文件中的 overlay 元素的顺序确定优先级顺序。

7.6.4. 使用 Rollout Plans

关于 Rollout 计划

在受管域中,针对域或主机资源的操作可能会影响多个服务器。此类操作可能包括详细介绍操作应用到服务器的顺序的推出计划,以及详细描述是否可以在部分服务器上成功执行该操作的策略。如果没有指定推出计划,则会 使用默认的推出部署计划

以下是涉及五个服务器组的推出计划示例:操作可以按序列、序列 并发组应用到服务器组Rollout Plan Syntax 中对语法进行了更为详细的说明。

{"my-rollout-plan" => {"rollout-plan" => {
    "in-series" => [
        {"concurrent-groups" => {
            "group-A" => {
                "max-failure-percentage" => "20",
                "rolling-to-servers" => "true"
            },
            "group-B" => undefined
        }},
        {"server-group" => {"group-C" => {
            "rolling-to-servers" => "false",
            "max-failed-servers" => "1"
        }}},
        {"concurrent-groups" => {
            "group-D" => {
                "max-failure-percentage" => "20",
                "rolling-to-servers" => "true"
            },
            "group-E" => undefined
        }}
    ],
    "rollback-across-groups" => "true"
}}}

查看上面的示例,将操作应用到域中的服务器时要分三个阶段完成。如果任何服务器组的策略触发在服务器组中回滚该操作,则所有其他服务器组也将回滚。

  1. 服务器组 group-Agroup-B 将同时应用操作。该操作将连续应用到 group-A 中的服务器,而 group-B 中的所有服务器将同时处理该操作。如果 group-A 中超过 20% 的服务器未能应用该操作,它将在整个组中回滚。如果 group-B 中的任何服务器都无法应用该操作,它将在该组间回滚。
  2. 完成 group-Agroup-B 中的所有服务器后,该操作将应用到 group-C 中的服务器。这些服务器将同时处理操作。如果 group-C 中的多个服务器无法应用该操作,它将在该组中回滚。
  3. 完成 group-C 中的所有服务器后,服务器组 group-Dgroup-E 将同时应用该操作。该操作将按顺序应用到 group-D 中的服务器,而 group-E 中的所有服务器将同时处理该操作。如果 group-D 中超过 20% 的服务器无法应用该操作,它将在整个组中回滚。如果 group-E 中的任何服务器都无法应用此操作,它将在该组间回滚。
rollout Plan Syntax

您可以通过以下任一方式指定推出部署计划。

虽然每种方法都有不同的初始命令,但这两种方法都使用 rollout 操作标头来定义推出计划。这使用以下语法:

rollout (id=PLAN_NAME | SERVER_GROUP_LIST) [rollback-across-groups]
  • PLAN_NAME 是使用 rollout-plan 命令存储的推出计划的名称。
  • SERVER_GROUP_LIST 是服务器组的列表。使用逗号分隔(,)来分隔多个服务器组,以指示应当按顺序对每一服务器组执行操作。使用脱字符(^)分隔符表示应同时对每个服务器组执行操作。

    • 对于每一服务器组,请在括号中设置以下任何策略:使用逗号分隔多个策略。

      • Rolling-to-servers :一个布尔值,如果设为 true,则按顺序将操作应用到组中的每一服务器。如果值为 false 或未指定,操作将同时应用到组中的服务器。
      • max-failed-servers :整数,它取组中的最大服务器数,无法应用该操作,然后再将它恢复到组中的所有服务器上。如果没有指定,则默认值为 0,表示任何服务器上的失败都会在组中触发回滚。
      • max-failure-percentage :0 到 100 之间的整数,表示组中服务器总数的最大百分比,在应在该组中的所有服务器上恢复操作之前无法应用该操作。如果没有指定,则默认值为 0,表示任何服务器上的失败都会在组中触发回滚。

        注意

        如果 max-failed-serversmax-failure-percentage 都被设置为非零值,则 max-failure-percentage 将具有优先权。

  • rollback-acros-groups :一个布尔值,指示一个服务器组中的所有服务器上是否需要回滚操作。默认值为 false
使用 Rollout 计划部署

您可以通过将推出(rollout) 设置 传递到 headers 参数,将部署计划的完整详情直接提供给 deploy 命令。有关格式的更多信息,请参阅 Rollout Plan Syntax

以下管理 CLI 命令利用为串行部署指定 rolling -to-servers=true 的部署计划将应用部署到 main- server-group 服务器组:

deploy /path/to/test-application.war --server-groups=main-server-group --headers={rollout main-server-group(rolling-to-servers=true)}
使用 Stored Rollout 计划部署

由于推出计划可能比较复杂,您可以选择存储推出计划的详细信息。这可让您在您要使用部署计划名称时引用推出计划的名称,而不必每次都需要部署计划的完整详情。

  1. 使用 rollout-plan 管理 CLI 命令来存储推出计划。有关格式的更多信息,请参阅 Rollout Plan Syntax

    rollout-plan add --name=my-rollout-plan --content={rollout main-server-group(rolling-to-servers=false,max-failed-servers=1),other-server-group(rolling-to-servers=true,max-failure-percentage=20) rollback-across-groups=true}

    这会创建以下部署计划:

    "rollout-plan" => {
        "in-series" => [
            {"server-group" => {"main-server-group" => {
                "rolling-to-servers" => false,
                "max-failed-servers" => 1
            }}},
            {"server-group" => {"other-server-group" => {
                "rolling-to-servers" => true,
                "max-failure-percentage" => 20
            }}}
        ],
        "rollback-across-groups" => true
    }
  2. 在部署应用时指定存储的 rollout 计划名称。

    以下管理 CLI 命令使用 my-rollout-plan 存储的推出计划将应用部署到所有服务器组:

    deploy /path/to/test-application.war --all-server-groups --headers={rollout id=my-rollout-plan}
删除 Stored Rollout Plan

您可以通过指定要删除的 rollout-plan 管理 CLI 命令,移除存储的推出部署计划。

rollout-plan remove --name=my-rollout-plan
默认 Rollout Plan

所有影响多个服务器的操作都将通过推出计划来执行。如果没有在操作请求中指定推出部署计划,则会生成默认的推出部署计划。计划将具有以下特征:

  • 只有一个高级别阶段。受操作影响的所有服务器组将同时应用操作。
  • 在每个服务器组中,操作将同时应用到所有服务器。
  • 如果服务器组中的任何服务器上发生故障,则会导致在该组内回滚。
  • 任何服务器组的故障将导致所有其他服务器组回滚。