更新时间:2023-12-30 09:39
网络通信引擎ICE(Internet Communications Engine)是Zero C公司的分布式系统开发专家实现的一种新的高性能的面向对象中间件平台。从根本上说, ICE 为构建面向对象的客户-服务器应用提供了工具、 API( Application Program Interface)和库支持。基于ICE可以实现电信级的解决方案。
中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。
在设计网站架构的时候可以使用ICE实现对网站应用的基础对象操作,将基础对象操作和数据库操作封装在这一层,在业务逻辑层以及表现层(java,php,.net,python)进行更丰富的表现与操作,从而实现比较好的架构。基于ICE的数据层可以在未来方便的进行扩展。ICE支持分布式的部署管理,消息中间件,以及网格计算等等。
ICE 作为一种新型的面向对象中间件,目前并未得到广泛地应用。然而它在架构上为应用开发提供的种种好处,如面向对象的语义、支持同步和异步的消息传递、支持多个接口、机器、语言、操作系统无关性、线程支持、位置和服务器的透明性、高度的安全性、内建的恒久机制以及开放的源码等等,它有着非常强大的技术优势。在构建三层分布式系统方面, ICE 中间件技术有着良好的发展前景。
客户与服务器
按照常规的理解,客户与服务器的划分在于两者承担的角色不同:客户是发出请求的一方,服务器是响应请求、提供服务的一方。然而在实际应用中,很多服务器并不是纯粹的服务器,它们常常充当某些客户的服务器,但为了完成它们的客户的请求,它们又会充当其他的服务器的客户。
同理,很多客户机也不是纯粹的客户。例如,客户可以在服务器上启动一个长时间运行的操作,在启动该操作时,客户可以向服务器提供回调对象( callback object),供服务器用于在操作完成时向客户发出通知。在这种情况下,客户在启动操作时充当客户,而在接收操作完成通知时充当服务器。
ICE对象
Ice 对象是本地或远地的地址空间中、能响应客户请求的实体。一个Ice对象可在一个或多个服务器中实例化。每个Ice对象都有一个或多个接口。一个接口是一个对象所支持的一系列有名称的操作,客户通过调用操作来发出请求。一个操作有零个或更多参数,以及一个返回值。每个Ice 对象都有一个唯一的对象标识。对象标识是用于把一个对象与其他所有对象区别开来的标识值。 Ice 对象模型假定对象标识是全局唯一的,也就是说,在一个Ice 通信域中,不会有两个对象具有相同的对象标识。对象标识既可以通过调用GenerateUUID全局唯一产生,也可以根据自己的喜好随意创建一个,只要没与其他对象标识重复即可。对象标识的定义如下:
module Ice
struct Identity
string name;
string category;
;
;
代理
要想与某个Ice对象联系,客户必须持有这个对象的代理。对客户而言,代理就是Ice对象的本地代表(该对象可能在远地)。代理所封装的信息有:寻址信息:用于让客户端run time 联系正确的服务器对象标识:用于确定服务器中的哪一个对象是请求的目标可选的facet 标识符:用于确定代理所引用的是对象的哪一个facet。
Servants
Ice 对象是一种具有类型、标识,以及寻址信息,在本地或远地的地址空间中、能响应客户请求的实体的概念性实体。而Servants是服务器端用具体的编程语言实现的实体,并且在服务器的地址空间中进行实例化。 Servants 为“客户发送的操作调用”提供服务器端行为。
动态映射表
动态映射表( Active servant map),简称ASM。之所以称为动态映射表,是因为它可以动态维护servant的数量,可以添加,也可以删除。它是一个查找表,用于把对象标识映射到servant;要激活一个servant,就将它添加进动态映射表。这个过程可以看作是在“Ice 对象的标识”与“对应的用编程语言编写的、负责为该ICE对象处理请求的servant”之间创建链接。这个链接创建好之后,一旦客户端的请求到来时, Ice run time 就可以将该请求分派给正确的servant来执行。动态servant映射表的几种操作行为如下:
add
add 操作把一个具有指定标识的servant 增加到ASM中。一旦add 被调用,请求就会分派给这个servant。返回值是这个servant 所体现的Ice对象的代理。你不能用同一标识多次调用add:如果你试图在ASM 中增加一个已经存在的标识,就会引发AlreadyRegisteredException
addWithUUID
addWithUUID 操作的行为和add 操作一样,但你不需要为servant 提供标识。addWithUUID 会生成一个UUID,作为对应的Ice 对象的标识。
remove
remove 操作中断对象标识与其servant 之间的关联,从ASM 中移除对应的条目。一旦servant 解除了激活,新到来的针对已移除的对象标识的请求会引发ObjectNotExistException
Ice 对象的实现过程如下:
服务器端
(1) 创建 servant 类,并在服务器端 Ice run time 上注册。
(2) 实例化 servant 类,创建具体的 servant。
(3) 为这个 servant 所体现的 Ice 对象创建标识。
(4) 激活 servant(即将 servant 添加进动态 servant 映射表)。
客户端
(1) 当客户端要调用某一操作时, 客户端 run time 会将对象标识以及请求一起发给服务器。
(2) 服务器端的对象适配器接收到了请求和对象标识, 对象适配器继而根据这个对象标识,在它所维护管理的active servant map中查找其相对应的正确的servant。
(3) 若找到了与对象标识对应的正确的servant,就把调用分派给它。若查找不到,就会引发Object Not Exist Exception。最后客户端接收到来自服务器端的返回值或异常信息。
ICE主要设计目标是:
(一) 面向对象的语义
支持面向对象的分布式计算技术。
(二) 适合在异种环境中使用
客户和服务器可以用不同的编程语言编写,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论应用环境如何,这些源码是可以移植的。
(三) IceStorm 的发布/订阅机制
IceStorm 是一种发布-订阅服务, 能够解除客户与服务器的耦合。 在本质上, IceStorm充当的是事件分发交换机。发布者把事件发给这个服务,由它发给订阅者。这样,发布者发布的单个事件就可以发送给多个订阅者。 IceStorm适用于构建高效的事件转发机制。
(四) 利用 Glacier 机制,可以方便地实现穿越防火墙
Glacier 是Ice 防火墙服务:它能让客户与服务器通过防火墙安全地进行通信,且不牺牲安全性。
(五) 采用了 TCP/UDP 协议
ICE 提供了一种 RPC 协议,既可以把 TCP/IP、也可以把 UDP 用作底层传输机制。(可以通过配置一个参数来选择需要的传输机制)。另外, ICE 还允许采用 SSL 作为传输机制,让客户和服务器间所有通信都进行加密。
(六) 可靠的安全机制
ICE 采用了 SSL 加密技术,使得客户机和服务器哪怕是在不安全的网络中,也可以安全地进行通信。