ICE第三篇------一些疑难点

时间:2023-03-09 21:48:40
ICE第三篇------一些疑难点

1 间接代理

参考http://blog.sina.com.cn/s/blog_53e8499c0100lkoo.html

IceGrid用于支持分布式网络服务应用,一个IceGrid域由一个注册表(Registry)和任何数目的节点(Node)构成。注册表(Registry)和节点(Node)一起合作管理一些信息以及包含一些应用(Application)的服务进程。每项应用(Application)被指定在特定节点上的服务。这个注册表(Registry)持久记录了这些信息,而节点(Node)负责启动和监测其指定的服务器进程。对于一个典型的配置,一个节点(Node)运行在一台计算机(称之为Ice服务器主机)。注册表(Registry)并不消耗很多处理器时间,所以它常常是和一个节点(Node)运行在同一台计算机上的,注册表(Registry)还可以和一个节点(Node)可以运行在同一进程中.如果需要容错,注册表(Registry)还可以用主从式的设计支持复制(Replication)。

注册表(Registry)的主要责任,是解决作为Ice定位服务的间接代理问题,当客户端第一次尝试使用一种间接代理,客户端Ice run time首先连接注册表(registry),注册表将间接代理的符号信息转化为直接代理的endpoint,然后客户端和直接代理建立一个连接。通过适配器复制,同名适配器可以分布在多个节点上,间接代理可以映射到多个节点上的直接代理,在运行时由注册表服务根据负载均衡自动选择一个直接代理给客户端。

使用间接代理时,客户端可以用以下方式直接获取服务对象代理:

MyProxy=theObject@theAdapter  // 对象@适配器

更简单一点的话可以用以下方式

MyProxy=theObject  // 对象

2.6.1 分布式部署

在部署IceGrid分布式服务时,需要启动注册表服务(icegridregistry),并配置注册表服务地址端口、通信协议和注册信息保存的目录地址(ICE的注册信息保存为BerkeleyDB的数据库文件):

IceGrid.Registry.Client.Endpoints=tcp-p 4061

IceGrid.Registry.Data=/opt/ripper/registry

在服务器节点中和客户端都需要配置注册表服务的地址端口和通信协议:

Ice.Default.Locator=IceGrid/Locator:tcp -h 172.0.0.1 -p4061

参考这个位置http://blog.chaoskey.com/2008/04/24/10

Ice::ObjectPrx proxy =

    communicator‑>stringToProxy("factory@EncoderAdapter");

Ripper::MP3EncoderFactoryPrx factory =

    Ripper::MP3EncoderFactoryPrx::checkedCast(proxy);

Ripper::MP3EncoderPrx encoder = factory‑>createEncoder();
注意:客户端使用一个MP3EncoderFactory对象的间接代理。这个字符串代理从字面上来看,是"标识为EncoderAdapter的对象适配器中的一个标识为factory的对象". 这个编码服务器创建这个对象适配器,并确保对象适配器使用此标识符。由于每个对象适配器被唯一标识,注册器(Registry)可以很容易确定的服务器创造了适配器和返回一个适当的Endpoint给客户端.
这个客户端调用 checkedCast 是在这个factory对象上的第一个远程调用,因此,这个定位请求在这个调用过程中被执行。随后调用 createEncoder 是直接发送给服务器而没有IceGrid的进一步参与.