wildfly 21中應用程式的部署

flydean發表於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.war
Either --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-groups
Successfully 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.0
Archiver-Version: Plexus Archiver
Built-By: mjurc
Created-By: Apache Maven 3.3.9
Build-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/example
File 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.war
Successfully 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.war
Successfully 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的部落格

歡迎關注我的公眾號:「程式那些事」最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

相關文章