ICE
14网络通信引擎ICE(Internet Communications Engine)是Zero C公司的分布式系统开发专家实现的一种新的高性能的面向对象中间件平台。从根本上说, ICE 为构建面向对象的客户-服务器应用提供了工具、 API( Application Program Interface)和库支持。1基于ICE可以实现电信级的解决方案。
基本信息
- 中文名
网络通信引擎
- 软件名称
ICE
- 开发商
ZeroC
- 软件语言
C++,Java,c#等
技术简介
中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。
在设计网站架构的时候可以使用ICE实现对网站应用的基础对象操作,将基础对象操作和数据库操作封装在这一层,在业务逻辑层以及表现层(java,php,.net,python)进行更丰富的表现与操作,从而实现比较好的架构。基于ICE的数据层可以在未来方便的进行扩展。ICE支持分布式的部署管理,消息中间件,以及网格计算等等。2
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映射表的几种操作行为如下:addadd 操作把一个具有指定标识的servant 增加到ASM中。一旦add 被调用,请求就会分派给这个servant。返回值是这个servant 所体现的Ice对象的代理。你不能用同一标识多次调用add:如果你试图在ASM 中增加一个已经存在的标识,就会引发AlreadyRegisteredException
addWithUUID
addWithUUID 操作的行为和add 操作一样,但你不需要为servant 提供标识。addWithUUID 会生成一个UUID,作为对应的Ice 对象的标识。removeremove 操作中断对象标识与其servant 之间的关联,从ASM 中移除对应的条目。一旦servant 解除了激活,新到来的针对已移除的对象标识的请求会引发ObjectNotExistException