第 7 章 部署应用程序

JBoss EAP 为管理员和开发人员提供了一套应用程序部署和配置选项。对于管理员,管理控制台管理 CLI 提供了在一个生产环境中管理应用程序部署的图形和命令行接口。对于开发人员,一组应用程序部署测试选项包括了一个配置文件系统 deployment scannerHTTP API、一个 IDE(如 Red Hat JBoss Developer Studio)和 Maven

在部署应用程序时,您可能希望通过设置 org.jboss.metadata.parser.validate 系统属性为 true 来启用部署检验。这是通过下列方法实现的:

  • 当启动服务器时。

    $ EAP_HOME/bin/standalone.sh -Dorg.jboss.metadata.parser.validate=true
  • 用下列管理 CLI 命令添加它至服务器配置。

    /system-property=org.jboss.metadata.parser.validate:add(value=true)

7.1. 用管理 CLI 部署应用程序

使用管理 CLI 部署应用程序的好处在于,可以使用一个命令行接口来创建并运行部署脚本。您可以使用脚本功能来配置特定应用程序的部署以及管理。您可以管理运行于一个独立服务器上的部署,也可以管理运行于管理域中的整个服务器网络。

7.1.1. 在一个独立服务器上部署应用程序

部署应用程序

在管理 CLI 里,使用 deploy 命令指定应用程序部署的路径。

deploy /path/to/test-application.war

成功的部署不会在管理 CLI 里产生任何输出,但服务器日志会显示部署消息。

WFLYSRV0027: Starting deployment of "test-application.war" (runtime-name: "test-application.war")
WFLYUT0021: Registered web context: /test-application
WFLYSRV0010: Deployed "test-application.war" (runtime-name : "test-application.war")

应用程序已成功部署。

卸载应用程序

在管理 CLI 里使用 undeploy 命令并指定部署名称。

  • 卸载应用程序并删除部署内容。

    undeploy test-application.war
  • 卸载应用程序而不从仓库里删除部署内容。

    undeploy test-application.war --keep-content

    这与从管理控制台禁用部署相同。

成功的卸载不会在管理 CLI 里产生任何输出,但服务器日志会显示部署消息。

WFLYUT0022: Unregistered web context: /test-application
WFLYSRV0028: Stopped deployment test-application.war (runtime-name: test-application.war) in 62ms
WFLYSRV0009: Undeployed "test-application.war" (runtime-name: "test-application.war")

应用程序已成功卸载。

列出部署

在管理 CLI 里使用 deploy -l 命令来列出所有部署。

deploy -l

输出即将显示每个部署的细节,如运行时名称和是否已启用。

NAME                    RUNTIME-NAME            ENABLED STATUS
test-application.war    test-application.war    true    OK
jboss-helloworld.war    jboss-helloworld.war    true    OK

7.1.2. 在受管域里部署应用程序

部署应用程序

在管理 CLI 里,使用 deploy 命令并指定应用程序部署的路径。您也必须指定应用程序部署的服务器组。

  • 要部署应用程序至所有服务器组。

    deploy /path/to/test-application.war --all-server-groups
  • 要部署应用程序至特定的服务器组。

    deploy /path/to/test-application.war --server-groups=main-server-group,other-server-group

成功的部署不会在管理 CLI 里产生任何输出,但服务器日志会显示每个受影响的服务器的部署消息。

[Server:server-one] WFLYSRV0027: Starting deployment of "test-application.war" (runtime-name: "test-application.war")
[Server:server-one] WFLYUT0021: Registered web context: /test-application
[Server:server-one] WFLYSRV0010: Deployed "test-application.war" (runtime-name : "test-application.war")

应用程序已成功部署至受管域里合适的服务器组。

卸载应用程序

在管理 CLI 里,使用 undeploy 命令并指定部署名称。您也必须指定应用程序从哪个服务器组中卸载。

  • 从所有带有这个部署的服务器组中卸载这个应用程序。

    undeploy test-application.war --all-relevant-server-groups
  • 要从特定的服务器组卸载应用程序。请注意 --keep-content 参数是必需的,因为内容必须保留在具有该部署的其他服务器组的资料库里。

    undeploy test-application.war --server-groups=other-server-group --keep-content

    这与从管理控制台禁用部署相同。

成功的卸载不会在管理 CLI 里产生任何输出,但服务器日志会显示每个受影响的服务器的卸载消息。

[Server:server-one] WFLYUT0022: Unregistered web context: /test-application
[Server:server-one] WFLYSRV0028: Stopped deployment test-application.war (runtime-name: test-application.war) in 74ms
[Server:server-one] WFLYSRV0009: Undeployed "test-application.war" (runtime-name: "test-application.war")

应用程序已成功卸载。

列出部署

在管理 CLI 里使用 deploy -l 命令来列出所有部署。

deploy -l

输出将列出每个部署及其运行时名称。

NAME                    RUNTIME-NAME
test-application.war    test-application.war
jboss-helloworld.war    jboss-helloworld.war

7.2. 使用管理控制台部署应用程序

通过管理控制台部署应用程序的好处是,可以使用易用的图形界面。您可以方便地查看部署在服务器或服务器组中的应用程序,并根据需要从内容仓库中禁用或删除应用程序。

7.2.1. 在一个独立服务器上部署应用程序

您可以在管理控制台的 Deployments 标签页里查看和管理部署。

部署应用程序

Add 按钮,使用 New Deployment 引导程序部署一个应用程序。您可以通过上传一个部署创建一个未被管理的部署来对应用程序进行部署。部署在默认情况下被启用。

  • 上传部署

    上传要复制到服务器的内容仓库的、并由 JBoss EAP 管理的应用程序。

  • 创建不托管的部署

    指定部署的位置。这个部署不会复制到服务器的内容仓库且不会被 JBoss EAP 管理。请注意,系统只支持作为非托管部署的展开式部署。

卸载应用程序

选择部署并选择 Remove 选项来卸载应用程序。这会卸载部署,并把它从内容仓库中删除。

禁用应用程序

选择部署并选择 Disable 选项来禁用应用程序。这会卸载部署,但不会从内容仓库中删除它。

替换一个应用程序

选择部署并选择 Replace 选项。选一个新版本的部署,这个新 部署需要和原来的部署有相同的名字,点 Finish。这会卸载并删除原来的部署版本,然后部署新的版本。

7.2.2. 在受管域里部署应用程序

在 JBoss EAP 管理控制台的 Deployments 标签页中可以查看和管理部署:

  • 内容仓库

    所有托管和非托管的部署都在内容仓库部分列出。在这里您可以添加和分配部署至服务器组。

  • 未分配的内容

    还没分配给任何服务器组的部署在未分配的内容部分列出。在这里您可以分配部署至服务器组或删除部署。

  • 服务器组

    已分配给一个或多个服务器组的部署会在服务器组部分里列出。在这里您可以直接启用部署和添加部署至服务器组里。

部署应用程序
  1. Content Repository 里点击 Add 按钮。
  2. 通过 uploading a deploymentcreating an unmanaged deployment 部署应用程序。
  3. 按照这些提示来部署应用程序。

    请注意在启用之前部署必须先分配给服务器组。

通过从 Server Groups 里添加部署,您可以在一个步骤里添加、分配和启用部署。

为服务器组分配一个应用程序
  1. Unassigned Content 里选择部署并点击 Assign 按钮。
  2. 选择这个部署应该分配的一个或多个服务器组。
  3. 选择是否启用在所选服务器组上的部署。
从服务器组中取消分配的应用程序
  1. Server Groups 里选择合适的服务器组。
  2. 选择所需的部署并点击 Unassign 按钮。

通过选择 Content Repository 里的 Unassign 按钮,您也可以立即从多个服务器里取消分配。

卸载应用程序
  1. 如果部署仍被分配给某个服务器组,请确保取消它的分配。
  2. Content Repository 里选择部署并点击 Remove 按钮。

这会卸载部署,并把它从内容仓库中删除。

禁用应用程序
  1. Server Groups 里选择合适的服务器组。
  2. 选择所需的部署并点击 Disable 按钮。

这会卸载部署,但不会把它从内容仓库中删除。

替换一个应用程序
  1. Content Repository 里选择部署并点击 Replace 按钮。
  2. 选择部署的新版本(名称必须和原来的部署相同),点 Finish

这会卸载并删除原来的部署,然后部署新的版本。

7.3. 用部署扫描器部署应用程序

部署扫描器(deployment scanner)会监测目录来为应用程序进行部署。在默认情况下,部署扫描器会每 5 秒对 EAP_HOME/standalone/deployments/ 目录进行扫描以检查是否有变化。marker 文件被用来指示部署的状态,并触发针对部署的操作,如卸载、重新部署。

我们推荐使用管理控制台或管理 CLI 在生产环境中部署应用程序。而部署扫描器为开发人员提供了一定的方便,用户可以在一个具有快速开发周期的环境中使用它创建并测试应用程序。另外,部署扫描器不应该和其它部署方法一起使用。

部署扫描器只有在 JBoss EAP 作为独立服务器运行时才可用。

7.3.1. 在一个独立服务器上部署应用程序

部署扫描器可以被配置为启用或禁用自动部署 XML、zipped 和 exploded 的内容。如果自动部署被禁用,您需要手动创建 marker 文件来触发部署操作。如需了解更多与可用的 marker 文件类型以及它们的作用相关的内容,请参阅 Deployment Scanner Marker Files 一节。

在默认情况下,自动部署 XML 和 zipped 内容是被启用的。如需了解为每类内容配置自动部署的内容,请参阅 Configure the Deployment Scanner

警告

用部署扫描器进行部署的目的是便于开发人员使用,但我们不推荐在产品环境里使用这种方法。它也不应该和其他部署方法一起使用。

部署应用程序

复制内容至 deployment 文件夹。

$ cp /path/to/test-application.war EAP_HOME/standalone/deployments/

如果启用了自动部署,这个文件将被自动提取和部署,且会创建一个 .deployed marker 文件。如果没有启用自动部署,您需要手动添加 .dodeploy marker 文件来触发部署。

$ touch EAP_HOME/standalone/deployments/test-application.war.dodeploy
卸载应用程序

删除 .deployed marker 文件将触发卸载。

$ rm EAP_HOME/standalone/deployments/test-application.war.deployed

如果启用了自动部署,您也可以删除 test-application.war 文件,这将触发卸载。请注意这不适用于展开式部署。

重部署应用程序

创建 .dodeploy marker 文件来初始化重部署。

$ touch EAP_HOME/standalone/deployments/test-application.war.dodeploy

7.3.2. 配置部署扫描器

部署扫描器可以通过使用管理控制台或管理 CLI 进行配置。您可以配置部署扫描器的行为,如扫描的间隔时间、部署目录的位置以及自动部署的特定应用程序文件类型。您也可以完全禁用部署扫描器。

关于所有可用的部署扫描器属性的细节,请参考部署扫描器属性章节。

使用下列管理 CLI 命令来配置默认的部署扫描器。

禁用部署扫描器
/subsystem=deployment-scanner/scanner=default:write-attribute(name=scan-enabled,value=false)

这禁用了默认的部署扫描器。

修改扫描间隔
/subsystem=deployment-scanner/scanner=default:write-attribute(name=scan-interval,value=10000)

这将扫描间隔从 5000 毫秒(5 秒)更新为 10000 毫秒(10 秒)。

修改部署文件夹
/subsystem=deployment-scanner/scanner=default:write-attribute(name=path,value=/path/to/deployments)

这将部署文件夹的位置从默认的EAP_HOME/standalone/deployments 修改为 /path/to/deployments

path 值将作为绝对路径对待,除非指定了 relative-to 属性。

启用展开内容的自动部署
/subsystem=deployment-scanner/scanner=default:write-attribute(name=auto-deploy-exploded,value=true)

这启用了展开内容的自动部署(默认是禁用的)。

禁用压缩内容的自动部署
/subsystem=deployment-scanner/scanner=default:write-attribute(name=auto-deploy-zipped,value=false)

这禁用了压缩内容的自动部署(默认是启用的)。

禁用 XML 内容的自动部署
/subsystem=deployment-scanner/scanner=default:write-attribute(name=auto-deploy-xml,value=false)

这禁用了 XML 内容的自动部署(默认是启用的)。

7.3.3. 定义自定义部署扫描器

您可以通过使用管理 CLI, 或使用管理控制台的 Configuration 标签页中的 Deployment Scanners 子系统来添加一个新的部署扫描器。这会定义一个新的目录用于部署扫描。默认的部署扫描器会监测 EAP_HOME/standalone/deployments。如需了解如何配置一个存在的部署扫描器的信息,请参阅 Configure the Deployment Scanner

下面的管理 CLI 命令会添加一个新的部署扫描器,它每隔 5 秒将检查 EAP_HOME/standalone/new_deployment_dir 里的部署。

/subsystem=deployment-scanner/scanner=new-scanner:add(path=new_deployment_dir,relative-to=jboss.server.base.dir,scan-interval=5000)
注意

指定的目录必须已经存在,否则这个命令将运行失败。

已定义一个新的部署扫描器,它将监控指定的目录。

7.4. 用 Maven 部署应用程序

用 Apache Maven 部署应用程序允许您轻易地将 JBoss EAP 部署合并至现有的开发流程里。

您可以通过 WildFly Maven Plugin 来使用 Maven 在 JBoss EAP 中部署应用程序,它提供了简便的操作来为应用服务器部署或卸载应用程序。

7.4.1. 在一个独立服务器上部署应用程序

下面的说明展示了如何在一个独立的服务器上使用 Maven 部署和卸载 JBoss EAP helloworld quickstart。

如需了解更多与 JBoss EAP quickstarts 相关的内容,请参阅 JBoss EAP Getting Started Guide 中的 Using the Quickstart Examples

部署应用程序

在 Maven pom.xml 文件中初始 the WildFly Maven Plugin。这应该已在 JBoss EAP quickstart pom.xml 文件中进行了配置。

<plugin>
  <groupId>org.wildfly.plugins</groupId>
  <artifactId>wildfly-maven-plugin</artifactId>
  <version>${version.wildfly.maven.plugin}</version>
</plugin>

helloworld quickstart 目录里执行下列 Maven 命令。

$ mvn clean install wildfly:deploy

在执行 Maven 命令进行部署时,终端窗口会显示下列输出,表示部署成功。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.981 s
[INFO] Finished at: 2015-12-23T15:06:13-05:00
[INFO] Final Memory: 21M/231M
[INFO] ------------------------------------------------------------------------

您也可以查看服务器日志来确认部署成功。

WFLYSRV0027: Starting deployment of "jboss-helloworld.war" (runtime-name: "jboss-helloworld.war")
WFLYUT0021: Registered web context: /jboss-helloworld
WFLYSRV0010: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")
卸载应用程序

helloworld quickstart 目录里执行下列 Maven 命令。

$ mvn wildfly:undeploy

在执行 Maven 命令进行卸载时,终端窗口会显示下列输出,表示部署成功。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.237 s
[INFO] Finished at: 2015-12-23T15:09:10-05:00
[INFO] Final Memory: 10M/183M
[INFO] ------------------------------------------------------------------------

您也可以查看服务器日志来确认卸载成功。

WFLYUT0022: Unregistered web context: /jboss-helloworld
WFLYSRV0028: Stopped deployment jboss-helloworld.war (runtime-name: jboss-helloworld.war) in 27ms
WFLYSRV0009: Undeployed "jboss-helloworld.war" (runtime-name: "jboss-helloworld.war")

7.4.2. 在受管域里部署应用程序

下面的说明展示了如何在一个管理的域中使用 Maven 部署和卸载 JBoss EAP helloworld quickstart。

如需了解更多与 JBoss EAP quickstarts 相关的内容,请参阅 JBoss EAP Getting Started Guide 中的 Using the Quickstart Examples

部署应用程序

当在受管域中部署一个应用程序时,您需要指定这个应用程序要部署的服务器组。这会在 Maven pom.xml 文件中配置。

以下是 pom.xml 中的配置,它初始 WildFly Maven Plugin 并指定 main-server-group 作为应用程序要部署到的服务器组。

<plugin>
  <groupId>org.wildfly.plugins</groupId>
  <artifactId>wildfly-maven-plugin</artifactId>
  <version>${version.wildfly.maven.plugin}</version>
  <configuration>
    <domain>
      <server-groups>
        <server-group>main-server-group</server-group>
      </server-groups>
    </domain>
  </configuration>
</plugin>

helloworld quickstart 目录里执行下列 Maven 命令。

$ mvn clean install wildfly:deploy

在执行 Maven 命令进行部署时,终端窗口会显示下列输出,表示部署成功。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.005 s
[INFO] Finished at: 2016-09-02T14:36:17-04:00
[INFO] Final Memory: 21M/226M
[INFO] ------------------------------------------------------------------------

您也可以查看服务器日志来确认部署成功。

WFLYSRV0027: Starting deployment of "jboss-helloworld.war" (runtime-name: "jboss-helloworld.war")
WFLYUT0021: Registered web context: /jboss-helloworld
WFLYSRV0010: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")
卸载应用程序

helloworld quickstart 目录里执行下列 Maven 命令。

$ mvn wildfly:undeploy

在执行 Maven 命令进行卸载时,终端窗口会显示下列输出,表示部署成功。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.750 s
[INFO] Finished at: 2016-09-02T14:45:10-04:00
[INFO] Final Memory: 10M/184M
[INFO] ------------------------------------------------------------------------

您也可以查看服务器日志来确认卸载成功。

WFLYUT0022: Unregistered web context: /jboss-helloworld
WFLYSRV0028: Stopped deployment jboss-helloworld.war (runtime-name: jboss-helloworld.war) in 106ms
WFLYSRV0009: Undeployed "jboss-helloworld.war" (runtime-name: "jboss-helloworld.war")

7.5. 用 HTTP API 部署应用程序

您可以通过 curl 命令用 HTTP API 来部署应用程序至 JBoss EAP。

部署应用程序

$ curl --digest -L -D - http://HOST:PORT/management --header "Content-Type: application/json" -d '{"operation" : "composite", "address" : [], "steps" : [{"operation" : "add", "address" : {"deployment" : "test-application.war"}, "content" : [{"url" : "file:/path/to/test-application.war"}]},{"operation" : "deploy", "address" : {"deployment" : "test-application.war"}}],"json.pretty":1}' -u USER:PASSWORD

卸载应用程序

$ curl --digest -L -D - http://HOST:PORT/management --header "Content-Type: application/json" -d '{"operation" : "composite", "address" : [], "steps" : [{"operation" : "undeploy", "address" : {"deployment" : "test-application.war"}},{"operation" : "remove", "address" : {"deployment" : "test-application.war"}}],"json.pretty":1}' -u USER:PASSWORD

关于在程序里生成 JSON 请求,请参考红帽知识库文章

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 部署的内容。如果需要指定一个部署扫描器监控的部署目录,请参阅 Configure the 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 umlns="urn:jboss:1.0">
  <jboss-deployment-dependencies xmlns="urn:jboss:deployment-dependencies:1.0">
    <dependency name="framework.ear" />
  </jboss-deployment-dependencies>
</jboss>

这确保了 framework.earapp.ear 之前被部署。

7.6.3. 覆盖部署内容

使用部署覆盖(deployment overlay)可以在不物理修改部署归档内容的情况下覆盖一个存在的部署内容。您可以使用它来在运行时覆盖部署描述符、JAR 文件、类、JSP 页,以及其它文件,而不需要重新构建归档。

通过使用部署覆盖,可以在为一个有不同配置或设置的环境进行部署时进行相应的改变。例如,在应用程序生命周期的不同阶段(开发、测试、预生产、生产)进行部署时,您可以需要交换部署描述符、修改静态 web 资源来改变应用程序的品牌设置、或根据不同的目标环境使用不同版本的 JAR 库。另外,这个功能在一个安装需要修改配置,但因为策略或安全限制的原因而无法改变归档的情况下非常有用。

在定义一个部署覆盖时,您可以指定文件系统中的一个文件来替换部署归档中的文件。您还需要指定哪个部署会受到这个部署覆盖的影响。任何受影响的部署都需要被重新部署来使改变生效。

使用 deployment-overlay add 管理 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 指定全部的服务器组。

创建之后,您可以在现有的覆盖里添加内容、链接覆盖至部署或删除覆盖。关于完整的用法,请执行 deployment-overlay --help

参数

name
部署覆盖的名称。
content
用逗号隔开的列表,映射文件系统上的文件至它将替换的归档里的文件。条目格式是 ARCHIVE_PATH=FILESYSTEM_PATH
deployments
这个覆盖将链接的用逗号隔开的部署列表。
redeploy-affected
重新部署所有受影响的部署。

7.6.4. 指定操作头

当使用管理 CLI 部署应用程序时,需要指定操作的头数据(header)来控制部署操作要如何执行。使用 --headers 参数可以把以下操作的头数据传递给 deploy 命令。

  • allow-resource-service-restart - 是否重启要求重启以使操作修改生效的运行时服务。它默认是 false
  • blocking-timeout - 在操作被回滚前,操作被堵塞在完成操作所经历的任何阶段的最长时间(以秒为单位)。它的默认值是 300 秒。
  • rollback-on-runtime-failure - 当对运行时应用改变失败时,具有持久性的配置是否需要被还原。它的默认设置是 true
  • rollout - 受管域部署的 Rollout 计划。详情请参考使用 Rollout计划章节。

例如:

deploy /path/to/deployment.war --headers={allow-resource-service-restart=true}

使用分号(;)来隔离多个操作头部。

7.6.5. 使用 Rollout 计划

关于 Rollout 计划

在一个受管域中,针对于域或主机一级资源的操作可能会对多个服务器产生影响。这些操作可以包括一个执行计划,它指定了操作应用到服务器的顺序,以及当操作在一些服务器上执行失败时操作是否需要被复原。 如果没有指定执行计划,默认的运行计划会被使用。

以下是一个涉及到 5 个服务器组的 rollout 计划示例。操作可以按顺序在服务器组中应用(in-series)或同时应用(concurrent-groups)。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"
}}}

在上面的示例中,对域中的服务器应用操作分为 3 个阶段。如果任何一个服务器组的策略触发了一个回滚操作,则所有其它服务器组都会回滚。

  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-D 中有任何服务器应用操作失败,则会触发全组范围的回滚操作。
Rollout 计划语法

您可以以下列方式之一指定 Rollout 计划。

虽然每个方法都具有不同的初始命令,两者都使用 rollout 操作头部来定义 Rollout 计划。它使用了下列语法。

rollout (id=PLAN_NAME | SERVER_GROUP_LIST) [rollback-across-groups]
  • PLAN_NAME 是用 rollout-plan 命令保存的 Rollout 计划的名称。
  • SERVER_GROUP_LIST 是服务器组列表。使用一个逗号(,)分隔多个服务器组意味着,操作应该按顺序在每个服务器组上运行。使用 ^ 分隔意味着,操作需要在每个服务器组上同时执行。

    • 对于每个服务器组,请在参数里设置下列策略。多个策略间请用逗号隔开。

      • rolling-to-servers:一个布尔值。如果设置为 true,操作会按顺序在组中的每个服务器上执行;如果设置为 false 或没有指定,操作会在组中的每个服务器上同时执行。
      • max-failed-servers:一个整数值。当在组中进行操作失败的服务器数量达到这个数值时,组中的所有服务器都需要被复原。它的默认值是 0,这代表当操作在任何一个服务器上失败时,在组中都会触发一个回滚操作。
      • max-failure-percentage0100 间的一个整数。当在组中进行操作失败的服务器数量的百分比达到这个数值时,组中的所有服务器都需要被复原。它的默认值是 0,这代表当操作在任何一个服务器上失败时,在组中都会触发一个回滚操作。

        注意

        如果 max-failed-serversmax-failure-percentage 都被设置为非零值,那么将优先使用 max-failure-percentage

  • rollback-across-groups:一个布尔值。它指定了,当需要在一个服务器组中的所有服务器上进行回滚操作时,是否会触发在所有服务器组中的回滚操作。它的默认值是 false
用 Rollout 计划进行部署

您可以通过在 deploy 命令的 headers 参数中使用 rollout 设置来为它直接提供一个 rollout 计划的详细信息。如需了解更多相关信息,请参阅 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)}
用 Rollout 计划进行卸载

rollout 计划可能会非常负载,您可以选择保存一个 rollout 计划的详细信息。当您需要使用它时,可以通过计划的名称指定它,而不需要提供完整的 rollout 计划详情。

  1. 使用 rollout-plan 管理 CLI 命令来保存 Rollout 计划。关于格式的详情,请参考 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
    }
  2. 在部署应用程序时指定存储的 Rollout 计划名称。

    下列管理 CLI 命令用存储的 my-rollout-plan Rollout 计划部署了一个应用程序至所有的服务组。

    deploy /path/to/test-application.war --all-server-groups --headers={rollout id=my-rollout-plan}
删除一个保存的 rollout 计划

您可以在 rollout-plan 管理 CLI 命令中使用 rollout 计划的名称来删除它。

rollout-plan remove --name=my-rollout-plan
默认的 Rollout 计划

所有影响多个服务器的操作都将用 Rollout 计划来执行。如果在操作请求里没有指定 Rollout 计划,将生成一个默认的 Rollout 计划。这个计划将具有下列特点。

  • 只有单个高级别的阶段。这个操作影响的所有服务器组都将并发地应用操作。
  • 在每个服务器组里,这个操作将并行地应用于所有服务器。
  • 在服务器组里任何一个服务器上失败都将导致整个组的回滚。
  • 任何服务器组的失败将导致所有其他服务器组的回滚。