ZeroC Ice简介

  • ZeroC Ice简介已关闭评论
  • 25 views
  • A+
所属分类:ZeroC-Ice

ZeroC ICE 是指ZeroC公司的ICE(Internet Communications Engine)中间件平台.是由前CORBA专家Marc Laukien等人员开发的新一代面向对象的分布式系统中间件。

目前Ice平台支持的语言有C++、NET、java、Python、Objective-C、Ruby、PHP、JavaScript等,而且支持多语言之间通过RPC通信。这点淘宝的dubbo做不到

对于运行平台来说,主要的平台都支持,包括X86系统、ARM、pc平台支持windows和主流的Linux,移动设备目前支持Windows Mobile、Android及IOS。

特性方面,支持传统的RPC调用、支持异步调用、One-Way调用、支持批量发起请求,支持TCP通信、支持UDP通信。满足业务场景比较丰富

Ice概念:

官方给了如下术语:

客户端和服务端、ice对象、代理、字符串化代理、直接代理、间接代理、直接绑定与间接绑定、固定的代理、路由代理、复制、复制组、仆人、至多一次语义、同步方法调用、异步方法调用、异步方法调度、单向方法调用、成批的单向方法调用、数据报调用、成批的数据报调用、运行时异常、用户异常

Clients and Servers

客户端跟服务端并不是特定的,而是表示扮演的角色,这句话听起来挺抽象的,但是仔细想一下,却是有些道理

• 客户端是活动实体,通常它们会发出对服务端请求

• 服务端是被动实体。它们响应客户端请求,并为其提供服务

 Ice Objects

Ice 对象是一种概念性的实体(或称抽象)。Ice 对象具有以下特征:
• Ice 对象是本地或远地的地址空间中、能响应客户请求的实体。
• 一个Ice 对象可在单个或多个服务器中实例化(后者是冗余方式)。如果某个对象同时有多个实例,它仍是一个Ice 对象。
• 每个Ice对象都有一个或多个接口。 一个接口是一个对象所支持的一系列有名称的操作。客户通过调用操作来发出请求。
• 一个操作有零个或更多参数,以及一个返回值。参数和返回值具有明确的类型。参数是有名称的,并且有方向:in 参数由客户初始化,并传给服务器; out 参数由 服务器初始化,并传给客户(返回值只是一种特殊的out 参数)。
• 一个Ice 对象具有一个特殊的接口,称为它的主接口。此外, Ice 对象还可以提供零个或更多其他接口,称为facets (面)。客户可以在某个对象的各个facets之间进行挑选,选出它们想要使用的接口。
• 每个Ice 对象都有一个唯一的对象标识(object identity)。对象标识是用于把一个对象与其他所有对象区别开来的标识值。Ice 对象模型假定对象标识是全局唯一的,也就是说,在一个Ice 通信域中,不会有两个对象具有相同的对象标识。

Endpoint

表明服务端所使用的协议、地址、端口等,例如default -h 10.78.100.100 -p 10000 -t 1000,表示协议为default,default的值可通过Ice.Default.Protocol设置,默认为tcp,协议还可以为tcp、udp、ssl;-h 10.78.100.100表示地址;-p 10000表示端口;-t 1000表示超时时间为1秒。多个endpoint用“:”分隔。完整语法见E.2 p1963。

Object Adapter

一个Adapter包含一个或多个endpoint,每个endpoint可使用不同的协议、地址、端口;一个Adapter包含一个或多个Ice Object的具体化servant。客户端可以通过这些endpoint访问这些servant,Adapter负责将客户请求分派到servant中的应用代码以及协助servant的生命周期管理。

Servant

Servant是Ice Object在服务端的具体化,使用具体语言(如C++)实现Interface,然后new一个对象,这样一个Servant就创建了,但是要使Servant成为Ice Object的具体化,这还不够,还需要将Servant加入adapter,并为其具体化的Ice Object起一个标识名,最后激活adapter,这时Ice Object才存在了。一个Servant可以一次具体化一个或多个Ice Object,例如new一个Servant后,可以以不同的名字加入同一个或不同adapter,这时一个Servant就是同时具体化多个Ice Object,客户端在请求过程中可以决定具体化哪一个Ice Object。相反的,一个Ice Object可以有多个Servant,例如在不同地址空间或不同机器上创建不同Servant具体化同一个Ice Object,这样就构成一个冗余系统,提高系统可靠性。

Proxy

和Servant相对,Proxy是Ice Object在客户端的具体化。Proxy扮演着Ice Object的本地代表,客户端要和Ice Object联系,必须持有一个Ice Object的Proxy。当客户端调用Proxy的一个Operation时,Ice运行时会:定位Ice Object;激活Ice Object所在的Server如果它没有运行;激活Ice Object;传输任何输入参数到Ice Object;等待Operation完成;返回任何输出参数和返回值给客户端(或抛出异常)。

Stringified Proxy

Proxy中的信息可以表达为一个字符串,例如:SimplePrinter:default -p 10000,其中SimplePrinter为对象标识;default –p 10000为endpoint,表示使用默认tcp协议,端口10000(完整语法见E.1 p1961)。Ice运行时提供API在Proxy和字符串表达之间进行转换。字符串化的好处是可以将Proxy存储在数据库或文本文件。

Direct Proxy

 

间接Proxy不包含endpoint,有两种形式:一种只有对象标识,一种包含对象标识和object adapter标识。类似DNS,要确定正确的server,客户端需要将Proxy传给location service(32.17),后者查找合适的server地址并返回给客户端。

Stringified Proxy

Proxy中的信息可以表达为一个字符串,例如:SimplePrinter:default -p 10000,其中SimplePrinter为对象标识;default –p 10000为endpoint,表示使用默认tcp协议,端口10000(完整语法见E.1 p1961)。Ice运行时提供API在Proxy和字符串表达之间进行转换。字符串化的好处是可以将Proxy存储在数据库或文本文件。

Indirect Proxy

间接Proxy不包含endpoint,有两种形式:一种只有对象标识,一种包含对象标识和object adapter标识。类似DNS,要确定正确的server,客户端需要将Proxy传给location service(32.17),后者查找合适的server地址并返回给客户端。

Direct Vs. Indirect Binding

将Proxy解析为协议-地址对的过程称为绑定,direct binding用于direct proxy,indirect binding用于indirect proxy。Indirect binding的主要好处是允许我们移动服务器而不会使客户端持有的Proxy变为无效。

Fixed Proxy

Fixed Proxy和特定连接关联,包含一个连接句柄,一旦连接关闭,Proxy不再工作。Fixed Proxy不能整编,也就是不能作为参数传递给方法调用。Fixed Proxy用于实现双向连接,允许服务端回掉客户端而不开启新的连接

Routed Proxy

Routed Proxy将所有请求转发到特定目标对象。它用于实现类似于Glacier2这样的服务,允许客户端和位于防火墙后的服务通信

Replication

在Ice中,Replication包括使object adapter在多个地址上可用。Replication的目标通常是通过在多台计算机上运行同一个服务来提供冗余性。如果一台计算机失效了,其他还可用。

要使用replication意味着应用程序必须为此而专门设计。这表示,当客户端能通过一个地址访问一个对象时,从其他地址也能获得相同结果。

Ice支持一种有限形式的replication,通过在Proxy中指定多个地址,Ice运行时初始连接时随机选择一个地址,如果失败则会尝试其他地址,例如:SimplePrinter:tcp -h server1 –p 10001:tcp -h server2 -p 10002

Replica Groups

除了基于Proxy的Replication,Ice还支持一种称为Replica Groups的更有用的Replication形式,这种形式需要使用location service。 Replica Groups有一个唯一的标识,一旦一个Replica Groups建立后,可以通过indirect proxy的第二种形式(adapter标识替换为Replica Groups标识)进行访问。Replica Groups的好处是引入间接性,通过作为中间人的location service添加更多智能绑定过程。

At-Most-Once Semantics

Ice保证At-Most-Once Semantics语义,即请求要么发送出去,如果不能发送,会以合适的异常通知客户端。任何情况都不会出现请求被发送两次,重试的尝试只会出现在确切的知道发送失败时(UDP例外)。虽然无At-Most-Once Semantics可构建更健壮的分布式应用程序,但现实情况是存在有副作用的方法,这些方法不能武断执行多次。如果方法无副作用,在Slice中可定义为idempotent,这样Ice就能做更多有益的错误恢复。

Synchronous Method Invocation

默认情况下,Ice使用的请求分派模型是同步远程过程调用,在调用过程中,客户线程会被阻塞,直到调用完成。

Asynchronous Method Invocation(AMI)

Ice也支持异步方法调用:和同步调用不同的是,客户端传入额外的回调对象,调用立即返回,当操作完成时,客户端运行时会调用回调对象以便返回操作结果。服务端是无法区分客户端是采用同步还是异步调用的。

Asynchronous Method Dispatch(AMD)

AMD是AMI在服务端的等价物。服务端默认情况下使用同步分派,分派线程同时负责应用代码的执行,一个操作执行完后,此线程才能处理其他请求。使用AMD,服务端可以控制分派的过程,当有请求到达时,服务端会收到通知,应用代码可以选择将请求放入用户队列然后释放分派线程,然后由用户线程对请求进行处理,并通过回调对象将结果返回给客户端。同样,客户端也无法区分服务端是同步分派还是异步分派。

Oneway Method Invocation

对于oneway invocation,客户端运行时将调用交给本地传输机制,一旦本机传输机制缓冲了请求,客户请求就完成了,实际请求随后由操作系统异步发送。服务端不会回应oneway invocation,也就是只有从客户端到服务端的数据流,相反方向则没有。Oneway invocation是不可靠的,但可以获得更高的效率。Oneway invocation只可用于没有返回值,没有输出参数,不会抛出用户异常的方法。对服务端而言,无法区分客户调用是oneway还是twoway的。Oneway只有在目标对象提供面向流的传输机制,例如TCP/IP或SSL时才可用。尽管如此,Oneway invocation无法保证到达服务端的顺序和调用顺序一致,这取决于线程调度。

Batched Oneway Mehtod Invocation

Batched oneway invocation允许你以一条单一消息发送一系列oneway请求,从而提高效率,也能保证请求的顺序。

Datagram Invocation

和Oneway invocation类似,不同的是:要求目标对象提供UDP传输机制;个别调用可能简单的丢失,例如依次进行3次调用,中间的调用可能丢失,但在oneway invocation中是不会发生的;个别调用可能无序到达,和oneway的失序不同,oneway是由于多线程引起,而datagram即使在单线程情况也会失序。

Batched Datagram Invocation

和Batched Oneway Invocation类似,需要注意的是批量消息的总大小不要超过PDU限制。

 Run-Time Execptions

Ice运行时预定义的异常。

User Exceptions

用户自定义异常。

属性

大多数Ice运行时行为可通过属性进行配置。属性以名-值对的形式出现,例如Ice.Default.Protocol=tcp。

 

 

 

 

  • 我的微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar