写点什么

wildfly 21 中应用程序的部署

发布于: 2020 年 12 月 27 日

简介

除了配置文件的修改之外,最重要的就是应用程序的部署了。本文将会讲解如何在 wildfly 21 中,在 Managed Domain 和 standalone 两种模式中如何部署应用程序。


Managed Domain 中的部署

在 managed domain 模式下,服务是放在很多个 server 中启动的,而 server 是和 server-group 相关联的。同一个 server-group 下的 server 部署是一致的。


在 managed domain 模式下,需要先将要部署的应用程序上传到 domain controller 中,然后通过 domain controller 将其部署到一个或者多个 server-group 中。


当然我们在 domain controller 中的 cli 环境中只需要一个 deploy 命令就可以做到上面的两步了。


比如说,我们创建了一个应用程序叫做 test-application.war,看下怎么进行部署:


[domain@localhost:9990 /] deploy ~/Desktop/test-application.warEither --all-server-groups or --server-groups must be specified.
[domain@localhost:9990 /] deploy ~/Desktop/test-application.war --all-server-groups'test-application.war' deployed successfully.
复制代码


在执行 deploy 命令的时候,需要指定部署到的 server-groups 名字,可以部署到所有的 server-groups 中,也可以指定特定的某些 server-groups:


[domain@localhost:9990 /] deploy ~/Desktop/test-application.war --server-groups=main-server-group,another-group'test-application.war' deployed successfully.
复制代码


部署完成之后,我们可以通过 cli 来查看一下部署的状态:


[domain@localhost:9990 /] /server-group=main-server-group/deployment=test-application.war:read-resource(include-runtime){   "outcome" => "success",   "result" => {       "enabled" => true,       "name" => "test-application.war",       "managed" => true,       "runtime-name" => "test-application.war"   }}
复制代码


deploy 可以添加–force 参数,用来升级或者替换现有的程序版本:


[domain@localhost:9990 /] deploy ~/Desktop/test-application.war --all-server-groups --force'test-application.war' deployed successfully.
复制代码


如果想取消部署,则可以使用 undeploy:


[domain@localhost:9990 /] undeploy test-application.war --all-relevant-server-groupsSuccessfully undeployed test-application.war.
[domain@localhost:9990 /] /server-group=main-server-group:read-children-names(child-type=deployment){ "outcome" => "success", "result" => []}
复制代码


部署完成之后,会在 domain.xml 中添加或者修改两个部分的内容,分别是 deployments 和 server-groups:


[...]<deployments>   <deployment name="test-application.war"               runtime-name="test-application.war">       <content sha1="dda9881fa7811b22f1424b4c5acccb13c71202bd"/>   </deployment></deployments>[...]<server-groups>   <server-group name="main-server-group" profile="default">       [...]       <deployments>           <deployment name="test-application.war" runtime-name="test-application.war"/>       </deployments>   </server-group></server-groups>[...]
复制代码


管理展开的部署文件

一般来说,如果我们要创建或者修改一个应用程序的部署文件的话,我们可以重新打包这个部署文件,然后重新部署即可。


但是有时候,重新打包整个应用程序可能比较复杂,而我们只是想修改程序中的某一个或者某几个特定的文件。那么 wildfly 提供了命令行方便的实现这个功能。


要修改打包好的部署文件,首先就是要将部署文件展开。因为部署文件一般都是以 ear,war 结尾的,展开的目的就是将其进行解压缩,以便我们可以修改包里面的内容。


比如说我们现在已经部署好了一个 kitchensink.ear 文件,现在可以使用下面的命令将其展开:


[domain@localhost:9990 /] /deployment=kitchensink.ear:explode()
复制代码


因为上面的展开命令并不是递归执行的,如果 ear 中包含子的部署系统 war 文件的话,我们可以使用 path 来指定展开的子系统:


[domain@localhost:9990 /] /deployment=kitchensink.ear:explode(path=wildfly-kitchensink-ear-web.war)
复制代码


展开部署文件之后,我们可以使用 browse-content 来查看文件的列表:


[domain@localhost:9990 /] /deployment=kitchensink.ear:browse-content(archive=false, path=wildfly-kitchensink-ear-web.war){    "outcome" => "success",    "result" => [        {            "path" => "META-INF/",            "directory" => true        },        {            "path" => "META-INF/MANIFEST.MF",            "directory" => false,            "file-size" => 128L        },        ...}
复制代码


如果想查看具体某个文件的描述,则可以使用 read-content:


[domain@localhost:9990 /] /deployment=kitchensink.ear:read-content(path=META-INF/MANIFEST.MF){    "outcome" => "success",    "result" => {"uuid" => "b373d587-72ee-4b1e-a02a-71fbb0c85d32"},    "response-headers" => {"attached-streams" => [{        "uuid" => "b373d587-72ee-4b1e-a02a-71fbb0c85d32",        "mime-type" => "text/plain"    }]}}
复制代码


注意,read-content 只能读取到文件的描述符,并不能获取到文件的内容,如果想要读取文件的内容,可以使用 attachment display :


[domain@localhost:9990 /] attachment display --operation=/deployment=kitchensink.ear:read-content(path=META-INF/MANIFEST.MF)ATTACHMENT d052340a-abb7-4a66-aa24-4eeeb6b256be:Manifest-Version: 1.0Archiver-Version: Plexus ArchiverBuilt-By: mjurcCreated-By: Apache Maven 3.3.9Build-Jdk: 1.8.0_91
复制代码


使用 attachment save 命令还可以将部署文件的内容拷贝到指定的文件目录中:


[domain@localhost:9990 /] attachment save --operation=/deployment=kitchensink.ear:read-content(path=META-INF/MANIFEST.MF) --file=/tmp/exampleFile saved to /tmp/example
复制代码


我们可以使用 add 操作来创建一个空的展开部署文件:


[domain@localhost:9990 /] /deployment=exploded.war:add(content=[{empty=true}])
复制代码


然后使用 add-content 向其中添加文件:


[domain@localhost:9990 /] /deployment=exploded.war:add-content(content=[{target-path=WEB-INF/classes/org/jboss/as/test/deployment/trivial/ServiceActivatorDeployment.class, input-stream-index=/home/demo/org/jboss/as/test/deployment/trivial/ServiceActivatorDeployment.class}, {target-path=META-INF/MANIFEST.MF, input-stream-index=/home/demo/META-INF/MANIFEST.MF}, {target-path=META-INF/services/org.jboss.msc.service.ServiceActivator, input-stream-index=/home/demo/META-INF/services/org.jboss.msc.service.ServiceActivator}])
复制代码


或者使用 remove-content 删除其中的文件:


[domain@localhost:9990 /] /deployment=exploded.war:remove-content(paths=[WEB-INF/classes/org/jboss/as/test/deployment/trivial/ServiceActivatorDeployment.class, META-INF/MANIFEST.MF, META-INF/services/org.jboss.msc.service.ServiceActivator])
复制代码


非常的方便。


standalone 模式下的部署

standalone 模式下的部署和 domain 模式下的部署其实是差不多的,只不过 standalone 模式下没有 server group 的概念,我们看下怎么部署和反部署:


[standalone@localhost:9990 /] deploy ~/Desktop/test-application.war'test-application.war' deployed successfully.
[standalone@localhost:9990 /] undeploy test-application.warSuccessfully undeployed test-application.war.
复制代码


standalone 模式下的自动部署

手动部署比较麻烦,需要手动输入命令才能完成部署,如果系统中已经存在了 deployment-scanner 这个 subsystem 的话,那么这个 scanner 会定时去扫描 standalone/deployments 中的文件,从而完成自动部署的工作。


注意,在生产环境下,并不鼓励使用 scanner 去完成部署工作。


我们可以在 standalone.xml 中对 deployment-scanner 进行更加具体的配置:


<deployment-scanner scan-interval="5000" relative-to="jboss.server.base.dir"   path="deployments" auto-deploy-zipped="true" auto-deploy-exploded="false"/>
复制代码


Marker Files

Marker Files 是和部署文件同名的文件,只不过在部署文件后面加上了一些后缀,比如:.dodeploy,.skipdeploy,.isdeploying,.deployed 等等。


其中比较重要的是.dodeploy 和.deployed,我们可以手动创建或者删除这些文件,来控制系统的部署工作。


比如,我们的部署文件叫做 example.war,那么我们可以通过:


cp target/example.war/ $JBOSS_HOME/standalone/deployments
touch $JBOSS_HOME/standalone/deployments/example.war.dodeploy
复制代码


来手动部署 example.war 文件。


还可以通过删除.deployed 来反部署应用程序。


rm $JBOSS_HOME/standalone/deployments/example.war.deployed
复制代码


如果 $JBOSS_HOME/standalone/deployments/example.war.undeployed 出现了,就表现系统反部署成功了。


受管理的和不受管理的部署

wildfly 支持两种部署模式,受管理的和不受管理的部署。


所谓不受管理的部署就是说,用户自行提供要部署的文件路径,系统直接去读取该路径上的文件。


而受管理的部署会把要部署的文件上传到内部的仓库中,然后使用这个仓库中的内容进行后面的部署操作。


仓库文件目录是 standalone/data/content 或者 domain/data/content,我们看下仓库的文件格式:


ls domain/data/content/  |---/47  |-----95cc29338b5049e238941231b36b3946952991  |---/dd  |-----a9881fa7811b22f1424b4c5acccb13c71202bd
复制代码


我们看一个部署文件的描述:


<deployments>   <deployment name="test-application.war"               runtime-name="test-application.war">       <content sha1="dda9881fa7811b22f1424b4c5acccb13c71202bd"/>   </deployment></deployments>
复制代码


可以看到上面列出了部署文件的名字和 sha1 编码。WildFly 主要通过这个 sha1 的编码去找到存储的文件。


默认情况下,我们使用 deploy 命令部署的是受管理的应用,我们可以通过添加–unmanaged 来部署非受管理的应用:


[standalone@localhost:9990 /] deploy ~/Desktop/test-application.war --unmanaged'test-application.war' deployed successfully.
复制代码


这样将会存储文件的绝对路径在配置文件中,并且也不会去计算文件的 hash 值。


反部署应用都是一样的命令:


[standalone@localhost:9990 /] undeploy test-application.warSuccessfully undeployed test-application.war.
复制代码


部署覆盖

有时候我们需要修改部署好的应用程序中的某些文件,除了可以解压应用程序之外,还可以使用 deployment-overlay 命令:


deployment-overlay add --name=myOverlay --content=/WEB-INF/web.xml=/myFiles/myWeb.xml,/WEB-INF/ejb-jar.xml=/myFiles/myEjbJar.xml --deployments=test.war,*-admin.war --redeploy-affected
复制代码


总结

wildfly 的两种模式的部署就讲到这里,大家可以根据需要自行选择。


本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/wildfly-app-deployment/

本文来源:flydean 的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!


发布于: 2020 年 12 月 27 日阅读数: 14
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
wildfly 21中应用程序的部署