ZeroC IceGrid介紹及demo構建(使用IceBox)

本文主要介紹ZeroC IceGrid的相關知識,以及如何使用IceBox構建一個IceGrid的demo程序。

1. 概述

IceGrid是爲Ice服務提供的一個定位的、活化的服務。

IceGrid的基本框架,如下圖所示:

待補充...

2. demo構建

說明:本文介紹的demo程序是在Centos 7上、使用C++語言開發的,對應的ice、icebox、icegrid版本爲3.6.4。

沿用前文《ZeroC IceBox介紹及demo構建》中已編寫的IceBox的基礎框架文件(即Hello.ice、Hello.h、Hello.cpp、HelloI.h、HelloI.cpp、HelloServiceI.h、HelloServiceI.cpp、HelloService.cpp),我們繼續編寫IceGrid需要的其他文件。

2.6 編寫註冊器配置文件

說明:本節繼承了前文《ZeroC IceBox介紹及demo構建》的部分內容,所以本節直接以2.6小節開始計數。

註冊器配置文件(config.registry)的內容如下:

#
# The IceGrid instance name.
#
IceGrid.InstanceName=DemoIceGrid

#
# IceGrid registry configuration.
#
IceGrid.Registry.Client.Endpoints=default -h localhost -p 4061
IceGrid.Registry.Server.Endpoints=default -h localhost
IceGrid.Registry.Internal.Endpoints=default -h localhost
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

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

注意:

 

  • 註冊器存放數據的目錄(IceGrid.Registry.Data)需要用戶手動創建好。

節點配置文件(config.node1)的內容如下:

#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h localhost -p 4061

#
# IceGrid node configuration.
#
IceGrid.Node.Name=node1
IceGrid.Node.Endpoints=default -h localhost
IceGrid.Node.Data=db/node1

注意:

 

  • 節點存放數據的目錄(IceGrid.Node.Data)需要用戶手動創建好。

應用配置文件(application.xml)的內容如下:

<icegrid>
    <application name="HelloApplication">
    
        <service-template id="HelloService">
            <parameter name="name"/>
            <service name="${name}" entry="HelloService:create">
                <description>A very simple service named ${name}</description>
                <adapter name="${name}" endpoints="default -h localhost" id="${name}" replica-group="HelloGroup" server-lifetime="false"/>
            </service>
        </service-template>

        <replica-group id="HelloGroup">
            <load-balancing type="round-robin" n-replicas="1"/>
            <object identity="hello" type="::Demo::Hello"/>
        </replica-group>

        <node name="node1">
            <icebox id="IceBox" activation="on-demand" exe="icebox">
                <description>A sample IceBox server</description>
                <service-instance template="HelloService" name="Hello"/>
            </icebox>
        </node>
        
    </application>
</icegrid>

2.7 編寫客戶端代碼及配置文件

客戶端代碼(client.cpp)如下:

#include <Ice/Ice.h>
#include <Hello.h>

using namespace std;
using namespace Demo;

int main(int argc, char* argv[])
{
    int status = 0;
    Ice::CommunicatorPtr ic;
    try
    {
        ic = Ice::initialize(argc, argv);
        Ice::ObjectPrx base = ic->stringToProxy("hello");
        HelloPrx hello = HelloPrx::checkedCast(base);
        if (!hello)
        {
            throw "Invalid proxy";
        }
        string result = "";
        result = hello->SayHello("liitdar");
        cout << "[icegrid_with_icebox] client's result: " << result << endl;
    }
    catch (const Ice::Exception& ex)
    {
        cerr << ex << endl;
        status = 1;
    }
    catch (const char* msg)
    {
        cerr << msg << endl;
        status = 1;
    }

    if (ic)
    {
        ic->destroy();
    }

    return status;
}

客戶端配置文件(config.client)的內容如下:

#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h localhost -p 4061

2.8 編譯生成客戶端和IceBox的服務

編譯生成客戶端應用程序(client),命令如下:

g++ -o client -I. client.cpp Hello.cpp -lIce -lIceUtil -lpthread

編譯生成IceBox的Ice服務(libHelloService.so),命令如下:

g++ -shared -fPIC -o libHelloService.so -I. HelloService.cpp HelloServiceI.cpp HelloI.cpp Hello.cpp -lIce

注意:由於節點服務器在執行(IceBox中的)Ice服務時,會在系統共享庫路徑下搜索Ice服務程序libHelloService.so,所以需要將libHelloService.so拷貝到系統的共享庫路徑下,否則節點服務器會提示找不到該Ice服務程序。本文中是將libHelloService.so拷貝到/lib64/目錄下,如下:

cp libHelloService.so /lib64/

2.9 運行IceGrid組件

運行IceGrid組件的步驟如下:

說明:本文爲了便於講述,對於下面的每一步操作都會單獨新建一個終端,運行相應的命令。在實際工作中,用戶可根據具體情況,對這些操作使用後臺模式運行。

1. 運行註冊器,命令如下:

icegridregistry --Ice.Config=config.registry

2. 運行節點服務器,命令如下:

icegridnode --Ice.Config=config.node1

3. 運行IceGrid命令行管理工具,添加應用配置文件application.xml並查看應用配置信息,命令如下:

[root@liitdar /opt/liitdar/ice-3.6/icegrid]# icegridadmin --Ice.Default.Locator="DemoIceGrid/Locator:default -h localhost -p 4061"
user id: foo
password: 
Ice 3.6.4  Copyright (c) 2003-2017 ZeroC, Inc.
>>> application list
>>> 
>>> application add /opt/liitdar/ice-3.6/icegrid/application.xml
>>> 
>>> application list
HelloApplication
>>> 
>>> node list
node1
>>> server list
IceBox
>>> service list IceBox
Hello
>>>  

說明:icegridadmin後接參數爲註冊器的定位器地址。

4. 新建一個終端,運行客戶端,命令如下:

./client --Ice.Config=config.client

正常情況下,我們能夠在上面的“運行節點服務器終端”和“運行客戶端終端”兩個終端中,看到節點服務器(中的IceBox服務器中的Ice服務)與客戶端的信息交互情況,如下: 

【節點服務器終端】:

【客戶端終端】:

如果兩個終端中出現了上述信息,說明使用IceBox的IceGrid的demo構建成功了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章