Ice组件安装及Ice Grid配置和部署
一、Ice 组件安装
1.下载,去官方网站下载最新版,当前是ice 3.4.2
2.建一个目录(例如 /public),把下载的tar.gz文件复制到这个目录下,解压
tar -zxvf Ice-3.4.2.tar.gz
这样 /public目录下有一个Ice-3.4.2子目录。
3.到cpp子目录(cd /public/Ice-3.4.2/cpp),修改config子目录下的Make.rules文件
此版本的 Make.rules文件有个奇怪的符号,把他修改过来,可以用UltraEdit批量修改
prefix ?= /opt/Ice-$(VERSION)
这里 "?="修改成"="
另外把 /opt/修改成/public,就是我们开始建的目录
在前面定义 VERSION=3.4.2
准备好前面几步后,就可以 make了
如果没有 expat,需要作2步:a.把expat.h复制到/usr/include b.把libexpat.so复制到/usr/lib,否则会出错。
二、Ice Grid配置和部署
1.准备注册器配置文件(如config.master) , 启动注册服务
#IceGrid instance name. 实例名
IceGrid.InstanceName=DemoIceGrid
# IceGrid registry configuration. 注册器信息
IceGrid.Registry.Client.Endpoints=tcp -h lxs02 -p 12000 -t 10000
IceGrid.Registry.Server.Endpoints=tcp -h lxs02 -t 10000
IceGrid.Registry.Internal.Endpoints=tcp -h lxs02 -t 10000
IceGrid.Registry.Data=db/master
IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
Ice.StdErr=/dev/null #db/master/stderr.txt 标准输出
Ice.StdOut=/dev/null #db/master/stdout.txt 错误输出
Ice.ProgramName=Master
上述内容修改好后,先建好配置文件要求的目录db/master (mkdir -p db/master)
然后,启动 icegridregistry --Ice.Config=config.master --nochdir --daemon就可以开启12000端口,客户端使用这个端口可以透明的调用icegrid后面配置的一整套服务。
2.准备服务配置文件 application.xml,启动多个节点上的服务
本配置文件在上面搭好的平台上启动服务,下面是其中部分内容的解释:
a.第四行server-template部分是模板描述,后面server-instance template=部分应用此模板启动应用实例。
b.第18行开始是节点和应用实例部分。node name属性要在第二步时在平台上用icegridnode在注册器上注册过,node name属性的值要与config.nodeX文件中IceGrid.Node.Name=后面的部分相同。
c.server-instance template=部分要对应上“模板描述”部分的server-template id=,下面parameter name=是模板中的可替换部分参数(一般使用一个可替换参数) ,后面index=部分替换模板中${index}
d.“模板描述”部分exe=是可执行文件的名称,就是启动这个文件,activation="on-demand"表示有请求时才启动,不是部署配置时启动。
e.“replica”系列表示服务启动多个实例,这才能体现grid网格计算的优势。replica-group=部分要与后面replica-group id=部分对应上。表示有4个节点,随机调用某计算节点。
3.准备客户端 config.client,启动icegridadmin --Ice.Config=config.client
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.166.160 -p 12000
Ice.Override.Timeout=10000
IceGridAdmin.Username=benoit
IceGridAdmin.Password=dummy
因为 icegridadmin实际上是一个特殊的管理客户端,所有要配置这个config.client。
第一行 Ice.Default.Locator=指向注册器的机器和端口,启动icegridadmin后,就表示对这个注册器后面配置的一整套计算节点和应用、服务进行管理,当注册器没有启动时,就连接不上,那就更谈不上什么管理了。
下面的超时、管理用户名、密码是为了安全使用的。
当注册器启动后(第一步没错的话,注册器就算启动成功了) , 执行 icegridadmin --Ice.Config=config.client能到命令行:
[oracle@lxs02 simple]$ icegridadmin --Ice.Config=config.client
Ice 3.4.2 Copyright 2003-2011 ZeroC, Inc.
>>>
此时可以执行 application add 'application.xml'将上一步骤配置的应用加载进去。
如果配置有错误,修改后重新加载。
加载成功后,这个 icegrid就可以为客户端提供服务了。
4.准备各个 node配置文件(如config.nodeX,这里X=2),启动node(计算节点)
# The IceGrid locator proxy. 定位,指向 注册器的机器名 和12000端口。
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h lxs02 -p 12000
# IceGrid node configuration.
IceGrid.Node.Name=node2
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Data=db/node2
#IceGrid.Node.RedirectErrToOut=1
#IceGrid.Node.Output=db
#IceGrid.Node.RedirectErrToOut=1
# Trace properties.
IceGrid.Node.Trace.Activator=1
上述内容修改好后,先建好配置文件要求的目录db/node2( mkdir -p db/node2)
然后启动 icegridnode --Ice.Config=config.node2 --nochdir --daemon就可以在注册器上注册一个计算节点,因而就可以在此节点上启动计算服务。
上述2步只是建立好了计算的平台,具体服务程序要靠icegridadmin按配置启动起来。
5.服务端代码规范模板
要使服务端能成功启动,服务端按下面模板规范服务代码即可,这已经是ice规范好了的:
class sendrecvServer : public Ice::Application //首先继承Ice::Application
{
public:
virtual int run(int, char*[]);
};
int main(int argc, char* argv[])
{
sendrecvServer app; //实例化上面继承的这个,启动主程序
return app.main(argc, argv);
}
int sendrecvServer::run(int argc, char* argv[])
{
Ice::PropertiesPtr properties = communicator()->getProperties();
Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("sendrecv");
CRM2REQ::sendrecvPtr servant = new sendrecvI; //启动自己的业务接口
adapter->add(servant, communicator()->stringToIdentity(properties->getProperty("Identity")));
adapter->activate();
communicator()->waitForShutdown();
return EXIT_SUCCESS;
}
上面代码除了设计自己业务接口名称,几乎不用修改。编译后就能被 Icegrid执行起来。
6.客户端代码规范模板
要使客户端能成功调用注册器,进而调用服务,只要按下面模板规范服务代码即可,这已经是ice规范好了的:
intmain(int argc, char* argv[])
{
Ice::CommunicatorPtr communicator;
communicator = Ice::initialize(argc, argv);//初始化环境,命令行参数要是--Ice.Config=config.client,即要读取上面config.client的配置文件
Ice::ObjectPrx obj = communicator->stringToProxy("sendrecv");
obj = obj->ice_connectionCached(false);//服务器连接时,改为true,能显著提高tps
obj = obj->ice_locatorCacheTimeout(0);
sendrecvPrx sendrecv = sendrecvPrx::checkedCast(obj);// 得到业务调用接口
sendrecv->sendByteSeq(inMsg);//调用业务
communicator->destroy();//关闭连接
return 0;
}
上面程序都去掉了异常处理部分。
经过上面步骤,就可用./client --Ice.Config=config.client 调用服务了。
本文档更多涉及配置部分,关于业务接口如何编写,另启一篇详细介绍。