ICE初识
ICE:Internet Communications Engine
一种适用于异种环境的面向对象中间件平台
他为我们提供了除DCOM,CORBA,JAVA RMI,.NET Remoting, Web Service,SOAP RPC以外的一种远程调用方式。
更重要的是ICE是一种跨操作系统跨语言的远程调用方式(支持.NET1.1 MONO1.0)。
主页在:http://www.zeroc.com/index.html
下面摘录几段ICE1.3文档中的话:
Ice 是一种面向对象的中间件平台。从根本上说,这意味着Ice 为构建面
向对象的客户-服务器应用提供了工具、API 和库支持。Ice 应用适合在异
种环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不
同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论
部署环境如何,这些应用的源码都是可移植的
Ice 对象(Ice Objects)
Ice 对象是一种概念性的实体(或称抽象)。Ice 对象具有以下特征:
• Ice 对象是本地或远地的地址空间中、能响应客户请求的实体。
• 一个Ice 对象可在单个或多个服务器中实例化(后者是冗余方式)。如果
某个对象同时有多个实例,它仍是一个Ice 对象。
• 每个Ice对象都有一个或多个接口。 一个接口是一个对象所支持的一系列
有名称的操作。客户通过调用操作来发出请求。
• 一个操作有零个或更多参数,以及一个返回值。参数和返回值具有明确
的类型。参数是有名称的,并且有方向:in 参数由客户初始化,并传给
服务器; out 参数由服务器初始化,并传给客户(返回值只是一种特
殊的out 参数)。
• 一个Ice 对象具有一个特殊的接口,称为它的主接口。此外, Ice 对象还
可以提供零个或更多其他接口,称为facets (面)。客户可以在某个对
象的各个facets 之间进行挑选,选出它们想要使用的接口。
• 每个Ice 对象都有一个唯一的对象标识(object identity)。对象标识是用
于把一个对象与其他所有对象区别开来的标识值。Ice 对象模型假定对
象标识是全局唯一的,也就是说,在一个Ice 通信域中,不会有两个对
象具有相同的对象标识。
在实践中,你不需要使用像UUID[14] 这样的全局唯一的对象标识,
只要你使用的标识与你感兴趣的域中的其他任何标识不相冲突,就可以
了。但在架构上,使用全局唯一的标识符能带来一些好处,我们将在
XREF 中对此加以探究。
代理(Proxies)
要想与某个Ice 对象联系,客户必须持有这个对象的代理1。 代理是客户
的地址空间中的一种制品(artifact);对客户而言,代理就是Ice 对象的
代表(该对象可能在远地)。一个代理充当的是一个Ice 对象的本地大使:
当客户调用代理上的操作时, 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 run
time 提供了一些API 调用,允许你把代理转换成它的串化形式,或是进行
相反的转换。例如,如果你要把代理存储在数据库表或文本文件中,这种
功能会很有用。
倘若客户知道某个Ice 对象的标识及其寻址信息,使用这些信息,它可
以“凭空”创建代理。换句话说,代理内部的所有信息都被认为是透明的
;要与某个对象联系,客户只需要知道这个对象的标识、寻址信息,以及
对象的类型(为了能调用操作),就可以了。
Ice 核心为分布式应用开发提供了一个完善的客户-服务器平台。但现
实应用需要的常常不止是远地通信能力:你通常还需要拥有这样的能力:
随需启动服务器、把代理分发给客户、分发异步事件、配置你的应用、分
发应用补丁,等等。
在Ice 中有一些服务, 能够提供上述特性及其他一些特性。这些服务被
实现成Ice 服务器,你的应用充当的是这些服务器的客户。这些服务都没有
使用Ice 的任何向应用开发者隐藏起来的内部特性,所以在理论上,你可以
自行开发等价的服务。但让这些服务成为平台的一部分,你就可以专注于
应用开发,而不必先构建许多基础设施。而且,构建这样的服务所需的工
作量并非微不足道,所以你应该了解有哪些服务可用,而不要重新发明你
自己的轮子。
Ice 在架构上为应用开发者提供了一些好处:
• 面向对象的语义
Ice “在线路上”完全保留了 面向对象范型。所有的操作调用都使用
迟后绑定,所以操作的实现的选定,是根据对象在运行时的(而不是
静态的)实际类型决定的。
• 支持同步和异步的消息传递
Ice 提供了同步和异步的操作调用和分派,并且通过IceStorm 提供了
发布-订阅消息传递机制。这样,你可以根据你的应用的需要来选择通
信模型,而不必把你的应用硬塞进某种模型里。
• 支持多个接口
通过facets,对象可以提供多个不相关的接口,同时又跨越这些接
口、保持单一的对象标识。这提供了极大的灵活性,特别是在这样的情
况下:应用在发生演化,但又需要与更老的、已经部署的客户保持兼
容。
• 机器无关性
客户及服务器与底层的机器架构屏蔽开来。对于应用代码而言,像
字节序和填充这样的问题都隐藏了起来。
• 语言无关性
客户和服务器可以分别部署,所用语言也可以不同(目前支持
C++、Java,以及PHP (客户端))。 客户和服务器所用的Slice 定义建
立两者之间的接口合约,这样的定义也是它们唯一需要达成一致的东
西。
• 实现无关性
客户不知道服务器是怎样实现其对象的。这意味着,在客户部署之
后,服务器的实现可以改变,例如,它可以使用不同的持久机制,甚至
不同的程序设计语言。
• 操作系统无关性
Ice API 完全是可移植的,所以同样的源码能够在Windows 和UNIX
上编译和运行。
• 线程支持
Ice run time 完全是线程化的,其API 是线程安全的。 作为应用开发
者,(除了在访问共享数据时进行同步)你无需为开发线程化的高性能
客户和服务器付出额外努力。
• 传输机制无关性
Ice 目前采用了TCP/IP 和UDP 作为传输协议。客户和服务器代码都
不需要了解底层的传输机制(你可以通过一个配置参数选择所需的传
输机制)。
• 位置和服务器透明性
Ice run time 会负责定位对象,并管理底层的传输机制,比如打开和
关闭连接。客户与服务器之间的交互显得像是无连接的。如果在客户调
用操作时,服务器没有运行,你可以通过IcePack 让它们随需启动。服
务器可以迁移到不同的物理地址,而不会使客户持有的代理失效,而客
户完全不知道对象实现是怎样分布在多个服务器进程上的。
• 安全性
通过SSL 强加密,可以使客户和服务器完全安全地进行通信,这
样,应用可以使用不安全的网络安全地进行通信。你可以使用Glacier
穿过防火墙,实现安全的请求转发,并且完全支持回调。
• 内建的持久机制
使用Freeze,创建持久的对象实现变成了一件微不足道的事情。Ice
提供了对高性能数据库Berkeley DB[18] 的内建支持。
• 开放源码
Ice 的源码是开放的。尽管要使用Ice 平台,并不一定要阅读源码,
通过源码你可以了解各种事情是怎样实现的,或把这些代码移植到新的
操作系统上。
总而言之, Ice 提供了一流的分布式计算开发和部署环境,比我们所知
道的其他任何平台都更完整。
一种适用于异种环境的面向对象中间件平台
他为我们提供了除DCOM,CORBA,JAVA RMI,.NET Remoting, Web Service,SOAP RPC以外的一种远程调用方式。
更重要的是ICE是一种跨操作系统跨语言的远程调用方式(支持.NET1.1 MONO1.0)。
主页在:http://www.zeroc.com/index.html
下面摘录几段ICE1.3文档中的话:
Ice 是一种面向对象的中间件平台。从根本上说,这意味着Ice 为构建面
向对象的客户-服务器应用提供了工具、API 和库支持。Ice 应用适合在异
种环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不
同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论
部署环境如何,这些应用的源码都是可移植的
Ice 对象(Ice Objects)
Ice 对象是一种概念性的实体(或称抽象)。Ice 对象具有以下特征:
• Ice 对象是本地或远地的地址空间中、能响应客户请求的实体。
• 一个Ice 对象可在单个或多个服务器中实例化(后者是冗余方式)。如果
某个对象同时有多个实例,它仍是一个Ice 对象。
• 每个Ice对象都有一个或多个接口。 一个接口是一个对象所支持的一系列
有名称的操作。客户通过调用操作来发出请求。
• 一个操作有零个或更多参数,以及一个返回值。参数和返回值具有明确
的类型。参数是有名称的,并且有方向:in 参数由客户初始化,并传给
服务器; out 参数由服务器初始化,并传给客户(返回值只是一种特
殊的out 参数)。
• 一个Ice 对象具有一个特殊的接口,称为它的主接口。此外, Ice 对象还
可以提供零个或更多其他接口,称为facets (面)。客户可以在某个对
象的各个facets 之间进行挑选,选出它们想要使用的接口。
• 每个Ice 对象都有一个唯一的对象标识(object identity)。对象标识是用
于把一个对象与其他所有对象区别开来的标识值。Ice 对象模型假定对
象标识是全局唯一的,也就是说,在一个Ice 通信域中,不会有两个对
象具有相同的对象标识。
在实践中,你不需要使用像UUID[14] 这样的全局唯一的对象标识,
只要你使用的标识与你感兴趣的域中的其他任何标识不相冲突,就可以
了。但在架构上,使用全局唯一的标识符能带来一些好处,我们将在
XREF 中对此加以探究。
代理(Proxies)
要想与某个Ice 对象联系,客户必须持有这个对象的代理1。 代理是客户
的地址空间中的一种制品(artifact);对客户而言,代理就是Ice 对象的
代表(该对象可能在远地)。一个代理充当的是一个Ice 对象的本地大使:
当客户调用代理上的操作时, 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 run
time 提供了一些API 调用,允许你把代理转换成它的串化形式,或是进行
相反的转换。例如,如果你要把代理存储在数据库表或文本文件中,这种
功能会很有用。
倘若客户知道某个Ice 对象的标识及其寻址信息,使用这些信息,它可
以“凭空”创建代理。换句话说,代理内部的所有信息都被认为是透明的
;要与某个对象联系,客户只需要知道这个对象的标识、寻址信息,以及
对象的类型(为了能调用操作),就可以了。
Ice 核心为分布式应用开发提供了一个完善的客户-服务器平台。但现
实应用需要的常常不止是远地通信能力:你通常还需要拥有这样的能力:
随需启动服务器、把代理分发给客户、分发异步事件、配置你的应用、分
发应用补丁,等等。
在Ice 中有一些服务, 能够提供上述特性及其他一些特性。这些服务被
实现成Ice 服务器,你的应用充当的是这些服务器的客户。这些服务都没有
使用Ice 的任何向应用开发者隐藏起来的内部特性,所以在理论上,你可以
自行开发等价的服务。但让这些服务成为平台的一部分,你就可以专注于
应用开发,而不必先构建许多基础设施。而且,构建这样的服务所需的工
作量并非微不足道,所以你应该了解有哪些服务可用,而不要重新发明你
自己的轮子。
Ice 在架构上为应用开发者提供了一些好处:
• 面向对象的语义
Ice “在线路上”完全保留了 面向对象范型。所有的操作调用都使用
迟后绑定,所以操作的实现的选定,是根据对象在运行时的(而不是
静态的)实际类型决定的。
• 支持同步和异步的消息传递
Ice 提供了同步和异步的操作调用和分派,并且通过IceStorm 提供了
发布-订阅消息传递机制。这样,你可以根据你的应用的需要来选择通
信模型,而不必把你的应用硬塞进某种模型里。
• 支持多个接口
通过facets,对象可以提供多个不相关的接口,同时又跨越这些接
口、保持单一的对象标识。这提供了极大的灵活性,特别是在这样的情
况下:应用在发生演化,但又需要与更老的、已经部署的客户保持兼
容。
• 机器无关性
客户及服务器与底层的机器架构屏蔽开来。对于应用代码而言,像
字节序和填充这样的问题都隐藏了起来。
• 语言无关性
客户和服务器可以分别部署,所用语言也可以不同(目前支持
C++、Java,以及PHP (客户端))。 客户和服务器所用的Slice 定义建
立两者之间的接口合约,这样的定义也是它们唯一需要达成一致的东
西。
• 实现无关性
客户不知道服务器是怎样实现其对象的。这意味着,在客户部署之
后,服务器的实现可以改变,例如,它可以使用不同的持久机制,甚至
不同的程序设计语言。
• 操作系统无关性
Ice API 完全是可移植的,所以同样的源码能够在Windows 和UNIX
上编译和运行。
• 线程支持
Ice run time 完全是线程化的,其API 是线程安全的。 作为应用开发
者,(除了在访问共享数据时进行同步)你无需为开发线程化的高性能
客户和服务器付出额外努力。
• 传输机制无关性
Ice 目前采用了TCP/IP 和UDP 作为传输协议。客户和服务器代码都
不需要了解底层的传输机制(你可以通过一个配置参数选择所需的传
输机制)。
• 位置和服务器透明性
Ice run time 会负责定位对象,并管理底层的传输机制,比如打开和
关闭连接。客户与服务器之间的交互显得像是无连接的。如果在客户调
用操作时,服务器没有运行,你可以通过IcePack 让它们随需启动。服
务器可以迁移到不同的物理地址,而不会使客户持有的代理失效,而客
户完全不知道对象实现是怎样分布在多个服务器进程上的。
• 安全性
通过SSL 强加密,可以使客户和服务器完全安全地进行通信,这
样,应用可以使用不安全的网络安全地进行通信。你可以使用Glacier
穿过防火墙,实现安全的请求转发,并且完全支持回调。
• 内建的持久机制
使用Freeze,创建持久的对象实现变成了一件微不足道的事情。Ice
提供了对高性能数据库Berkeley DB[18] 的内建支持。
• 开放源码
Ice 的源码是开放的。尽管要使用Ice 平台,并不一定要阅读源码,
通过源码你可以了解各种事情是怎样实现的,或把这些代码移植到新的
操作系统上。
总而言之, Ice 提供了一流的分布式计算开发和部署环境,比我们所知
道的其他任何平台都更完整。