JBOSS是一個企業級的J2EE APP Container,所以它和任何一種成熟的企業級中間件同樣具備Thread Group的概念。
所謂Thread Group就是一個HTTP隊列機制,利用Thread Group在JBOSS內能夠設置如「阻斷」,「升級」,「降級」等機制。
來看一個這樣的實際應用場景:
當你的JBOSS連着一堆核心應用時,此時忽然你的HTTP的併發請求在某一個點激增,若是把這些HTTP請求都放進後臺,那麼將意味着你全部的核心模塊將會受到嚴重的影響,所以通常來講對於這樣的場景咱們會採起以下的幾種措施:javascript
在JBOSS裏使用的正是Thread Group來支持這幾種機制的,咱們來看一下這幾種機制在JBOSS中的實現:css
作過開發的相信一眼就看出來,其實這6種JBOSS提供的HTTP Thread Group正是JAVA多線程內ConcurrentThreadPool的線程種類。
本文對6種線程不作一一探討,他們的區別從字面上相信讀者能夠立刻理解,在配置時參數略有不一樣,對於每一個不一樣種類的Thread Group讀者能夠自行經過JBOSS官方文檔(以下URL)獲取它們的區別:
https://developer.jboss.org/wiki/ThreadPoolConfiguration
本文只做JBOSS EAP6中如何進行Thread Group的配置。html
打開$JBOSS_HOME/standalone/configuration/standalone.xml文件
找到<subsystem xmlns=」urn:jboss:domain:threads:1.1「>這句,把它改爲:前端
找到<subsystem xmlns=」urn:jboss:domain:web:2.2「 default-virtual-server=」default-host「 native=」false「>這句,再往下找到:
<connector name=「http」 protocol=「HTTP/1.1」這一句,把這一句改爲:java
重啓JBOSS便可node
爲何要加密? 咱們來看下面這個例子:mysql
雖然,你能夠說這個配置文件是位於企業內網的,內網就安全了?萬一有有心人。。。由於安全的宗旨是「寧肯信其有(小偷),不可信其無」。
所以通常來講在生產環境咱們是須要對這個配置文件中的敏感信息進行加密的。
JBOSS對配置文件中的加密有兩種方式:
1. Picketbox(推薦所有用這種方式)
2. Vault(不適合於DOMAIN模式、很繁瑣)nginx
確保你使用的是JBOSS EAP6.2-6.4或者更高版本,在Linux中啓動一個shell,敲入以下命令行:git
此處的」EncryptedPassword」就是咱們須要加密的「明文」,接下去它會輸出如:
Encoded password: -6e9c0a6a3bb1e4c0
這邊的「Encoded password:」後的就是被加密後的密文
而後,咱們須要創建一個Security-Domain,咱們在<profile name=「full」>段下找到
<subsystem xmlns="urn:jboss:domain:security:1.2">
<security-domains>
因爲咱們用的是domain模式啓動的jboss,所以,你不能找到一個」security-domains」就去改,由於domain模式是根據profile name來區分配置段的,若是你的security-domain加在default下,而啓動使用的是full模式那麼你的配置是無效的。
咱們在
<subsystem xmlns="urn:jboss:domain:security:1.2">
<security-domains>
段下加入
web
有了security-domain咱們就能夠在咱們的配置中應用它了,如咱們在datasource配置處使用security-domain
使用vault模式要求咱們先須要在JBOSS中創建本身的VAULT,咱們使用以下命令:
出現以下字符界面:
JBoss Vault
JBOSS_HOME: /Volumes/Disk01/appservers/center/jboss-eap-6.1
JAVA: java
============================================================
**********************************
**** JBoss Vault ***************
**********************************
Please enter a Digit::
0: Start Interactive Session 1: Remove Interactive Session 2: Exit
按選0
Enter directory to store encrypted files:[輸入] ../vault/
Enter Keystore URL:[輸入] ../vault/ymkeyes.keystore
Enter Keystore password: [輸入]aaaaaa
Enter Keystore password again: [輸入]aaaaaa
Enter 8 character salt: [輸入]12345678
Enter iteration count as a number (Eg: 44): [輸入]44
Enter Keystore Alias: [輸入] ymkeyes
Initializing Vault
2013-7-18 11:08:02 org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in AS7 config file:
********************************************
</extensions>
<vault>
<vault-option name="KEYSTORE_URL" value="../vault/ymkeyes.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-1TWrTaqRsEC"/>
<vault-option name="KEYSTORE_ALIAS" value="ymkeyes"/>
<vault-option name="SALT" value="11136231"/>
<vault-option name="ITERATION_COUNT" value="8"/>
<vault-option name="ENC_FILE_DIR" value="../vault/"/>
</vault> ...
********************************************
Vault is initialized and ready for use
Handshake with Vault complete
Please enter a Digit::
0: Store a secured attribute 1: Check whether a secured attribute exists 2: Exit
按選0
把上面從<vault>開始到</valult>這一塊複製進standalone.xml文件中,放於</extensions>段後
對於屏幕中輸出的以下信息,注意紅色加粗字體便是你用vault加密後的加密串。
Secured attribute value has been stored in vault.
Please make note of the following:
********************************************
Vault Block:ds_MegaeyesDS
Attribute Name:password
Shared Key:MjY5Nzc0OWItMmI2OS00NWMyLTlkZTYtOWY0MWE5YzAyOGMwTElORV9CUkVBS21lZ2FleWVz
Configuration should be done as follows:
VAULT::ds_oracleds::password::MjY5Nzc0OWItMmI2OS00NWMyLTlkZTYtOWY0MWE5YzAyOGMwTElORV9CUkVBS21lZ2FleWVz
********************************************
有了VAULT,你就能夠在你的配置文件中如咱們在<datasource>中,以下配置:
注意加密串還要先後加上${加密串}纔可生效
能夠看出,使用這種方式的加密,太繁瑣,並且它不支持DOMAIN模式即不可以使用在集羣環境中。
啊。。。集羣,又是集羣。
JBOSS集羣是從3.X開始那差很少是在14年前就開始支持集羣了。
目前的JBOSS EAP6.2-6.4或者是JBOSS8.0(WILDFLY)對於集羣的支持已經到了登峯造極的地步了,並且最主要的是JBOSS的集羣具備如下特點:
試想一下這種架構:
若是在這個架構中任何一個SLAVE發生了宕機,那麼對於整個集羣來講用戶的訪問是依舊能夠用的。
可是,咱們試想一下,若是JBOSS MASTER都宕機了呢?
因而,咱們有了以下的架構:
這樣,在任意一點發生不可預料的宕機時,咱們的整個集羣的服務仍是持續可用的只要不是全部的節點都宕掉。
所謂橫向、縱向
JBOSS能夠縱橫交錯,任意劃分出無數臺「JBOSS虛擬機」從而構成一個「網狀」結構
因爲JBOSS採用了相似於IBM WAS的域控理念,所以它能夠作到「集中統一佈署」,即只要在主控端發佈一個程序,該主控端下屬全部的MASTER、SLAVER所有會自動佈署。而這個自動化「分發」的過程,是不須要人爲干涉的。它意味着咱們的運維開發不須要一個個手工COPY war包到每一個J2EE APP SERVER上去了。
JBOSS也引入了時下最時髦的「VM」技術,即你能夠啓動一個JBOSS Instance,而後在這個JBOSS的Instance中爲每個不一樣的JBOSS子Container指定它們的參數、甚至JVM核心參數
說了這麼多,咱們就來搭建一個JBOSS集羣吧!
先來規劃咱們的JBOSS集羣,在咱們的例子中咱們不使用JBOSS虛擬機,咱們使用2個真正的JBOSS Instance即啓動兩個不一樣JVM進程的JBOSS來實現MASTER-SLAVER的模式。
咱們先來規劃咱們的JBOSS集羣。
咱們創建兩個JBOSS實例,使其分別名爲:
JBOSS_MASTER1
JBOSS_SLAVE1
JBOSS集羣必定用的是DOMAIN模式來去運行的,即$JBOSS_HOME/bin/domain.sh來運行的,所以咱們記得把兩個JBOSS的$JBOSS_HOME/domain/configuration/host.xml文件中的下面這段:
以上配置中的9999與9990確保兩個JBOSS Instance中的這兩個端口必定不能同樣,如個人slave中的此處配置爲:
你也能夠把slave中的host.xml文件COPY一份而後使用host-slave.xml更名成host.xml文件
MASTER和SLAVE的host.xml文件的區別還有一點,來看SLAVE的host.xml文件下面這一處:
從這邊能夠看到slave中有一個<domain-controller>段,在這個段內所指向的 ManagementRealm的IP與端口必須是它的master即Master主機中host.xml文件中的ManagementReal所設的IP與PORT。
注意host.xml文件中的頭部信息
不要忘了把<host後加入一個」name」,這邊的name很重要!!!
JBOSS集羣有一個很重要的步驟,即:
加入每一個MASTER的SLAVE,是以JBOSS中的用戶名和密碼來「認證」的,即每一個SLAVE要加入Master,Master必須容許。
所以,此處的host name=「」就是SLAVE 用戶名,那麼密碼呢?
請在JBOSS MASTER所在的目錄中運行add-user.sh命令,而後建一個用戶名,這個用戶名必須=host後的name,另外,在建完用戶後把該用戶的密碼(顯示爲MD5值)記下,而後在slave所在的host.xml文件中把密碼設進去,按照以下例子:
由於JBOSS是以GROUP的概念來管理它的集羣的,以下圖:
因此咱們須要把咱們的8080與8081這兩臺主機加入到一個GROUP中去。
在slave的host.xml文件中增長入下內容
這邊幾個地方須要注意的:
相應的,在master機上的host.xml文件中也須要有這麼一句:
配置domain.xml文件,你能夠把slave上的domain.xml備份一下,而後把domain-slave.xml文件更名成domain.xml文件來做修改(若是你不是一個熟手的話),事實上JBOSS對於domain.xml和host.xml文件分別提供了master, slave模式供你使用,若是你改壞了,你也能夠經過JBOSS對修改過保存過的配置文件自動進行備份和版本控制這個功能來回退。
其實domain.xml文件中主要的是對JBOSS「資源」的配置,如:
datasource,system properties, jvm。
因爲JBOSS使用的是Domain Controller模式,所以對於JBOSS中一切資源的使用只須要在Controller上配置便可。
你能夠把JBOSS的controller相像成一個「獅子座」,它的佔有慾極強。
因爲在本例中咱們使用的是一臺MASTER,一臺SLAVE,所以這臺MASTER又同時是CONTROLLER,固然在機器富足的狀況下你也能夠考慮CONTROLLER掛一臺MASTER,而後MASTER下再掛一臺或者是多臺SLAVE。
此處還須要注意的是domain.xml文件很長,它裏面有這樣的開頭:
而這樣的profile會有3處重複,所不一樣的是profile name=「full」, profile name=「full ha」,所以你的<server group>設的是什麼profile,你的須要設置的資源也須要在domain.xml文件中放在哪一個profile段。 此例中咱們使用的是full,所以咱們的DataSource, System Properties等就都放在了這個段裏。
咱們以前在MASTER和SLAVE的host.xml文件中分別把2臺主機都加入到了一個叫kie-server-group的段,所以咱們須要在domain.xml文件中加入一個server group的聲明段,以下示例:
此處須要注意的是,若是使用domain模式啓動,各group中的jboss實例雖然都各自使用domain.sh命令啓動,而且你在domain.sh所調用的環境配置命令domain.conf中設置瞭如: -Xms6144m -Xmx6144m 這樣的JVM參數,但其實你還須要在domain中劃分出的不一樣的jboss實例中再次做一下聲明,爲何?
由於JBOSS啓動實例用的是domain.sh+domain.conf中JVM所設的JVM參數,而JBOSS真正運行起來後用於RUN相關的佈署的應用用的倒是JBOSS內的「Domain JVM」,而你在domain.conf中設置的JVM參數只是給JBOSS啓動時所使用的,並非這個JBOSS實例如:運行某個佈署的.war包時所使用的真正的JVM,而一旦該JBOSS實例加入了某個group時,當這個實例開始佈署或者是運行某個.war包或者是.ear包時,若是你沒有設過domain jvm參數,那麼它的實際可用JVM堆默認只有256MB。
這就是爲何外面不少人說,JBOSS集羣一旦啓動,發覺原本在單節點運行的好好的web應用在集羣環境下卻會報out of memory或者是gc overhead limit。
讓咱們在MASTER和SLAVE上的host.xml文件中爲咱們的2個JBOSS實例配置虛擬JVM參數吧
Master上的host.xml文件中的設置
Slave上的host.xml文件中的設置
所有配完後分別使用:
/opt/jboss_master1/bin/domain.sh
/opt/jboss_slave1/bin/domain.sh
命令把master和slave啓動起來吧。
啓動後咱們打開主控端的WEB管理界面http://192.168.0.101:9990,能夠看到以下網絡拓撲結構。
其實,嘿嘿!
剛纔那一段繁瑣枯燥的配置,你也徹底能夠把MASTER先啓動起來後經過http://192.168.0.101:9990界面進入後可視化進行操做,看到這兒有人可能會想「打我」了,但是。。。若是你拿圖形界面配過無數次後也能像我同樣手配XML文件了,並且手配XML文件。。。速度更快!
佈署一個應用,在這邊我也想用xml文件來說解。。。但是又怕有人「打我」,可是在集羣環境下的佈署分爲:
.war包
.war格式的目錄(exploded war)
而JBOSS的自帶的http://192.168.0.101:9990只支持圖形化佈署.war包。。。不支持佈署.war格式的目錄,所以咱們仍是用xml文件配置的方式來講吧(大家最終反正是要把我打一頓的,?)
先來講一下集羣環境下的.war包的佈署吧,咱們以petstore.war來舉例,咱們把master-slave結構搭完後,直接按照以下步驟操做
JBOSS會把這個變成一個兩進制文件並以GUID的方式重命名該文件,並把它置於MASTER的/domain/servers/master_name/data目錄。
咱們注意這個$MASTER_JBOSS_HOME/domain/server目錄,這下面還會有一個slave1的目錄,這是JBSOS自動生成的,所以MASTER所掛集羣下全部節點的日誌、啓動信息、佈署都必須在此目錄內尋找,而不是再手工跑到每一個JBOSS節點中去尋找了。這也正是JBOSS的domain controller集中管控思想的體現。
在此步驟,你只是把須要deploy的文件上傳到了主控域上且並未開始佈署,爲了完成真正的佈署,你須要點擊【Assign】按鈕
一旦你點擊了Assign按鈕後,你會獲得一個彈出界面,在此界面內會提示你要把這個.war Assign給哪個group,此時,一旦當你把一個war Assign給了某個group並點擊了【肯定】後,JBOSS會做以下的事情:
若是你的Controller下掛的節點是一顆很複雜的「樹」,它也會一鍵完成全部節點的deploy。
佈署完後,咱們來查看一下咱們的集羣應用:
看,2個地址均可以訪問了。
網上不少教程使用的都是Apache的mod_模塊,至關的繁瑣。
與Nginx相比Apache弱到爆了,咱們來看一下Nginx是怎麼完成對jboss集羣的分發的吧。
咱們來實驗一下吧。
cd /usr/local/nginx
./nginx –c /usr/local/nginx.conf
啓動後訪問:http://192.168.0.101/petstore (此時不用加端口號了)
而後咱們在後臺,隨意殺掉master或者是slave進程
咱們來殺master進程吧
從新訪問http://192.168.0.101/petstore, look,仍是跑得剛剛的!咱們的集羣成功了。
這邊咱們也不用做什麼動靜分離了,就讓NGINX所有轉發JBOSS的請求便可,由於你公司也不差這點內存、CPU,作什麼動靜分離。。。non sense!
所謂exploded war即「打碎了的war」,意思就是一個文件目錄,它是以.war結尾的而且要符合war的目錄結構標準。
要佈署這樣的文件目錄形式其實很簡單,你只要打開主控域上的domain.xml文件,在其中加入這樣的語句,.war目錄能夠隨便置放在何處, wherever u want:
而後回到http://ip:9990 這個圖形化界面中就會看到在主控域上有一個.war已經被Deploy,但尚未被Assign,此時你只要作相應的Assign操做便可完成整個JBOSS集羣的佈署了。
Nginx須要依賴下面3個包
1. gzip 模塊須要 zlib 庫 ( 下載: http://www.zlib.net/ ) zlib-1.2.8.tar.gz
2. rewrite 模塊須要 pcre 庫 ( 下載: http://www.pcre.org/ ) pcre-8.21.tar.gz
3. ssl 功能須要 openssl 庫 ( 下載: http://www.openssl.org/ ) openssl-1.0.1.tar.gz
注意:若是用源碼安裝的話,後面nginx安裝的時候須要指定 --with-pcre 對應的壓縮包路徑
openssl:
pcre:
zlib:
經過 http://nginx.org/download/ 下載nginx最新版,本例中使用的是nginx-1.8.1.tar.gz,下載解壓後進入nginx源碼目錄使用下面命令進行一鍵式編譯安裝:
所有成功後,在/usr/local目錄下就會生成一個nginx目錄,nginx就安裝在此目錄內了。