JBoss AS7新加入了域(domain)的概念並實現了相關功能。域的提出及實現,其目的是使得多台JBoss AS服務器的配置可以集中於一點,統一配置、統一部署,從而在管理多台JBoss AS服務器時,實現集中管理。本文詳細介紹如何使用AS7的這一新特性。
域(Domain)的概念及其與群集(Cluster)的區別
對於使用過JBoss AS過往版本的用戶,可能對AS所提供的群集功能已經很熟悉了,在理解域的時候可能會遇到困難。那么域和群集有什么區別,用處上有什么不同呢?
總的來講,JBoss的群集的目的是提供:
- 負載平衡(Load Balance)
- 高可用(High Availablity)
而域的目的則是將多台服務器組成一個服務器組(Server Group),並為一個服務器組內的多台主機(Host)提供:
- 單點集中配置(通過一個域控制器,即Domain Controller,實現組內主機的統一配置)
- 單點統一部署,通過域控制器將項目一次部署至組內全部主機。
簡單來講,群集的目標是讓多台服務器分攤壓力,當一台或多台服務器當機時,服務可以繼續保持運轉;而域的目標則是提供集中配置和管理多台服務器的能力。
在沒有域的概念時,要想讓群集內的多台服務器或幾組服務器保持統一的配置,一個一個分別的去手工維護,是非常麻煩的事情,而域的引入解決了這一問題。
我們可以理解域和群集的相互關系是"正交(orthogonal)"的:通過一橫一豎這兩條軸,JBoss AS為我們在運維方面提供了強大的可擴展能力。
實驗
熟悉了AS7中Domain的設計理念,接下來動手實際做個實驗,看看Domain是如何在AS7中工作的。
准備工作
使用兩台電腦做為實驗器材,兩台電腦的IP分別為 10.0.1.3
及 10.0.1.18
,分別運行JBoss AS7,並組成一個服務器組(Server Group)。其中,使用 10.0.1.3
這台機器做為域控制器(Domain Controller):

如上圖所示,兩台主機分別被命名為”master“及”slave“。通過配置,將master與slave組成一個服務器組,名為’main-server-group’,其中master將做為這個服務器組的域控制器。
需要說明一點的是,服務器組(Server Group)可以由多台服務器(Host)組成,並不一定只有兩台,所以不要被master及slave這樣的名字給迷惑了,以為一個服務器組僅支持一主一從兩台hosts。
本文中因為只使用兩台服務器做為實驗器材,因此出於方便角度將它們分別命名為master及slave。
此外,在一個服務器組中,只有一台域控制器,在本實驗中我們將使用master這台機器做為domain controller。
配置
AS7由於經過了重新設計,因此在目錄結構與配置文件上面與前一版本有了很大不同,對於熟悉了對AS6的配置和的人來講,使用AS7會接觸不少新概念和新思路。為了清楚表達,我會將一些與AS6及以前版本不同的地方做出必要的說明。
首先是bin目錄中的內容:
1 |
liweinan@mg:~/projs/jboss-7.0.0.CR1/bin$ ls |
2 |
domain.bat jboss-admin.bat standalone.conf wsconsume.sh |
3 |
domain.conf jboss-admin.sh standalone.conf.bat wsprovide.bat |
4 |
domain.conf.bat scripts standalone.sh wsprovide.sh |
5 |
domain.sh standalone.bat wsconsume.bat |
在AS7以前版本中,用來啟動JBoss服務的 run.sh
不見了,取而代之的是 standalone.sh
(獨立運行模式)及 domain.sh
(域運行模式)。我們稍后將使用 domain.sh
來運行JBoss AS7,但首先要將兩台hosts配置好,接下來講解兩台服務器的配置:
AS7的目錄結構和前一版本有很大不同,因為配置文件及其所在位置也有很大變動,下面是AS7的目錄結構:
1 |
bin docs jboss-modules.jar standalone |
2 |
bundles domain modules welcome-content |
可以看到有一個名為"domain"的目錄,看一下這個domain目錄里面的內容:
1 |
configuration content lib log servers |
這個目錄中包含了AS7運行在domain模式下所需的配置及內容,其中名為“configuration”的目錄里面含有我們所需要的配置文件:
1 |
liweinan@mba:~/projs/jboss-7.0.0.CR1/domain/configuration$ ls |
2 |
domain-preview.xml host.xml mgmt- users .properties |
3 |
domain.xml host_xml_history |
4 |
domain_xml_history logging.properties |
其中 domain.xml
和 host.xml
是我們需要關注的內容。我們需要對master及slave上面的配置文件分別進行配置:

從上圖中可以看到,master的JBoss AS中需要配置 domain.xml
及 host.xml
兩個文件,其中 domain.xml
是做為域控制器必須配置的內容, host.xml
則是master及slave各自的JBoss AS都需要配置的文件。我們先從master上面的配置看起:
Master上面的配置
01 |
< domain xmlns = "urn:jboss:domain:1.0" > |
05 |
< system-properties >... |
08 |
< profile name = "default" >... |
10 |
< profile name = "ha" >... |
15 |
< socket-binding-groups >... |
18 |
< server-group name = "main-server-group" profile = "default" >... |
19 |
< server-group name = "other-server-group" profile = "ha" >... |
這個文件里面有幾個部分是值得我們關注一下的:
- extensions – 這一部分定義了域中服務器在啟動時需要加載的模塊。AS7使用了全新設計的JBoss Modules來加載模塊,大幅提高了服務器的啟動。這一內容不是本文講解重點,后續我會專門寫一篇文章來介紹。目前了解到這一程度即可。
- profiles – profiles是domain中定義的一個核心概念,也是domain的核心組成部分。基於profiles,AS7便實現了域中各服務器的統一集中配置:用戶可通過profile對各子系統(subsystem)進行配置,完成后將profile配置給某個或多個服務器組,各服務器組內的主機共用一份配置。
- server groups – 服務器組的概念已經在前面的介紹中一再提及,也是AS7的域的設計中一個核心組成部分。在這里,AS7默認定義了兩個服務器組:main-server-group及other-server-group,它們分別使用’default’ profile及’ha’ profile。在本實驗中,我們將使用main-server-group。
01 |
< host xmlns = "urn:jboss:domain:1.0" name = "master" > |
05 |
< management-interfaces > |
06 |
< native-interface interface = "management" port = "9999" /> |
07 |
< http-interface interface = "management" port = "9990" /> |
08 |
</ management-interfaces > |
16 |
< interface name = "management" > |
17 |
< inet-address value = "10.0.1.3" /> |
19 |
< interface name = "public" > |
20 |
< inet-address value = "10.0.1.3" /> |
27 |
< server name = "server-one" group = "main-server-group" >... |
上面是一些host.xml中需要配置的關鍵內容,已經針對要做的測試做了一些配置上面的修改,以下是詳細說明:
- host name按照我們的需要改成了"master"。
- management – management定義了服務器的管理端口,其中:9999端口是所謂"native"二進制端口,后面的
jboss-admin.sh
管理命令會使用這個端口;9990則提供基於WEB頁面的管理端。我們等一下兩種管理端口都會用到。
- domain controller – 定義本服務器所需連接的domain控制器所在地址,因為master本身就是domain controller,所以連接至本機localhost即可。
- interfaces – management及public接口服務所在的地址,我們要將其設為slave可以訪問到的IP地址,保證slave可以連接至host
- servers – 一個物理主機實際上可以同時運行多台JBoss AS7的Server,而每一台Server都可以配置到不同的服務器組去。在本實驗中,我們使用最簡的情況,master上面只跑一個server-one,屬於main-server-group,把其它AS7默認設定的server可以都刪掉,只留server-one。
Slave上面的配置
Slave這台機器不作為域控制器而存在,因此不需要管它,也可以將domain.xml刪掉或改名。
01 |
< host xmlns = "urn:jboss:domain:1.0" name = "slave" > |
04 |
< remote host = "10.0.1.3" port = "9999" /> |
08 |
< interface name = "management" > |
09 |
< inet-address value = "10.0.1.18" /> |
11 |
< interface name = "public" > |
12 |
< inet-address value = "10.0.1.18" /> |
19 |
< server name = "server-one" group = "main-server-group" >... |
上面的配置有幾點需要說明:
- slave里面,host name指定為"slave"。
- domain-controller:指定為master的IP:10.0.1.3,通過9999管理端口進行通訊。
- slave上面,屬於main-server-group的server也命名為"server-one",這會和master上面的server沖突嗎?實際上不會,因為兩台同樣名字的server運行在不同的host當中。
部署
配置完成后,接下來便到了實際部署的階段,我們將master和slave上面的AS7分別用domain.sh
啟動起來。
1 |
[Server:server-one] 21:17:14,491 INFO [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.0.CR1 "White Rabbit" started in 6029ms - Started 109 of 163 services (54 services are passive or on-demand) |
2 |
[Host Controller] 21:18:02,635 INFO [org.jboss.domain] (pool-3-thread-1) Registered remote slave host slave |
啟動成功的話,應該可以在master上面看到上面的日志,slave被成功的注冊進來。
完成啟動后,我們需要將待使用的virtual-host啟動起來,當AS7以domain的方式啟動時,默認是不啟動任何virtual server的(在我目前使用的7.0.0 CR1 White Rabbit版本中是這樣),我們可以在 domain.xml
中配置默認加載virtual-host,也可以在服務器運行起來后,使用管理端命令動態的加載,在這里我准備使用后一種方式,從而講解AS7管理端的使用方法。
在AS7的bin目錄下面有一個 jboss-admin.sh
, 這是AS7提供的全新的管理工具,我們使用這個工具,連接至master:
2 |
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands. |
3 |
[disconnected /] connect 10.0.1.3 |
4 |
Connected to domain controller at 10.0.1.3:9999 |
可以看到,我們已經連接到了master的9999管理端口。接下來可以查看"default"這個profile當中的web模塊的運行情況:
1 |
[domain@10.0.1.3:9999 /] /profile=default/subsystem=web: read -children-names(child- type =connector) |
3 |
"outcome" => "success" , |
可見http服務器已經啟動,由於我們的"main-server-group"使用的是default這個profile,因此,服務器組中的兩台host的web模塊接受profile的統一配置,都是已啟動的。繼續看一下web模塊中的細節:
01 |
[domain@10.0.1.3:9999 /] /profile=default/subsystem=web/connector=http: read -resource(recursive= true ) |
03 |
"outcome" => "success" , |
05 |
"protocol" => "HTTP/1.1" , |
07 |
"socket-binding" => "http" , |
09 |
"virtual-server" => undefined |
注意到virtual-server的狀態是未定義(undefined),我們要想將一個web項目部署進服務器組中的各個host,就必須加載一個待部署的virtual-server,因此我們使用命令來添加:
01 |
[domain@10.0.1.3:9999 /] /profile=default/subsystem=web/virtual-server=other.com:add |
03 |
"outcome" => "success" , |
04 |
"result" => { "server-groups" => [( "main-server-group" => { |
07 |
"response" => { "outcome" => "success" } |
12 |
"outcome" => "success" , |
可以看到,我們之前在 domain.xml
中配置的 “other.com” 這個 virtual host被成功添加了。
接下來是部署WEB應用的環節,我們首先用maven制作一個最簡單的web項目,僅包含一個歡迎頁面:
1 |
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp |
生成的項目如下:
使用如下命令將項目打成WAR包:
得到war:
接下來是部署這個war包,對於本次實驗來講,關鍵的部分在於能否通過domain提供的server group管理功能,一次將一個項目部署進server group中的多台服務器。我們接下來就驗證這點,順便看下AS7提供的WEB管理功能,打開WEB瀏覽器,訪問master的HTTP端口的管理地址:
可以看到,管理頁識別出AS7正運行在domain模式之下,並且目前共有兩台主機運行(左上角的列表分別列有master及slave)。我們要關注的是server-group:點擊右上角的"Server Groups",進入服務器組的管理頁面,然后點擊左邊的"Manage Deployments"頁面,進入部署功能頁面:

可以看到,目前還沒有任何資源被加至服務器組,此時點擊右邊的"Add Content"功能,將 my-webpp.war
添加進Content Repository(域控制器用於保存待部署資源的目錄)。
添加完成后如下圖所示:

然后點擊"Add To Group"將 my-webapp.war
添加至 “main-server-group”,並將其enable,一切順利的話結果如下所示:

此時我們預期的結果應該是 my-webapp.war
被同時部署至master及slave了,分別試着訪問master及slave的http資源,看看是否都存在於my-webapp這個應用了:

結果如我們所預期的那樣,兩台服務器都可以訪問到這個部署的資源。通過對一個點(Domain Controller)的配置與部署,我們實現了多AS7服務器的集中管理。
小結
通過域這個概念,實現了多服務器統一管理,統一配置,資源統一部署的目標。通過集中管理,我們可以在此基礎上再進行群集的划分與部署,實現群集內多台服務器的單點配置與管理。可以說AS7的Domain概念的引入,與群集的概念組合在一起,通過一橫一從兩條軸,形成了完整的坐標系。
AS7的項目部署方式與原有版本相比有了較大變化,本文通過實例來講解AS7中的項目部署方式。
有關JBoss AS7的下載和安裝,請參考藍點上面的另一篇文章: JBoss AS7 快速上手
部署一個簡單的Web項目
下載安裝完成后,我們用standalone方式來啟動JBoss AS7 :
1 |
liweinan@smart:~/projs/jboss-7.0.0.CR1/bin$ ./standalone.sh |
啟動后,我們試着向AS7中部署一個簡單的項目。首先使用Maven來創建一個簡單的Web工程:
1 |
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp |
生成的項目如下:
使用如下命令將項目打成WAR包:
得到war:
接下來,我們將這個war部署進AS7。在AS7的根目錄下,有一個名為’standalone’的目錄,當AS7以standalone模式運行時,我們要將項目部署到這里面,進入到standalone目錄:
1 |
liweinan@smart:~/projs/jboss-7.0.0.CR1$ cd standalone |
2 |
liweinan@smart:~/projs/jboss-7.0.0.CR1/standalone$ ls |
3 |
configuration deployments log |
5 |
liweinan@smart:~/projs/jboss-7.0.0.CR1/standalone$ |
standalone目錄中包含許多運行所需的內容,比如’configuration’目錄包含了服務器的有關配置,我們稍后會進行說明。現在我們要關心的是’deployments’目錄,我們要將需要部署的項目放在這里,JBoss AS7會自動掃描這個目錄並進行部署。我們將剛剛制作好的 my-webapp.war
拷貝至deployments目錄:
1 |
liweinan@smart:~/projs/my-webapp/target$ cp my-webapp.war ~/projs/jboss-7.0.0.CR1/standalone/deployments/ |
此時查看AS7的日志輸出:
1 |
16:12:33,822 INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) Starting deployment of "my-webapp.war" |
2 |
16:12:36,616 INFO [org.jboss.web] (MSC service thread 1-4) registering web context: /my-webapp |
3 |
16:12:36,740 INFO [org.jboss.as.server.controller] (DeploymentScanner-threads - 2) Deployed "my-webapp.war" |
從日志中可以看出,項目被成功地部署進了AS7。我們試着訪問下已部署的服務:

AS7中項目的自動部署及手工部署
我們在上一節通過將項目拷貝至deployments目錄,就實現了AS7對項目的自動掃描及自動部署。實際上AS7還支持手工的部署模式,這樣,我們就可以控制項目的部署及啟動時機。配置AS7的部署模式有兩種方式:一個是通過在配置文件指定,另一個是在AS7運行時,通過管理端來進行實時的配置。
我們首先來看一下配置文件中的內容,JBoss AS7相對以前版本比較,大大簡化了精減了配置文件的數量。原來的 *-ds.xml
等數據庫的配置文件,都被合並至了統一的配置文件: standalone.xml
。這個文件位於剛才提到的 /standalone/configuration
目錄當中,詳細講解這個配置文件也不是這篇文章要關注的地方,因此我們只需要了解一下這個配置文件中,與部署有關的這段內容 :
1 |
< subsystem xmlns = "urn:jboss:domain:deployment-scanner:1.0" > |
2 |
< deployment-scanner scan-interval = "5000" |
3 |
relative-to = "jboss.server.base.dir" path = "deployments" /> |
可以看到,配置中指定 deployment-scanner
去掃描deployments目錄,掃描間隔為5秒鍾。
除了在配置文件中進行配置,我們也可以在AS7實時運行時,通過管理端來改變AS7的部署方式。首先是登錄到管理端,使用AS7中bin目錄中帶有的管理端連接程序 jboss-admin.sh
1 |
liweinan@smart:~/projs/jboss-7.0.0.CR1/bin$ ./jboss-admin.sh |
2 |
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands. |
3 |
[disconnected /] connect 127.0.0.1 |
4 |
Connected to standalone controller at 127.0.0.1:9999 |
5 |
[standalone@127.0.0.1:9999 /] |
連接成功后,我們可以查看當前的scanner配置:
01 |
[standalone@127.0.0.1:9999 /] /subsystem=deployment-scanner: read -resource(recursive= true ) |
03 |
"outcome" => "success" , |
04 |
"result" => { "scanner" => { "default" => { |
05 |
"auto-deploy-exploded" => false , |
06 |
"auto-deploy-zipped" => true , |
07 |
"deployment-timeout" => 60L, |
09 |
"path" => "deployments" , |
10 |
"relative-to" => "jboss.server.base.dir" , |
11 |
"scan-enabled" => true , |
12 |
"scan-interval" => 5000 |
如上所示,和配置文件中對應的配置是一致的。我們可以移除這個自動掃描的scanner:
1 |
[standalone@127.0.0.1:9999 /] /subsystem=deployment-scanner/scanner=default:remove |
2 |
{ "outcome" => "success" } |
此時再次查看:
1 |
[standalone@127.0.0.1:9999 /] /subsystem=deployment-scanner: read -resource(recursive= true ) |