簡介
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的管理工作。
域控制器的主要職責是維護域的中央管理策略,以確保所有主機控制器都知道其當前內容,並協助主機控制器確保根據此策略配置任何正在執行的應用程式伺服器例項。 預設情況下,此中央管理策略儲存在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 建立使用者,以連線到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,以便在後續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工具的時候建立的密碼。
忽略域範圍的資源
我們知道domain controller的職責就是保證所有正在執行的host controller都擁有和domain controller域範圍配置一致的本地副本。
這些域範圍的配置指的是不以 /host = * 開頭的資源,比如那些儲存在domain.xml中的資源。
如果host controller不是想做domain controller的備份,或者說host controller不想重新啟動一個新的server group。那麼host controller只需要儲存已執行server group相關的域範圍配置即可,並不需要儲存所有的是域範圍配置。
這樣可以減少資料的傳輸,提升系統的效率。
如果要忽略域範圍的資源我們可以使用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進行關聯,我們看個例子:
<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中定義的,指定了網路的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的配置規則,可以看到在domain中,可以啟動多個server,配置和管理起來比tomcat要複雜很多,不過功能也相應的強大很多,我們可以借鑑這些優秀軟體的設計思想,從而應用到我們的自己的程式中。
本文作者:flydean程式那些事
本文連結:http://www.flydean.com/wildfly-21-domain/
本文來源:flydean的部落格
歡迎關注我的公眾號:「程式那些事」最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!