6.6. 自定义部署行为
6.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 部署的内容的目录。要定义由部署扫描程序监控的自定义部署目录,请参阅 部署扫描程序配置。
为受管域定义自定义目录
默认情况下,受管域部署的内容存储在 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 实例中,所选位置应是唯一的。
6.6.2. 控制部署顺序 复制链接链接已复制到粘贴板!
JBoss EAP 在服务器启动时提供对部署顺序的精细控制。可以指定多个 EAR 文件中的应用程序部署顺序的严格顺序,以及重启后顺序的持久性。
您可以使用 jboss-all.xml 部署描述符在顶级部署之间声明依赖项。
例如,如果您有一个依赖 Framework.ear 的 app ,首先要部署,您可以创建一个 .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 文件,且您没有部署 framework.ear,服务器会尝试部署 app.ear 并失败。
6.6.3. 覆盖部署内容 复制链接链接已复制到粘贴板!
6.6.3.1. 关于部署覆盖 复制链接链接已复制到粘贴板!
部署覆盖 可用于将内容覆盖到现有部署中,而无需实际修改部署存档的内容。它允许您在不重建存档的情况下覆盖部署描述符、库 JAR 文件、类、Jakarta Server Pages 页面和其他文件。
如果您需要为需要不同配置或设置的不同环境调整部署,这非常有用。例如,当通过应用程序生命周期从开发、测试、阶段和最终投入生产时,您可能希望交换部署描述符,修改静态 Web 资源以更改应用程序的品牌,甚至将 JAR 库替换为不同版本,具体取决于目标环境。这也是需要更改配置但因为策略或安全限制而修改或破解存档的安装的一个有用功能。
在定义部署覆盖时,您可以在将替换部署存档中的文件的文件系统中指定文件。您还必须指定哪些部署应受部署覆盖的影响。必须重新部署任何受影响的部署,才能使更改生效。
参数
您可以使用以下任一参数来配置部署覆盖:
-
name:部署覆盖的名称。 -
Content : 以逗号分隔的列表,将文件系统上的文件映射到所替换的存档中的文件。
每个条目的格式是ARCHIVE_PATH=FILESYSTEM_PATH。 -
Deployment :显示此覆盖所链接的部署列表。
-
重新部署受影响的:重新部署所有受影响的部署。
如需完整的使用详情,请执行 deployment-overlay --help。
6.6.3.2. 定义部署覆盖 复制链接链接已复制到粘贴板!
您可以定义部署覆盖以覆盖现有部署中的内容,而无需实际修改部署存档的内容。
流程
使用
deployment-overlay addmanagement 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 指定所有服务器组。- 创建部署覆盖后,您可以在现有覆盖中添加内容,将覆盖链接到部署或删除覆盖。
可选:您可以使用 <overlay> 元素指定指向包含静态 Web 资源(如 HTML、镜像或视频)的外部目录的
覆盖配置。&
lt;overlay> 元素指定覆盖 Web 应用程序静态文件的静态文件,类似于 JAR 覆盖过程。此元素位于应用程序文件jboss-web.xml中。使用这个元素配置,您不需要重新打包应用。以下示例显示了 <
overlay> 元素中的系统属性替换,其中{example.path.to.overlay}定义/PATH/TO/STATIC/WEB/CONTENT位置。示例:&
lt;overlay> 元素在jboss-web.xml文件中<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> 项中指定一个系统属性,这是描述符属性的默认值。要配置
jboss-descriptor-property-replacement,请使用以下管理 CLI 命令:/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 元素序列来决定。
6.6.4. 使用 rollout 计划 复制链接链接已复制到粘贴板!
在受管域中,针对域或主机级别资源的操作可能会影响多个服务器。此类操作可以包括汇总计划,详细说明操作应用到服务器的顺序,以及详细信息操作是否无法在某些服务器上成功执行的策略。如果没有指定 rollout 计划,则使用默认的 rollout 计划。
6.6.4.1. rollout 计划示例 复制链接链接已复制到粘贴板!
以下是涉及五个服务器组的推出部署计划示例。操作可以按顺序应用到服务器组、in-series 或并发 并发组。如需更多信息,请参阅 Rollout 计划语法。
{"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"
}}}
查看以上示例,将操作应用到域中的服务器由三个阶段完成。如果任何服务器组的策略触发在服务器组之间回滚操作,则所有其他服务器组也会回滚。
- 服务器组 group-A 和 group-B 将同时应用该操作。该操作将应用于系列中的 group-A 中的服务器,而 group-B 中的所有服务器将同时处理该操作。如果 group-A 中超过 20% 的服务器无法应用该操作,它将在整个组中回滚。如果 group-B 中的任何服务器都无法应用该操作,它将在这个组中回滚。
- group-A 和 group-B 中的所有服务器完成后,该操作将应用到 group-C 中的服务器。这些服务器将同时处理该操作。如果 group-C 中有多个服务器无法应用该操作,它将在这个组中回滚。
- group-C 中的所有服务器完成后,服务器组 group-D 和 group-E 将同时应用该操作。该操作将应用于 组-D 中的服务器,而 group-E 中的所有服务器将同时处理该操作。如果 group-D 中超过 20% 的服务器无法应用该操作,它将在这个组中回滚。如果 group-E 中的任何服务器都无法应用该操作,它将在这个组中回滚。
6.6.4.2. rollout plan 语法 复制链接链接已复制到粘贴板!
您可以通过以下任一方式指定推出部署计划。
-
通过在
deploy命令操作标头中定义 rollout 计划。详情请参阅使用 存储的 rollout 计划 部署应用程序。 -
使用
rollout-plan命令存储推出部署计划,然后在deploy命令操作标头中引用计划名称。详情请参阅使用 存储的 rollout 计划 部署应用程序。
虽然每种方法都有不同的初始命令,但这两种方法都使用 rollout 操作标头来定义 rollout 计划。这使用以下语法:
rollout (id=PLAN_NAME | SERVER_GROUP_LIST) [rollback-across-groups]
-
PLAN_NAME是使用rollout-plan命令存储的 rollout 计划的名称。 SERVER_GROUP_LIST是服务器组的列表。使用逗号(、)分隔多个服务器组,以表示应在每个服务器组按顺序执行操作。使用 caret (^)分隔符表示应在每个服务器组上同时执行操作。对于每个服务器组,在括号中设置以下任何策略:使用逗号分隔多个策略。
-
滚动到服务器:一个布尔值,如果设为true,则将操作应用到系列组中的每台服务器。如果值为false或未指定,则操作将同时应用到组中的服务器。 -
max-failed-servers: 一个整数,使用组中的最大服务器数量,在应该在组中的所有服务器上恢复操作前无法应用该操作。如果没有指定的默认值是0,这表示任何服务器上的故障会在组中触发回滚。 max-failure-percentage:0到100之间的整数,代表组中服务器总数的最大百分比,在应该在组的所有服务器上恢复操作前无法应用该操作。如果没有指定的默认值是0,这表示任何服务器上的故障会在组中触发回滚。注意如果
max-failed-servers和max-failure-percentage都被设置为非零值,max-failure-percentage将具有优先权。
-
-
rollback-across-groups: 一个布尔值,指示需要在一个服务器组中的所有服务器上回滚操作,这会触发所有服务器组的回滚。默认值为false。
6.6.4.3. 使用推出部署计划部署应用程序 复制链接链接已复制到粘贴板!
您可以通过将 rollout 设置传递给 headers 参数,直接向 deploy 命令提供推出部署计划的完整详情。有关格式的更多信息,请参阅 Rollout Plan Syntax。
以下管理 CLI 命令使用部署计划将应用程序部署到 main-server-group 服务器组,该计划为串行部署指定 rolling-to-servers=true。
deploy /path/to/test-application.war --server-groups=main-server-group --headers={rollout main-server-group(rolling-to-servers=true)}
6.6.4.4. 使用存储的 rollout 计划部署应用程序 复制链接链接已复制到粘贴板!
由于推出计划可能比较复杂,您可以选择存储推出部署计划的详细信息。这可让您在使用时引用 rollout 计划名称,而不是每次都要求 rollout 计划的完整详情。
流程
使用
rollout-planmanagement CLI 命令存储推出部署计划。有关格式的更多信息,请参阅 Rollout 计划语法。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 }指定部署应用程序时存储的 rollout 计划名称。
以下管理 CLI 命令使用
my-rollout-plan存储的 rollout 计划将应用程序部署到所有服务器组。deploy /path/to/test-application.war --all-server-groups --headers={rollout id=my-rollout-plan}
6.6.4.5. 存储的 rollout 计划删除 复制链接链接已复制到粘贴板!
您可以通过指定要删除的 rollout 计划的名称来使用 rollout-plan 管理 CLI 命令删除存储的 rollout 计划。
rollout-plan remove --name=my-rollout-plan
6.6.4.6. 默认推出计划 复制链接链接已复制到粘贴板!
所有影响多个服务器的操作都将通过推出部署计划来执行。如果在操作请求中没有指定 rollout 计划,则会生成默认的 rollout 计划。计划具有以下特征:
- 只会有一个高级别的阶段。所有受操作影响的服务器组将同时应用该操作。
- 在每个服务器组中,操作将同时应用到所有服务器。
- 在服务器组中的任何服务器出现故障时,将导致对组的回滚。
- 任何服务器组失败将导致回滚所有其他服务器组。