本文主要介绍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构建成功了。