ICE系列之初始ICE
Ice是一种面向对象的中间件平台,分为客户服务端。适用环境:跨网络,跨语言,跨平台的对等通信中间件。为我们提供了一种远程调用方式。
ICE术语:
客户与服务器 (Clients and Servers):在ICE中,客户端可以主动向服务端发送请求,服务端也可以主动向客户端发送请求,也就是客户端与服务端是对等(peer-to-peer)的。
ICE对象:Ice 对象是一种概念性的实体 (或称抽象)。
ICE对象的特征:
1 Ice 对象是本地或远地的地址空间中、能响应客户请求的实体。
2 一个 Ice 对象可在单个或多个服务器中实例化(后者是冗余方式)。如果某个对象同时有多个实例,它仍是一个 Ice 对象
3 每个Ice对象都有一个或多个接口。 一个接口是一个对象所支持的一系列有名称的操作。客户通过调用操作来发出请求。
4 一个操作有零个或更多参数,以及一个返回值。参数和返回值具有明确的类型。参数是有名称的,并且有方向:in 参数由客户初始化,并传给服务器; out 参数由服务器初始化,并传给客户 (返回值只是一种特殊的 out 参数)。
5 一个 Ice 对象具有一个特殊的接口,称为它的主接口。此外,Ice 对象还可以提供零个或更多其他接口,称为 facets (面)。客户可以在某个对象的各个 facets 之间进行挑选,选出它们想要使用的接口。
6 每个 Ice 对象都有一个唯一的对象标识(object identity)。对象标识是用于把一个对象与其他所有对象区别开来的标识值。 Ice 对象模型假定对
象标识是全局唯一的,也就是说,在一个 Ice 通信域中,不会有两个对象具有相同的对象标识。
代理 (Proxies):代理就是客户端调用服务端方法的代理对象。把用户像本地的调用转换为对具体服务端的调用,可以类比wcf,webservice,remoting中的代理
发生代理调用时,Ice run time 会:
1. 定位 Ice 对象
2. 如果 Ice 对象的服务器没有运行,就激活它
3. 在服务器中激活 Ice 对象
4. 把所有 in 参数传送给 Ice 对象
5. 等待操作完成
6. 把所有 out 参数及返回值返回给客户 (或在发生错误的情况下抛出异
常)
代理包含的信息有:
• 寻址信息:用于让客户端 run time 联系正确的服务器
• 对象标识:用于确定服务器中的哪一个对象是请求的目标
• 可选的 facet 标识符:用于确定代理所引用的是对象的哪一个 facet
串化代理 (Stringified Proxies):代理中的信息可以用串的形式表示。例如:
SimplePrinter:default -p 10000
Ice runtime 提供了一些 API 调用,允许你把代理转换成它的串化形式,或是进行相反的转换。
直接代理 (Direct Proxies):
直接代理是这样一种代理:其内部保存有某个对象的标识,以及它的服务器的运行地址。该地址由以下两项内容完全确定:
• 协议标识符 (比如 TCP/IP 或 UDP)
• 针对具体协议的地址 (比如主机名和端口号)为了联系直接代理所代表的对象,Ice run time 使用代理内部的寻址信息来联系服务器;每当客户向服务器发出请求时,也会把对象的标识发送过去。
间接代理(Indirect Proxies):
其内部保存有某个对象的标识,以及对象适配器名(object adapter name)。要注意,间接代理没有包含寻址信息。为了正确地定位服务器,客户端 run time 会使用代理内部的对象适配器名,将其传给某个定位器服务,比如 IcePack 服务。然后,定位器会把适配器名当作关键字,在含有服务器地址的表中进行查找,把当前的服务器地址返回给客户。客户端 run time 现在知道了怎样联系服务器,就会像平常一样分派 (dispatch)客户请求。
直接绑定 vs. 间接绑定 (Direct Versus Indirect Binding):
把代理里面的信息解析为协议-地址对的过程称为绑定。不奇怪,直接绑定用于直接代理,而间接绑定用于间接代理间接绑定的主要好处是,它允许我们移动服务器 (也就是说,改变它们的地址),同时又不会使客户所持有的已有代理失效。换句话说,使用直接代理,你不用为了定位服务器而进行额外的查找,但如果服务器被移到其他机器上,它就不再能工作。而另一方面,即使我们移动 (或迁移,migrate)服务器,间接代理也能够继续工作。
Servants:
在服务器端提供操作调用的行为的制品叫作 servant。一个 servant 提供一个或多个 Ice 对象的实质内容 (或体现这些对象, incarnate)。实际上,servant 就是服务器开发者编写的类的实例,这些类作为一个或多个 Ice 对象的 servant、向服务器端 run time 进行注册。类的方法对应于 Ice 对象的接口上的操作,并且提供这些操作的行为。
Slice (Ice 规范语言)
每个 Ice 对象都有一个接口,该接口具有一些操作。接口、操作,还有在客户及服务器间交换的数据的类型,都是用 Slice 语言定义的。 Slice 允许你以一种独立于特定编程语言 (比如 C++ 或 Java)的方式定义客户-服务器的合约。 Slice 定义由一个编译器编译成特定编程语言的 API,也就是说,与你所定义的接口和类型对应的那一部分 API,会由生成的代码组成。
Ice 协议
Ice 提供了一种 RPC 协议,既可以把 TCP/IP、也可以把 UDP 用作底层传输机制。此外,Ice 还允许你把 SSL 用作传输机制,让客户与服务器间的所有通信都进行加密。