1、ICE学习总结资料目录 11.准备知识 31.1中间件 32.ICE定义 42.1什么是ICE 42.2 ICE的优点 52.3与WebService的对比 53.ICE基础概念和模型 63.1 ICE的基础调用模型 63.2 ICE调用模式 73.3 ICE的版本控制(Facet) 83.4 持久化 (Feeze) 83.5 服务装箱管理(ICE Box) 83.6文件分发(ICEPatch2) 93.7发布/订阅服务(ICEStorm) 93.8 网络拓扑负载解决方案(ICEGrid) -终极武器 94.ICE关键术语 94.1 Ice 对象(Ice Objects) 94.2代理(Pro
2、xies) 104.3 Servants 134.4.Ice Run Time 概述 134.5对象适配器 155.Slice语言介绍 175.1语法规范 175.2基本类型 195.3接口、异常 216.ICE架构 216.1分布式应用程序架构 215.2 ICE的整体架构 237.ICE Grid介绍 247.1 IceGrid功能 247.2 IceGrid架构 258.ICE Grid配置部署 278.1环境 279.ICE的C#简单示例 3110.ICE的实际应用 311.准备知识1.1中间件简单来说,中间件就是一种独立的系统软件或者某种服务应用程序。中间件处在客户端与服务器端的操作
3、系统之上,主要负责网络资源管理和网络通信。中间件是一类软件,而非一种软件;中间件不仅仅实现互连,还要实现应用之间的互操作;中间件是基于分布式处理的软件,最突出的特点是其网络通信功能。中间件的特性 1)运行在异种环境中,也就是说可以运行在多种硬件和操作系统中; 2)支持分布式应用,提供跨网络,或者操作系统平台的应用或者服务的交互功能; 3)同样也支持一些标准的网络协议和标准的接口;中间件的分类1)远程过程调用:server和client可以位于同一台计算机,也可以位于不同的计算机,甚至运行在不同的操作系统之上。 2)面向消息的中间件:MOM指的是利用高效可靠的消息传递机制进行平台无关的数据交流,
4、并基于数据通信来进行分布式系统的集成。程序将消息放入消息队列或从消息队列中取出消息来进行通讯,与此关联的全部活动,比如维护消息队列、维护程序和队列之间的关系、处理网络的重新启动和在网络中移动消息等是MOM的任务,程序不直接与其它程序通话,并且它们不涉及网络通讯的复杂性。 3)对象请求代理(ORB)是对象总线,它在CORBA规范中处于核心地位,定义异构环境下对象透明地发送请求和接收响应的基本机制,是建立对象之间client/server关系的中间件。 4)事务处理监控界于client和server之间,进行事务管理与协调、负载平衡、失败恢复等,以提高系统的整体性能。它可以被看作是事务处理应用程序
5、的“操作系统”。2.ICE定义2.1什么是ICEICE(Internet Communications Engine)呢,它是由Zeroc公司开发的一套开源中间件系统,是一种面向对象的中间件平台。与DCOM,CORBA,WEB SERVICEDcom类似,支持RPC(Remote Procedure Call 远程过程调用)协议,但是在效率上却高于前面所述几种技术方案,是一种适用于各种环境的面向对象的中间件平台:客户和服务器可以用不同的编程语言来编写, 可以运行在不同的操作系统和系统架构上,并且可以使用多种网络技术经行通信(例如TCP、UDP、SSL等),这给我们的应用和部署带来很大的便捷性。
6、 2.2 ICE的优点1、跨平台,支持多种语言2、面向对象编程3、为分布式应用方面提供了一整套 强大的特性和功能支持(例如负载平衡、软件分发、数据同步等)。4、在网络带宽、内存使用和CPU开销方面已经内置了高效的实现。5、内置了安全特征的实现,可跨越不安全的网络(广域网)使用。6、降低了复杂性,易于学习和使用。2.3与WebService的对比说到远程调用,我们最熟悉的莫过于WebService了,那么就对他们做一下简单的对比,其 中星的颗数有待商榷,表达的也仅是一种意思,不过从我个人的角度上来看,他们已经没有可比性了,因为你拿的是一台机器和一群机器在比。ICE的强大在于它推出了ICEGrid
7、,在 后续的文章中将会重点介绍它。3.ICE基础概念和模型3.1 ICE的基础调用模型 首先我们来看看ICE的基础调用模型(如下图所示),值得一提的是在单项调用和数据报业务中,4、5、6几步是没有的,这里面的几个概念和关键词特别重要,也是我们后面学习的基础Client(客户端):估计这个大家都非常清楚,通俗的讲就是一个请求的发起方。Proxy(代理):代理实际上就是远程服务驻在本地的一个代表,创建 它时首先会和远程服务经行握手和状态确认等操作,Client所有的操作都是从过Proxy来办理的。代理又分为直接代理(已经知道服务端的位置及其他信息)和间接代理(不知道服务器在哪里,由Registry
8、注册器告诉它地址等信息)。Adapter(适配器):是配置相当于服务单位 (Servant)的管理者,它管理着每个请求该分配给哪一个服务单位。Servant(服务单元):它是服务的最小单位,一般是具体到 某个接口的实现。刚才我们提到了接口的实现,但是这个接口是谁定义的,这个时候我们不免要提到Slice(Specification Language for Ice),也就是ICE所使用的“语言”,正是有了这个“中间语言”,我们才可以做到支持各种编程语言,因为你所使用的语言只要跟Slice打交道就可以了3.2 ICE调用模式ICE采用的网络协议有TCP、UDP以及SSL三 种,不同于WebServ
9、ice,ICE在调用模式上有好几种选择方案,并且每种方案正对不同的网络协议的特性做了相应的选择。1.Oneway(单向调用):客户端只需将调用注册到本地传输缓冲区(Local Transport Buffers)后就立即返回,并不对调用结果负责。2.Twoway(双向调用):最通用的模式,同步方法调用模式,只能用TCP或SSL协议。3.Datagram(数据报):类似于Oneway调用,不同的是 Datagram调用只能采用UDP协议而且只能调用无返回值和无输出参数的方法。4.BatchOneway(批量单向调用):先将调用存在调用缓冲区里面,到达一定限额后自动批量发送所有请求(也可手动刷除缓
10、冲区)。5.BatchDatagram(批量数据报):与上类似。不同的调用模式其实对应着不动的业务,对于大部分的有返回值的或需要实时响应的方法,我们可能都采用Twoway方式调用,对于一些无需返回值或 者不依赖返回值的业务,我们可以用Oneway或者BatchOneway方式,例如消息通知;剩下的Datagram和BatchDatagram方式 一般用在无返回值且不做可靠性检查的业务上,例如日志。3.3 ICE的版本控制(Facet)ICE内部集成非常好的版本控制功能(Facet),在每一个服务单元(Servant)其实都有一个Facet与之并存,如果你没有认为指定,那么这个默认Facet的值
11、就为空 (String.Empty)。在我们业务的实际应用过程中,经常要碰到服务升级的情况,但是升级服务就意味着增大了原有业务调用的稳定性,从而增大了风险,这个Facet就刚好解决我们遇到的这个难题,我们每次升级都是“新增服务”,而非改变原有业务,新来的业务调用新版本服务,原有业务调用原有版本服务。当检测一些很“老”的服务确认无人调用的时候我们就可以关掉了。Facet的实现其实也非常简单,服务端(Adapter)在挂载服务(Servant)的时候就制订了相应版本号。这时候客户端要调用此方法就必须提供正确的版本号(而非默认版本号)。3.4 持久化 (Feeze)一款对Servant服务进行管理和
12、持久化的工具, Adapter可以注册多个Servant在内存中,当 Adapter接收到一个新的请求(request)后便去管理列表里面查找是否存在已有的Servant,如果存在则返回该Servant,如果不存在则实例化一个新的Servant实例。当不停的实现新Servant之后势必会造成内存的激增已经CPU资源的浪费,而且一些很少被调用的Servant 也一直驻存在服务中。为此我们设定服务的Servant的上限,到达该上限后自动将“最少调用”的Servant状态保存在数据库(或文件等持久化设备) 中,然后关闭这些Servant,一旦有新的请求此Servant时再次获取原状态来激活Serva
13、nt3.5 服务装箱管理(ICE Box)从名字就可以看出来,它是一款装箱托管方案,类似于IIS,可以托管多个应用服务,并且每个服务是支持插拔式管理的, 相互之间不受影响,对ICE的应用做了接口设计,每个服务只是实现了 Ice.Services接口就可以了,这样一样让我们可以更专注的关于于我们的业务而非运行的平台。它为我们提供了统一的托管平台,是一个很不错的工具。3.6文件分发(ICEPatch2)ICE最重要的功能就是多节点部署,以达到负载平衡或者容灾的目的,大多数时候每个节点(一般而言是一台服务器)配置的应用程序都是一样的,当每次有更新或者新增应用的时候,便需要手工同步每个节点的文件,这样
14、的手工操作显得十分繁琐而且完全依赖操作人的行为。而ICEPatch2解决了这一难题,只要有一台以为的ICEPatch2服务在运行当中,就可以通过分发的方式同步其他各个节点的文件,也就是说运维人员只需要维护一台机器的应用程序文件就可以了。3.7发布/订阅服务(ICEStorm)未完待续3.8 网络拓扑负载解决方案(ICEGrid) -终极武器ICEGrid实际上是一系列组件的组合,形成了一套强大的文件分发、负载均衡、快捷部署等解决方案。这也是ICE功能中最为强大的一套,至于细节,有待后文慢慢道来。4.ICE关键术语4.1 Ice 对象(Ice Objects)Ice 对象是一种概念性的实体(或称
15、抽象)。Ice 对象具有以下特征:Ice 对象是本地或远地的地址空间中、能响应客户请求的实体。 一个Ice 对象可在单个或多个服务器中实例化(后者是冗余方式)。如果某个对象同时有多个实例,它仍是一个Ice 对象。 每个Ice对象都有一个或多个接口。 一个接口是一个对象所支持的一系列有名称的操作。客户通过调用操作来发出请求。 一个操作有0个或更多参数,以及一个返回值。参数和返回值具有明确的类型。参数是有名称的,并且有方向:in 参数由客户初始化,并传给服务器; out 参数由服务器初始化,并传给客户(返回值只是一种特殊的out 参数)。一个Ice 对象具有一个特殊的接口,称为它的主接口。此外,
16、Ice 对象还可以提供零个或更多其他接口,称为facets(面)。客户可以在某个对象的各个facets 之间进行挑选,选出它们想要使用的接口。 每个Ice 对象都有一个唯一的对象标识(object identity)。对象标识是用于把一个对象与其他所有对象区别开来的标识值。Ice 对象模型假定对象标识是全局唯一的,也就是说,在一个Ice 通信域中,不会有两个对象具有相同的对象标识。4.2代理(Proxies)要想与某个Ice 对象联系,客户必须持有这个对象的代理1。代理是客户的地址空间中的一种制品(artifact);对客户而言,代理就是Ice 对象的代表(该对象可能在远地)。一个代理充当的是
17、一个Ice 对象的本地大使:当客户调用代理上的操作时, Ice run time 会:1. 定位Ice 对象2. 如果Ice 对象的服务器没有运行,就激活它3. 在服务器中激活Ice 对象4. 把所有in 参数传送给Ice 对象5. 等待操作完成6. 把所有out 参数及返回值返回给客户(或在发生错误的情况下抛出异常)代理封装了完成这一系列步骤所必需的全部信息。特别地,代理包含有: 寻址信息:用于让客户端run time 联系正确的服务器 对象标识:用于确定服务器中的哪一个对象是请求的目标 可选的facet 标识符:用于确定代理所引用的是对象的哪一个facet串化代理(Stringified
18、Proxies)代理中的信息可以用串的形式表示。例如:SimplePrinter:default -p 10000这个字符串表示的是一个代理,我们可以阅读这种表示方式。Ice runtime 提供了一些API 调用,允许你把代理转换成它的串化形式,或是进行相反的转换。例如,如果你要把代理存储在数据库表或文本文件中,这种功能会很有用。倘若客户知道某个Ice 对象的标识及其寻址信息,使用这些信息,它可以“凭空”创建代理。换句话说,代理内部的所有信息都被认为是透明的;要与某个对象联系,客户只需要知道这个对象的标识、寻址信息,以及对象的类型(为了能调用操作),就可以了。直接代理(Direct Prox
19、ies)直接代理是这样一种代理:其内部保存有某个对象的标识,以及它的服务器的运行地址。该地址由以下两项内容完全确定: 协议标识符(比如TCP/IP 或UDP) 针对具体协议的地址(比如主机名和端口号)为了联系直接代理所代表的对象, Ice run time 使用代理内部的寻址信息来联系服务器;每当客户向服务器发出请求时,也会把对象的标识发送过去。间接代理(Indirect Proxies)间接代理是这样一种代理:其内部保存有某个对象的标识,以及对象适配器名(object adapter name)。要注意,间接代理没有包含寻址信息。为了正确地定位服务器,客户端run time 会使用代理内部的
20、对象适配器名,将其传给某个定位器服务Locator,比如ICEGrid服务。然后,定位器会把适配器名当作关键字,在含有服务器地址的表中进行查找,把当前的服务器地址返回给客户。客户端run time 现在知道了怎样联系服务器,就会像平常一样分派(dispatch)客户请求。这整个过程与Domain Name Service (DNS)所进行的映射类似, DNS会把Internet 域名映射到IP 地址:当我们使用域名(比如)来查找某个网页时,主机名首先在幕后被解析成IP 地址,一旦得到了正确的IP 地址,这个地址就会用于连接服务器。在Ice 中,对象适配器名会映射到协议地址对(protocol-
21、address pair),但其他方面则非常类似。客户端run time 会通过配置了解怎样去和IceGrid 服务联系(就像web 浏览器会通过配置了解要使用哪一个DNS)。直接绑定 vs. 间接绑定(Direct Versus Indirect Binding)把代理里面的信息解析为协议地址对的过程称为绑定。不奇怪,直接绑定用于直接代理,而间接绑定用于间接代理.间接绑定的主要好处是,它允许我们移动服务器(也就是说,改变它们的地址),同时又不会使客户所持有的已有代理失效。换句话说,使用直接代理,你不用为了定位服务器而进行额外的查找,但如果服务器被移到其他机器上,它就不再能工作。而另一方面,即
22、使我们移动(或迁移,migrate)服务器,间接代理也能够继续工作.4.3 Servants Ice 对象是一种具有类型、标识,以及寻址信息的概念性实体。但客户请求最终必须到达具体的服务器端的处理实体,由这样的实体提供操作调用(operation invocation)的行为。换句话说,客户请求最后必须到达服务器,在其内部执行代码,而这些代码用特定的编程语言编写,并在特定的处理器上执行。 在服务器端提供操作调用的行为的制品叫servant。一个servant 提供一个或多个Ice 对象的实质内容(或体现这些对象)。实际上, servant 就是服务器开发者编写的类的实例,这些类作为一个或多个I
23、ce 对象的servant、向服务器端run time 进行注册。类的方法对应于Ice 对象的接口上的操作,并且提供这些操作的行为。 一个servant 可以只体现一个Ice 对象,也可以同时体现若干Ice 对象。 如果是前一种情况, servant 所体现的Ice 对象的标识在这个servant 中是隐含的。如果是后一种情况,在每次收到请求时, servant 也会收到Ice 对象的标识,这样, servant 可以决定在处理该请求期间,体现哪一个对象。反过来,一个Ice 对象也可以拥有多个servant。例如,我们可以为某个Ice 对象创建一个代理,这个对象有两个不同的地址,分别在两台机器
24、上。在这种情况下,我们将拥有两个服务器,每个服务器都有一个servant,但两个servant 体现的是同一个Ice 对象。当客户调用这样的Ice 对象上的操作时,客户端run time 只把请求发给一个服务器。换句话说,使用体现同一个Ice 对象的多个servant,你可以构建冗余的系统:客户端run time 试着把请求发给一个服务器,如果失败,就把请求发给第二个服务器。只有在第二次尝试也失败的情况下,错误才会报告给客户端应用代码。4.4.Ice Run Time 概述 按照个人暂时的理解,Ice run Time具体是指Ice封装好了大部分的API,通过这些API实现分布式应用程序运行时
25、的各种功能。 首先,其中一个重要的部分是通信器,它是Ice run time的主句柄,也是Ice run time的主进入点。另外Ice一个重要的机制是servant定位器,用于控制性能和内存消耗之间的平衡。其他一些同样不可缺少的组成部分接下来将会进行介绍。通信器 Ice run time的主进入点由本地接口Ice:Communicator表示。Ice:Communicator 的一个实例与一些运行时资源是关联在一起的:1) 客户端线程池:确保客户端至少有一个线程可用于接受对未完成请求的答复处理。同时它可用于异步方法调用(AMI)。2) 服务端线程池:负责接收到来的连接,并处理来自客户的请求。
26、可用于异步分派(AMD)。3) 配置属性:配置Icerun time的各方面属性。每个通信器有各自的属性集。4) 对象工厂:实例化从已知基类继承而来的servant类。5) 一个日志记录器对象:确定日志消息的处理方式。实现了Ice:Logger接口。6) 一个统计对象:打印一些通信流量消息等。实现了Ice:Stats接口。7) 一个缺省路由器:实现了Ice:Router接口。Glacier使用它实现了Ice的防火墙功能。8) 一个缺省定位器:用于把对象标识解析为代理的对象。IcePack用于构建定位服务。9) 一个插件管理器:用于给通信器增加特性的对象。ICESSL被实现为插件。10)对象适配
27、器:负责分配到来的请求,并把请求分配给相应的servant处理。下一小节将会具体介绍。通信器的接口是用Slice 定义的。下面是其部分接口:module Ice local interface Communicator string proxyToString(Object* obj);Object* stringToProxy(string str);ObjectAdapter createObjectAdapter(string name);ObjectAdapter createObjectAdapterWithEndpoints(string name,string endpoints
28、);void shutdown();void waitForShutdown();void destroy();/ .;/ .;通信器提供了一些操作:1)proxyToString , stringToProxy:这两个操作将代理串化,或者相反。2)createObjectAdapter ,createObjectAdapterWithEndpoints:创建新的对象适配器。3)shutdown:关闭服务端的Icerun time4)waitForShutdown:挂起发出调用的线程,直到通信器关闭为止。5)destroy:销毁通信器及相关资源,例如线程,通信端点以及内存资源。4.5对象适配器
29、 一个通信器含有一个或者多个对象适配器。对象适配器处在Ice run time和服务器之间的界线上,负责;1)把ice对象映射到到来请求的servant,并把请求分配给相应servant对象来处理。2)协助进行生命周期操作,避免出现Ice对象和servan的建立与销毁时出现冲突。3)提供一个或者多个传输端点。每个适配器有一个或多个servant。每个对象适配器都有一个或更多servant,对Ice 对象进行体现;同时还有一个或更多传输端点。如果对象适配器拥有的传输端点不止一个,所有向该适配器作了注册的servant 可以在任何一个端点上响应到来的请求。换句话说,如果对象适配器有多个传输端点,这
30、些端点代表的是通往同一组对象的不同通信路径。每个对象适配器都只属于一个通信器(但一个通信器可以有多个对象适配器)。活动Servant映射表每个对象适配器都维护有一个叫做活动servant映射表(ASM: Active Servant Map)。活动表的作用可以用一下这图表示:因此它的功能可以描述为:把请求绑定到相应的正确的servant。图中示例用了直接代理,它将传输端点嵌在了代理中。这个表的数据结构有点像路由表,网络的路由表就是这种结构每个对象适配器都维护有一个叫作活动servant 映射表,就是asm用于把对象标识映射到servant,当客户把操作调用发给服务器时,请求的目标是特定的传输端点。传输端点隐含地标识了请求所针对的对象适配器(因为同一个端点只能绑定到一个对象适配器)。客户藉以发送请求的代理含有对应的对象的标识,客户端run time 会在线路上随调用一起发送这个对象标识。对象适配器继而使用这个对象标识、在它的ASM 中查找正确的servant,把调用分派给它。5.Slice语言介绍学习ICE,我们要从ICE的“语言”学起,简称SLICE(Simple Language Of ICE)。SLICE有自己独立的语法体系和结构,我们必须熟悉和遵守这些语法体系才能到达我们想要的效果。按照官方的说明文档,结合自己的使用,我们可以以下几块来讲解:语法
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1