我們經常會遇到這種情況,有時候希望在同一台機器上部署若干個JBoss實例,上面運行不同的應用程序,這樣的話無論由於什么原因需要對某個JBoss實例進行關閉、重啟等操作都不會影響到其它實例上面的應用的正常運行,我們知道JBoss啟動時默認發布的不同的服務需要開放一些端口,如果只是簡單地拷貝兩套JBoss或者在一個JBoss中啟動多個配置的話,同時啟動多個JBoss實例會由於端口沖突而導致JBoss無法啟動。
遇到這種情況可能大家最容易想到的解決辦法就是既然端口沖突的話,那我就修改端口唄,這種方法當然也可以,但是JBoss不像Tomcat那樣,Tomcat只需要修改兩三個端口即可,而JBoss默認發布的服務端口包括http協議的8080、AJP協議的8009、JNP服務的1099、RMI命名服務的1098、RMI/JRMP invoker的4444端口等,而且不是在同一個文件中配置的,有些在server.xml中,有些在配置下的jboss-service.xml文件中,手工修改不但繁瑣而且極易出錯,尤其是實例多的話。
不過幸運的是JBoss提供了另外一種簡便的方法:Binding Manager服務,不需要繁瑣的端口配置就可以實現多實例運行端口不沖突,詳細步驟如下:
以JBoss 4.2.3 GA為例,假設server下有兩個不同的配置node1、node2(名字無所謂,default1、default1也行),%JBOSS_HOME%表示JBoss安裝目錄。
關鍵文件是%JBOSS_HOME%\docs\examples\binding-manager\sample-bindings.xml,該文件默認情況下定義了4組不同的端口配置(port-default、port-01、port-02、port-03),也就是說默認情況下支持同一台機器部署4個JBoss實例。
1、node2配置如下
修改node2/conf/jboss-service.xml文件,配置Service Binding(默認注釋掉)如下:
- <mbean code="org.jboss.services.binding.ServiceBindingManager"
- name="jboss.system:service=ServiceBindingManager">
- <attribute name="ServerName">ports-01</attribute>
- <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute>
- <attribute name="StoreFactoryClassName">
- org.jboss.services.binding.XMLServicesStoreFactory
- </attribute>
- </mbean>
<mbean code="org.jboss.services.binding.ServiceBindingManager" name="jboss.system:service=ServiceBindingManager"> <attribute name="ServerName">ports-01</attribute> <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute> <attribute name="StoreFactoryClassName"> org.jboss.services.binding.XMLServicesStoreFactory </attribute> </mbean>
這里配置node2使用的是port-01端口配置。
2、node1配置如下
node1默認可以不用配置,正常啟動即可,這種情況下使用的是JBoss提供的默認端口8080、8009等,也可以參照第一步的配置,只需修改“ServerName”與node1不一樣即可,如ports-02,注意只能是在sample-bindings.xml中定義的四組端口范圍內。
3、啟動實例
- run.bat -c node1 -b 192.168.10.100
- run.bat -c node2 -b 192.168.10.100
run.bat -c node1 -b 192.168.10.100 run.bat -c node2 -b 192.168.10.100
4、訪問地址
node1訪問地址:http://192.168.10.100:8080(默認不配置的情況)或者http://192.168.10.100:8280(使用port-02的情況)
node2訪問地址:http://192.168.10.100:8180(使用port-01的情況)
大家也許注意到端口的規律,默認情況下是8080,其它實例的端口依次在8080的基礎上增大100,對應關系如下:
- port-default 8080
- port-01 8180
- port-02 8280
- port-03 8380
port-default 8080 port-01 8180 port-02 8280 port-03 8380
當然其他端口如AJP協議端口8009也分別變成8109、8209、8309、8409,其它以此類推。
5、注意事項
1)上述配置的前提是每個實例的server.xml中HTTP協議的端口配置均為默認的8080,若該端口修改過,則需要修改sample-bindings.xml中port-default中的默認8080端口為server.xml中HTTP協議端口。
2)上述方法也同樣適用於同一台機器上面部署多個JBoss的情況而不是同一個JBoss下多個配置。
3)一般情況下默認的4組端口足夠使用,若仍不夠,可自行添加其他port組。
4)若可能,仍是推薦不用的實例綁定到不同的IP地址上。
PS.
同一機器多JBoss實例常用場景:
1)32位JVM限制無法使用超過2G的內存,通過多實例可以充分利用服務器上大內存。
2)不用JBoss實例用於不同用途:開發環境、測試環境等。
3)希望在同一個機器上部署不同版本的JBoss。
4)希望在同一個機器上部署基於不同JVM的JBoss(不同應用對JVM要求不一樣的情況)。
等等