1. 程式人生 > >ICE之——IceGrid負載均衡部署

ICE之——IceGrid負載均衡部署

1、環境

主機1:IP=192.168.0.239,上面部署登錄檔伺服器registry和節點node1,registry和node1執行在同一程序中;
主機2:IP=192.168.0.25,上面部署節點node2;
其中每個節點中包含一個服務程式,服務程式均在節點啟動時啟動。

2、主機1配置

(1)服務程式部署XML:app_rep.xml,內容如下

<icegrid>
<application name="Simple"> #分散式系統名稱

<server-template id="SimpleServer"> #伺服器模板
<parameter name="index"/> #自定義引數index
<server id="SimpleServer-${index}" exe="./server" activation="always"> #伺服器id,程式路徑,啟動方式
<adapter name="Hello" endpoints="tcp" replica-group="ReplicatedHelloAdapter"/> #物件介面卡配置
<property name="Identity" value="hello"/> #伺服器中自定義屬性Identity
</server>
</server-template>

<replica-group id="ReplicatedHelloAdapter">
<load-balancing type="round-robin"/> #負載均衡配置,使用輪詢排程方式(最近最少使用演算法)
<object identity="hello" type="::Demo::Hello"/> #該replica-group中的物件,客戶端根據該物件標識或型別定位請求
</replica-group>

<node name="node1"> #節點1,對應於服務程式例項SimpleServer-1
<server-instance template="SimpleServer" index="1"/>
</node>

<node name="node2"> #節點2,對應於服務程式例項SimpleServer-2
<server-instance template="SimpleServer" index="2"/>
</node>

</application>

</icegrid>
(2)registry和node1的配置檔案config.grid,內容如下
#
# The IceGrid instance name.
#
IceGrid.InstanceName=DemoIceGrid

#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -p 12345 #登錄檔伺服器的端點資訊

#
# IceGrid registry configuration.
#
IceGrid.Registry.Client.Endpoints=default -p 12345
IceGrid.Registry.Server.Endpoints=default
IceGrid.Registry.Internal.Endpoints=default
IceGrid.Registry.Data=db/registry #登錄檔伺服器使用到的目錄
IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier

#
# IceGrid SQL configuration if using SQL database.
#
#Ice.Plugin.DB=IceGridSqlDB:createSqlDB
#IceGrid.SQL.DatabaseType=QSQLITE

#
# IceGrid node configuration.
#
IceGrid.Node.Name=node1 #節點1,對應於app_rep.xml中node1
IceGrid.Node.Endpoints=default
IceGrid.Node.Data=db/node #節點1用到的目錄
IceGrid.Node.CollocateRegistry=1
#IceGrid.Node.Output=db #將節點上的服務程式的標準輸出重定向到目錄db下,會自動生成輸出檔案
#IceGrid.Node.RedirectErrToOut=1 #將節點上的服務程式的標準錯誤重定向到標準輸出

#
# Trace properties.
#
IceGrid.Node.Trace.Activator=1
#IceGrid.Node.Trace.Adapter=2
#IceGrid.Node.Trace.Server=3

#
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar

3、主機2配置

主機2上只需要配置node2的配置檔案config.node即可,內容如下
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h 192.168.0.239 -p 12345 #登錄檔伺服器的端點資訊

#
# IceGrid node configuration.
#
IceGrid.Node.Name=node2 #節點2,對應於app_rep.xml中node2
IceGrid.Node.Endpoints=default
IceGrid.Node.Data=db/node2
IceGrid.Node.Output=db/node2 #將節點上的服務程式的標準輸出重定向到db/node2目錄下,會自動生成輸出檔案
IceGrid.Node.RedirectErrToOut=1

#
# Trace properties.
#
IceGrid.Node.Trace.Activator=1

4、客戶端配置

配置檔案:config.client,內容如下:
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h 192.168.0.239 -p 12345 #只需有登錄檔伺服器的端點資訊即可

5、啟動服務程式

(1)主機1上先啟動登錄檔和節點1,執行:icegridnode --Ice.Config=config.grid
(2)主機1上部署服務(只需部署一次,除非修改過app_rep.xml),執行:
icegridadmin --Ice.Config=config.grid -e "application add app_rep.xml"
若要重新部署,執行:icegridadmin --Ice.Config=config.grid -e "application update app_rep.xml"
(3)主機2上啟動節點2,執行:icegridnode --Ice.Config=config.node,此時因為服務配置為隨節點啟動,所以服務自動啟用;

6、開啟客戶端

執行./client,客戶端自動連線登錄檔伺服器,接下來便可向伺服器發起訪問請求。

7、關於程式編碼調整

IceGrid的使用會導致客戶端、伺服器的配置檔案發生變動,而程式碼也只需做極少的改動。主要是客戶端可能會由直接代理換成間接代理。
使用了IceGrid定位服務功能後,客戶端無需知道伺服器上物件介面卡端點,只需要物件標識或物件介面卡標識或replica-group標識
便可以訪問到伺服器上的物件。
伺服器端可以在xml中配置物件標識,客戶端可以從配置檔案中讀取相應物件標識,這樣物件標識就不需要硬編碼在程式中了。