ICEPACK/ICEGRID动态绑定端口用例

中间件ICE提供了了动态绑定(Binding)端口的服务ICEPACK(高版本中已更名为ICEGRID,用法类似),这样可避免在程序中指定连接端口,而将端口信息外部化,增加应用的灵活性。

ICEPACK中保存连接信息的结点称为Registry(作用类似于互联网中的DNS), server启动时首先向Registry注册自己所提供的adapter有自己的通讯端点,当有client要发起RPC时,先向Registry询问自己所要使用的adapter所在的位置,使用server已注册的端点时行通讯。


我这里使用的是ice2.1.0,开发语言为JAVA.


1.首先配置Registry的配置文件

假设配置文件为/opt/ripper/registry/registry.cfg,其内容如下:

IcePack.Registry.Client.Endpoints=tcp -p 32769
 IcePack.Registry.Server.Endpoints=tcp
IcePack.Registry.Internal.Endpoints=tcp
 IcePack.Registry.Data=/opt/ripper/registry
 IcePack.Registry.DynamicRegistration=1

其中的一些属性用来指定端点信息,需要注意的是IcePack..Registry.Client.Endpoints必需使用手动指定的端口号,该属性的作用是指定IcePack locator 服务端点。同时在客户端中Ice.Default.Locator也要使用相同的端口。

IcePack.Registry.Data 用来指定注册器数据库的路径。此数据文件用来存储adapter与基所对就的Server位置信息。

IcePack.Registry.DynamicRegistration 用来指定是否允许动态的注册对象适配器,0表示不允许,非0表允许。

这里要说明一下,有三种向Registry注册adapter及端点信息的方法,一是使用icepacknode,另一个是使用iceadmin工具,前两种被称为非动态注册,第三种是在server程序中向Registry注册,此被称为动态注册。


2.配置客户端(Configuring the Client)

 

客户端的需要很少的配置,仅需要配置Ice.Default.Locator属性,该属性用于使用客户端指向Rigistry 上的定位器(Locator)。

配置文件为 /opt/ripper/client.cfg

Ice.Default.Locator=IcePack/Locator:tcp -h 10.10.110.1 -p 32769

基中的10.10.110.1为Registry所在的IP,端口必须与Registry所指定的端口一致


3.配置服务器(Configuring the Server)

 

这里使用/opt/ripper/server.cfg来作为服务器端的配置文件,其包含以下内容:

EncoderAdapter.AdapterId=EncoderAdapter
EncoderAdapter.Endpoints=tcp
Ice.Default.Locator=IcePack/Locator:tcp-h 10.10.110.1 -p 32769


EncoderAdapter.AdapterId 用来提供客户端在间接绑定中所要使用代理的对象适配器标识符。

EncoderAdapter.Endpoints 用来指定对象适配器的端点,如果不指定端口就意味着使用系统动态分配的端口。

Ice.Default.Locator  注册器的地址


4.下面来看server客的JAVA程序

Ice.Communicator ic=null;
try{
	ic=Ice.Util.initialize(args);
	Ice.ObjectAdapter adapter=ic.createObjectAdapter("EncorderAdapter");
	Ice.Object object=new ServantI();
	adapter.add(object,Ice.Util.stringToIdentity("Encord");
	adapter.activate();
	ic.waitForShutdown();
}catch(Ice.LocalException e){
}catch(Exception e){
}

EncorderAdapter为此server所提供的adapter,所提供的调用对象为object,其标识符为Encord,当执行adapter.activate()后,此server便会向Registry注册自己所提供的adapter及自己的IP.

5.client的JAVA代码如下:

Ice.Communicator ic=null;

Ice.Properties prop=null;

try{

prop=Ice.Util.createProperties();

ic=Ice.Util.initializeWithProperties(args,prop);

Ice.ObjectPrx base=ic.stringToProxy("Encord@EncorderAdapter");

ServantPrx servantprx=ServantPrxHelper.checkedCast(base);

//至此客户端获得了服务器端ServantI 的代理,便可以执行远程调用了。


6.启动注册器Registry)

在Registry结点上执行如下命令,注意Registry可以在单独的结点上,也可以和Client或Server在同一个结点上。

$icepackregistry --Ice.Config=/opt/ripper/registry/registry.cfg


7.启动服务器

$ ./server --Ice.Config=/opt/ripper/server.cfg


8.启动客户端

$./client --Ice.Config= /opt/ripper/client.cfg


至此,一个动态绑定的ICE实例便完成了。

你可能感兴趣的:(ICEPACK/ICEGRID动态绑定端口用例)