簡介
wildfly可以使用Standalone模式或者domain模式啟動晶乔,standalone模式就很簡單了锣咒,可以看做是一個單獨的服務器。今天我們將會詳細講解一下domain模式赞弥。
wildfly模式簡介
wildfly可以在兩種模式下面工作毅整,他們是standalone和managed domain。
standalone模式表示的是一個獨立的服務器绽左,它們可以通過使用standalone.sh來啟動悼嫉。如果使用的是standalone模式,但是又需要使用多服務器的集群模式拼窥,那么需要用戶自己在應用層去處理戏蔑。
如果想中心化管理多個多個服務的話蹋凝,那么可以用到managed domain模式。
在managed domain模式下总棵,wildfly可以通過一個domain controller來控制和管理其他的domain server鳍寂。
我們看下managed domain下的服務器部署示意圖:
上面示意圖中,一個host表示的是一個實體或者虛擬機情龄。在一個host中可以部署多個server instances迄汛。
我們可以通過domain.sh來啟動host controller。
host controller負責啟動和停止server服務骤视,并且負責和Domain Controller進行交互鞍爱。
host controller通過讀取domain/configuration/host.xml的配置信息,來進行服務器的配置专酗。
上圖中有一個特殊的host controller叫做Domain Controller睹逃。Domain Controller負責整個domain的管理工作。
域控制器的主要職責是維護域的中央管理策略祷肯,以確保所有主機控制器都知道其當前內容沉填,并協(xié)助主機控制器確保根據(jù)此策略配置任何正在運行的應用程序服務器實例。 默認情況下躬柬,此中央管理策略存儲在Domain Controller主機的domain/configuration/domain.xml中拜轨。
server group中的一組server都有相同的配置,可以將它們看做是一個允青。一個 Domain Controller 可以管理多個server group.
我們看一個server group的定義:
<server-group name="main-server-group" profile="default">
<socket-binding-group ref="standard-sockets"/>
<deployments>
<deployment name="foo.war_v1" runtime-name="foo.war" />
<deployment name="bar.ear" runtime-name="bar.ear" />
</deployments>
</server-group>
最后一個概念就是server橄碾,server表示的是一個運行的應用程序。server和Host Controller 運行在不同的JVM中的颠锉,并且server是由Host Controller 來啟動的法牲。
注意,不管是standalone還是managed domain琼掠,這都是取決于你內部的服務是怎么管理的拒垃,是一個個單獨的部署還是使用中心化的管理方式,他們和外部用戶的服務方式是無關的瓷蛙,也就是說不管使用standalone還是managed domain,都可以搭建服務集群悼瓮。
domain controller的配置
domain controller是一個中心化的對domain進行管理的服務。我們需要一個host被配置為domain controller艰猬,還需要暴露它的管理接口以供被管理的host進行連接横堡。
我們看下一個domain controller的配置:
<domain-controller>
<local/>
</domain-controller>
上面的例子中,local表示的是本地host冠桃。
如果這個機子被當做是domain controller命贴,那么必須配置和暴露管理接口:
<management-interfaces>
<native-interface security-realm="ManagementRealm">
<socket interface="management" port="${jboss.management.native.port:9999}"/>
</native-interface>
<http-interface security-realm="ManagementRealm">
<socket interface="management" port="${jboss.management.http.port:9990}"/>
</http-interface>
</management-interfaces>
其中,interface指向的management是在host.xml中配置的:
<interfaces>
<interface name="management">
<inet-address value="192.168.0.101"/>
</interface>
</interfaces>
默認情況下master domain controller是需要認證才能被訪問的,我們需要通過使用add-user來為slave domain controller 創(chuàng)建用戶胸蛛,以連接到master domain controller污茵。
所以,我們在add-user的最后一步葬项,我們需要輸入y:
Is this new user going to be used for one AS process to connect to another AS process e.g. slave domain controller?
yes/no? y
To represent the user add the following to the server-identities definition <secret value="cE3EBEkE=" />
我們需要記住上面的xml格式的secret泞当,以便在后續(xù)slave的配置中使用。
Host controller的配置文件
有了domain controller玷室,我們就可以通過host controller加入存在的domain了零蓉。
在做host controller的配置的時候,需要注意穷缤,host的邏輯名在一個domain內部必須是唯一的敌蜂。并且host controller是通過IP地址來連接到domain controller的。
所以我們需要在host.xml中給host起一個唯一的名字:
<host xmlns="urn:jboss:domain:3.0"
name="slave">
[...]
</host>
如果沒有指定host的名字津肛,將會使用jboss.host.name的值作為host的名字章喉。如果這個值也沒有設置,那么將會使用HOSTNAME或者COMPUTERNAME作為host的名字身坐。
我們需要在hsot controller中指定domain controller的連接信息:
<domain-controller>
<remote protocol="remote" host="192.168.0.101" port="9999" username="slave" security-realm="SlaveRealm"/>
</domain-controller>
這里我們需要指定一個security realm秸脱,用來存放slave的密碼:
<security-realm name="SlaveRealm">
<server-identities>
<secret value="cE3EBEkE=" />
</server-identities>
</security-realm>
這個secret,就是在使用user-add工具的時候創(chuàng)建的密碼部蛇。
忽略域范圍的資源
我們知道domain controller的職責就是保證所有正在運行的host controller都擁有和domain controller域范圍配置一致的本地副本摊唇。
這些域范圍的配置指的是不以 /host = * 開頭的資源,比如那些保存在domain.xml中的資源涯鲁。
如果host controller不是想做domain controller的備份巷查,或者說host controller不想重新啟動一個新的server group。那么host controller只需要保存已運行server group相關的域范圍配置即可抹腿,并不需要保存所有的是域范圍配置岛请。
這樣可以減少數(shù)據(jù)的傳輸,提升系統(tǒng)的效率警绩。
如果要忽略域范圍的資源我們可以使用ignore-unused-configuration="true"崇败。
<domain-controller>
<remote security-realm="ManagementRealm" ignore-unused-configuration="true">
<discovery-options>
<static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/>
</discovery-options>
</remote>
</domain-controller>
Server groups
Server groups就是服務分組,它是由domain controller來定義的肩祥,每個server-group都需要和profile后室,socket-binding-group進行關聯(lián),我們看個例子:
<server-groups>
<server-group name="main-server-group" profile="default">
<jvm name="default">
<heap size="64m" max-size="512m"/>
<permgen size="128m" max-size="128m"/>
</jvm>
<socket-binding-group ref="standard-sockets"/>
</server-group>
<server-group name="other-server-group" profile="bigger">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="bigger-sockets"/>
</server-group>
</server-groups>
上面配置中的socket-binding-group也是在domain.xml中定義的混狠,指定了網(wǎng)絡的interface和端口:
<socket-binding-groups>
<socket-binding-group name="standard-sockets" default-interface="public">
<socket-binding name="http" port="8080"/>
[...]
</socket-binding-group>
<socket-binding-group name="bigger-sockets" include="standard-sockets" default-interface="public">
<socket-binding name="unique-to-bigger" port="8123"/>
</socket-binding-group>
</socket-binding-groups>
socket-binding-group還可以使用include來引用其他的socket-binding-group岸霹。
profile是subsystems的集合,subsystem就是應用程序需要的各種功能檀蹋。
<profiles>
<profile name="default">
<subsystem xmlns="urn:jboss:domain:web:1.0">
<connector name="http" scheme="http" protocol="HTTP/1.1" socket-binding="http"/>
[...]
</subsystem>
<\!-\- The rest of the subsystems here \-->
[...]
</profile>
<profile name="bigger">
<subsystem xmlns="urn:jboss:domain:web:1.0">
<connector name="http" scheme="http" protocol="HTTP/1.1" socket-binding="http"/>
[...]
</subsystem>
<\!-\- The same subsystems as defined by 'default' here \-->
[...]
<subsystem xmlns="urn:jboss:domain:fictional-example:1.0">
<socket-to-use name="unique-to-bigger"/>
</subsystem>
</profile>
</profiles>
Servers
Servers是在host controller中定義的松申,而Servers group是在domain controller中定義的。
每個server都要屬于一個server group俯逾,server就是服務贸桶,每個server都會啟動一個jvm。 我們先看下server的定義:
<servers>
<server name="server-one" group="main-server-group">
<\!-\- server-one inherits the default socket-group declared in the server-group \-->
<jvm name="default"/>
</server>
<server name="server-two" group="main-server-group" auto-start="true">
<socket-binding-group ref="standard-sockets" port-offset="150"/>
<jvm name="default">
<heap size="64m" max-size="256m"/>
</jvm>
</server>
<server name="server-three" group="other-server-group" auto-start="false">
<socket-binding-group ref="bigger-sockets" port-offset="250"/>
</server>
</servers>
在server中桌肴,我們可以重新定義socket-binding-group皇筛。
auto-start的意思是server是否回隨著host controller的啟動而啟動。
最后坠七,我們看下在host.xml中的jvm的定義:
<jvms>
<jvm name="default">
<heap size="64m" max-size="128m"/>
</jvm>
</jvms>
我們可以在server中對其進行重寫水醋。
總結
以上就是wildfly中,對domain的配置規(guī)則彪置,可以看到在domain中拄踪,可以啟動多個server,配置和管理起來比tomcat要復雜很多拳魁,不過功能也相應的強大很多惶桐,我們可以借鑒這些優(yōu)秀軟件的設計思想,從而應用到我們的自己的程序中潘懊。
本文作者:flydean程序那些事
本文鏈接:http://www.flydean.com/wildfly-21-domain/
本文來源:flydean的博客
歡迎關注我的公眾號:「程序那些事」最通俗的解讀姚糊,最深刻的干貨,最簡潔的教程授舟,眾多你不知道的小技巧等你來發(fā)現(xiàn)救恨!