为什么zeroc ice dubbo没有火起来

6477人阅读
Ice 中间件(13)
看完了 Distributed Programming with Ice,阅读量相当大,只好粗看一遍,有好几种语言实现的地方只看C++,即使这样也有了3个月的时间,才看完,并练习了Ice部分的Demo。
Ice是优秀的通讯中间件,是用于建立高性能、高伸缩性通讯基础设施的平台框架。让我感到疑惑的是:现在企业信息化管理的基础和核心是大型关系数据库系统,如DB2,Oralce,SQL Server,甚至还有MySQL。缺乏这些数据库系统的访问手段,Ice能够成为一个广泛适用的中间件吗?我认为不能,Ice不能独立完成中间件的功能,它只能是中间件系统的一个组成部分,它不可能成为Spring+Hibernate那样的中间件组合。
Ice的重点是通讯,在数据持久化方面使用Berkeley DB,访问数据库方面做得太少了。如果访问关系数据库,需要开发员自己实现数据库访问层。因此它适用于持久化数据不复杂,关系比较少,而对通讯有很高要求的场合。所谓电信级中间件,也是指通讯来讲的。就数据库访问层来说,Ice几乎没有提供什么帮助。要在Ice中实现数据持久层开发必然要考虑到数据库适应性,SQL解析,缓存,各种锁以及多服务器间的同步等许多让人头疼的问题,相当于开发一个定制的Hibernate。
Ice的另一个重点是多语言编写的程序对象间的相互通讯,尤其是目前C/C++语言与Java系统按对象方式通讯的手段缺乏,Ice正好满足了这种需求。
IceGrid部分介绍了,网格由节点构成,节点向注册服务器注册适配器,才能被客户端访问。客户端通过注册服务器获得访问节点的地址,然后直接与节点交互。为防止注册服务器单点故障,将它设计成主从模式。主服务器down后,从服务器可以继续提供访问服务,只是不能加入新注册;从服务器必须重启才能成为主服务器。
多个节点可以组成一个复制组,进行适配器复制,实现负载均衡,文章讨论了负载均衡的各种方法:顺序,适应,轮循等&&但是没有讨论session复制问题,也就是如果服务器是有状态的情况下,如何实现多个服务器的状态同步&&session复制?文章没有明确说明。session复制是多服务器同步必须考虑的问题,不知道IceGrid是如何实现的。
我认为Ice不能做为完整的中间件,刚接触Ice时,中文网上充满了对Ice的赞美,没有对Ice的缺点和适用范围的介绍。英文网只有官方网站介绍的比较详细,也是充斥着Ice性能如何如何,比CORBA怎么怎么好。没有对Ice使用范围的中肯建议或评价。因此学习Ice完全是在认为它能够解决我对中间件的一般需求的情况下完成的。现在我感觉它实现不了所有中间件的目标,或者说要以它实现目标,需要花费的代价高过用其它系统实现目标的代价。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:124940次
积分:1748
积分:1748
排名:第14344名
原创:43篇
转载:12篇
评论:32条
(1)(1)(1)(1)(4)(2)(1)(4)(2)(31)(1)(1)(1)(1)(1)(2)(1)为什么ZeroC ICE没有火起来?
按投票排序
因为太庞大,企业级的服务框架,太重
zeroC ICE 太笨重,重量级的,不适合大部分企业开发
已有帐号?
社交帐号登录
无法登录?
社交帐号登录1321人阅读
程序相关(111)
最近学习Icestorm的replicated例子,在本地计算机上面跑通了,但在两台机器上(一台服务器192.168.0.113,一台客户端192.168.0.188),怎么都跑不通。上网求助,大家给的建议是回去好好研究一下简单例子,再试验。
&&&&&& 没办法,因为replicate的例子涉及到了sub,pub和icegrid的配置。所以,只好从最基本的Icegrid配置开始玩。在这里写下日志,算是备忘。
&&&&&&& 第一步:通过阅读readme知道,这个例子只需要client端即可。于是,先用vs2010打开IceGrid文件夹下,simple例子中的IceGrid.simple.client(13kb),编译,连接,运行,生成client.exe文件。
&&&&&&& 第二步:在服务器上设置配置文件,具体文件改动的配置如下:
&&&&&&& -----------------------------Config.client-----------------------------------
&&&&&& # The IceGrid locator proxy.
&&&&&& Ice.Default.Locator=DemoIceGrid/Locator:default -h 192.168.0.113 -p 4061
&&&&&& -------------------------------Config.grid---------------------------------------
&&&&&&& # The IceGrid instance name.
&&&&&&&&IceGrid.InstanceName=DemoIceGrid
&&&&&&& # The IceGrid locator proxy.
&&&&&&& Ice.Default.Locator=DemoIceGrid/Locator:default -h 192.168.0.113 -p 4061
&&&&&&&& #
&&&&&&&& # IceGrid registry configuration.
&&&&&&&& #
&&&&&&&&&IceGrid.Registry.Client.Endpoints=default -p 4061
&&&&&&&& IceGrid.Registry.Server.Endpoints=default
&&&&&&&&&IceGrid.Registry.Internal.Endpoints=default
&&&&&&&& 第三步:设置批处理命令
&&&&&&&& 为了避免每次都要打开cmd窗口运行输入命令,我打开记事本,将icegridnode --Ice.Config=config.grid保存为Icegridstar.bat(批处理文件)
&&&&&&&& 同样,将icegridadmin --Ice.Config=config.grid -e&&&application add 'application.xml'&保存为Icegridadminstar.bat(注意:Ice3.4.2版本中的demo里,当用记事本打开readme时,多了一个&\&,在命令运行时要将其去掉,否则会报错)。如下图所示:
&&&&&&&& 第四步:先运行,Icegridstar.bat,再运行Icegridadminstar.bat。
&&&&&&&& 第五步:将这个demo拷贝到客户端。在运行client.exe之前,先保证客户端和服务端在同一网段,并且能够ping通,然后在客户端运行client.exe就好了。
&&&&&&& 效果如下:
&&&&&&& 运行客户端,会出现提示,输入t,并且回车,就会在Icegrid的窗口看到这样的结果,如果连续输入,就会连续输出
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:414394次
积分:4657
积分:4657
排名:第3604名
原创:96篇
转载:79篇
评论:82条
(1)(5)(2)(1)(1)(4)(8)(3)(3)(3)(5)(5)(2)(4)(1)(1)(1)(2)(4)(2)(1)(2)(1)(4)(2)(2)(2)(2)(2)(1)(2)(2)(1)(2)(1)(1)(3)(2)(3)(14)(14)(2)(1)(1)(2)(3)(2)(1)(3)(2)(1)(4)(1)(7)(1)(3)(7)(6)(2)(3)(7)(1)(1)(2)(2)ZEROC Ice 初步认识 -
- ITeye技术网站
博客分类:
1、ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够以最小的代价构建分布式应用程序。ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数等。 2、为什么会有ICE? ICE是分布式应用的一种比较好的解决方案,虽然现在也有一些比较流行的分布式应用解决方案,如微软的.NET(以及原来的DCOM)、CORBA及WEB SERVICE等,但是这些面向对象的中间件都存在一些不足: .NET是微软产品,只面向WINDOWS系统,而实际的情况是在当前的网络环境下,不同的计算机会运行不同的系统,如LINUX上面就不可能使用.NET; CORBA虽然在统一标准方面做了很多的工作,但是不同的供应商实现之间还是缺乏互操作性,并且目前还没有一家供应商可以针对所有的异种环境提供所有的实现支持,且CORBA的实现比较复杂,学习及实施的成本都会比较高; WEB SERVICE最要命的缺点就是他的性能问题,对于要求比较高的行业是很少会考虑WEB SERVICE的。 ICE的产生就是源于.NET、CORBA及WEB SERVICE这些中间件的不足,它可以支持不同的系统,如WINDOWS、LINUX等,也可以支持在多种开发语言上使用,如C++、C、JAVA、RUBY、PYTHON、VB等,服务端可以是上面提到的任何一种语言实现的,客户端也可以根据自己的实际情况选择不同的语言实现,如服务端采用C语言实现,而客户端采用JAVA语言实现,底层的通讯逻辑通过ICE的封装实现,我们只需要关注业务逻辑。 3、ICE是如何工作的? Ice 是一种面向对象的中间件平台,这意味着 Ice为构建面向对象的客户-服务器应用提供了工具、API 和库支持。要与Ice持有的对象进行通信,客户端必须持有这个对象的代理(与CORBA的引用是相同的意思),这里的代理指的是这个对象的实例,ICE在运行时会定位到这个对象,然后寻找或激活它,再把In参数传给远程对象,再通过Out参数获取返回结果。 这里提到的代理又分为直接代理和间接代理,直接代理其内部保存有某个对象的标识,以及它的服务器的运行地址;间接代理指的是其内部保存有某个对象的标识,以及对象适配器名(object adapter name),间接代理没有包含寻址信息,为了正确地定位服务器,客户端在运行时会使用代理内部的对象适配器名,将其传给某个定位器服务,比如IcePack服务,然后,定位器会把适配器名当作关键字,在含有服务器地址的表中进行查找,把当前的服务器地址返回给客户,客户端 run time现在知道了怎样联系服务器,就会像平常一样分派 (dispatch)客户请求。ICE可以保证在任何的网络环境或者操作系统下,成功的调用只有一次,它在运行时会尽力的定位到远程服务器,在连接失败的情况下会做尝试性重复性连接,确实连不上的情况会给用户以提示。 客户端在调用服务端的方法时,可以采取同步或异步的方式实现,同步调用就相当于调用自己本地的方法一样,其它行为会被阻塞;异步调用是非常有用的调用方式,如服务端需要准备的数据来自于其它异步接口,这个时候客户端就不需要等待,待服务端数据准备充份后,以消息的方式通知客户端,服务端就可以去干其它的事情了,而客户端也可以到服务端获取数据了。 4、ICE调用模式 ICE采用的网络协议有TCP、UDP以及SSL三 种,不同于WebService,ICE在调用模式上有好几种选择方案,并且每种方案正对不同的网络协议的特性做了相应的选择。 Oneway(单向调用):客户端只需将调用注册到本地传输缓冲区(Local Transport Buffers)后就立即返回,不会等待调用结果的返回,不对调用结果负责。 Twoway(双向调用):最通用的模式,同步方法调用模式,只能用TCP或SSL协议。 Datagram(数据报):类似于Oneway调用,不同的是 Datagram调用只能采用UDP协议而且只能调用无返回值和无输出参数的方法。 BatchOneway(批量单向调用):先将调用存 在调用缓冲区里面,到达一定限额后自动批量发送所有请求(也可手动刷除缓冲区)。 BatchDatagram(批量数据报):与上类似。 不同的调用模式其实对应着不动的业务,对于大部分的有返回值的或需要实时响应的方法,我们可能都采用Twoway方式调用,对于一些无需返回值或 者不依赖返回值的业务,我们可以用Oneway或者BatchOneway方式,例如消息通知;剩下的Datagram和BatchDatagram方式 一般用在无返回值且不做可靠性检查的业务上,例如日志。 5、客户端与服务端的结构
这个图示显示了使用ICE做为中间件平台,客户端及服务端的应用都是由应用代码及ICE的库代码混合组成的。 客户应用及服务器应用分别对应用的是客户端与服务端。 代理是根据SLICE定义的ice文件实现,它提供了一个向下调用的接口,提供了数据的序列化与反序化。 ICE的核心部份,提供了客户端与服务端的网络连接等核心通信功能,以及其它的网络通信功能的实现及可能的问题的处理,让我们在编写应用代码的时候不必要去关注这一块,而专注于应用功能的实现。 6. 要使用ICE,必须先安装ICE,安装及配置参考如下: WINDOWS:http://blog.csdn.net/fenglibing/archive//6368665.aspx LINUX(BDB的安装还有问题,无法使用SLICE2JAVA):http://blog.csdn.net/fenglibing/archive//6367559.aspx 这个示例是JAVA示例,是从ICE的帮助文档中摘出来的,是一个输出Hello World的测试程序,采用的ICE版本是3.1.1。1)、准备一个ice文件并命名为:Printer.ice,其内容为:
module Demo {
interface Printer {
void printString(string s);
2)、转到命令行,在Printer.ice文件保存目录执行命令:
slice2java Printer.ice 会在目录下面生成一个Demo 文件夹,里面会生成一些JAVA文件,如下图示:
3)、这些文件的类图结构如下:
这里对生成的一些文件做些解释,分两两部份,服务端类文件及客户端类文件: o &interface-name&.java 这个源文件声明在ICE文件中定的接口名称的Java接口,如这里是Printer。 o _&interface-name&Operations.java _&interface-name&OperationsNC.java 这是两个定义操作的接口文件,每个接口文件中定义了一个操作实现,定义的操作与Slice接口中定义的操作相一致,只是在_&interface-name&Operations.java中定义的方法多了一个参数“Ice.Current __current”(注:Current对象的定义,请参见3.1.1版本文档中的31.6 The Ice::Current Object说明),这个参数的作用是可以允许我们访问 “正在执行的请求”和 “服务器中的操作的实现”等信息,也就是我们的请求需求需要其它请求的支持时或者要获取其它请求的执行结果时,我们可以调用这个方法,这两个接口文件都会被接口文件_&interface-name&.java继承。 o
_&interface-name&Disp.java 这个文件包含的是服务器端骨架类的定义,所用接口定义都要继承这个东西,这里的接口指供客户端调用的接口。 o &interface-name&PrxHolder.java 代理定义holder 类,是对应Out参数使用的。一般参数都是值传递,这个类的作用是使参数通过引用传递。ICE框架应用了很多反射机制,这个类是改变远程参数的一个映射。
o _&interface-name&Del.java
o _&interface-name&DelD.java
o _&interface-name&DelM.java 不用关心上面的这些文件,这些文件包含的是供Java 映射内部使用的代码;它们包含的功能与应用程序无关。 o &interface-name&Prx.java 这个是代理接口。例如PrinterPrx,在客户的地址空间中, PrinterPrx 的实例是“远地的服务器中的Printer接口的实例”的“本地大使”。与服务器端对象有关的所有细节,比如其地址、所用协议、对象标识,都封装在该实例中。 注意, PrinterPrx 继承自Ice.ObjectPrx。这反映了这样一个事实:所有的Ice 接口都隐式地继承自Ice::Object。 说的更明白些,就是这个类的方法调用都是远程服务端的调用,执行printString()方法的具体实现是在远程服务端执行的。 o &interface-name&PrxHelper.java 这个是接口的代理定义助手类,就是帮你获得代理类的。经常用的就两个方法checkedCast 和 uncheckedCast 。这两个方法实现的都是向下转换。 注意, checkedCast 会联系服务器。这是必要的,因为只有服务器情况中的代理实现确切地知道某个对象的类型。所以, checkedCast 可能会抛出ConnectTimeoutException 或ObjectNotExistException(这也解释了为何需要助手类:ICE在运行时必须联系服务器,所以我们不能使用Java 的向下转换)。 与此相反, uncheckedCast 不会联系服务器,而是会无条件地返回具有所请求的类型的代理 。但是,如果你要使用uncheckedCast,你必须确定这个代理真的支持你想要转换到的类型;而如果你弄错了,你很可能会在调用代理上的操作时,引发运行时异常。对于这样的类型失配,最后可能会引发OperationNotExistException,但也有可能引发其他异常,比如整编异常。而且,如果对象碰巧有一个同名的操作,但参数类型不同,则有可能根本不产生异常,你最后就会把调用发送给类型错误的对象;这个对象可能会做出非常糟糕的事情。 4)、建立一个ECLIPSE工程,将生成的文件拷贝到src目录下,并在classpath中导入Ice.jar。 5) 、建立三个测试JAVA文件,Server.java、PrinterI.java及Client.java: PrinterI.java是对服务端实现骨架类_PrinterDisp的实现,返回时将PrinterI.java对象返回给客户端,这里实现的功能是直接输出传入的String参数:
public class PrinterI extends Demo._PrinterDisp {
public void printString(String s, Ice.Current current) {
System.out.println(s);
Server.java是服务端服务代理,用于接收客户端的请求操作:
public class Server {
public static void main(String[] args) {
int status = 0;
municator ic =
//初使化连接,args可以传一些初使化参数,如连接超时时间,初使化客户连接池的数量等
ic = Ice.Util.initialize(args);
//创建名为SimplePrinterAdapter的适配器,并要求适配器使用缺省的协议(TCP/IP侦听端口为10000的请求)
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
//实例化一个PrinterI对象,为Printer接口创建一个服务对象
Ice.Object object = new PrinterI();
//将服务单元增加到适配器中,并给服务对象指定名称为SimplePrinter,该名称用于唯一确定一个服务单元
adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter"));
//激活适配器,这样做的好处是可以等到所有资源就位后再触发
adapter.activate();
//让服务在退出之前,一直持续对请求的监听
ic.waitForShutdown();
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
if (ic != null) {
// Clean up
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
System.exit(status);
Client.java是客户端代码,用于向服务端发起请求,并操作返回的代理对象:
public class Client {
public static void main(String[] args) {
int status = 0;
municator ic =
ic = Ice.Util.initialize(args);
//传入远程服务单元的名称、网络协议、IP及端口,获取Printer的远程代理,这里使用的stringToProxy方式
Ice.ObjectPrx base = ic.stringToProxy("SimplePrinter:default -p 10000");
//通过checkedCast向下转换,获取Printer接口的远程,并同时检测根据传入的名称获取的服务单元是否Printer的代理接口,如果不是则返回null对象
Demo.PrinterPrx printer = Demo.PrinterPrxHelper.checkedCast(base);
if (printer == null) throw new Error("Invalid proxy");
//把Hello World传给服务端,让服务端打印出来,因为这个方法最终会在服务端上执行
printer.printString("Hello World!");
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
if (ic != null) {
// Clean up
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
System.exit(status);
6)、运行客户端和服务端 运行服务端:java Server 运行客户端:java Client 看看效果吧。 7、ICE的性能和效率 ICE的性能是比较好的,因为他本身的传输机制都是基于二进制,网上有人曾经做过性能测试,评价比较好,我本人还没有做性能测试,目前的判断只是基于网络数据,请先看下面的文章: 高性能计算-ICE 性能测试 ICE与CORBA比较的优势 8、ICE的优点 支持同步和异步的消息传递; 支持多个接口; 机器无关性,客户及服务器与底层的机器架构屏蔽开来。对于应用代码而言,像字节序和填充这样的问题都隐藏了起来; 语言无关性,客户和服务器可以分别部署,所用语言也可以不同; 实现无关性,客户不知道服务器是怎样实现其对象的。这意味着,在客户部署之后,服务器的实现可以改变; 操作系统无关性,Ice API 完全是可移植的,所以同样的源码能够在 Windows和 UNIX 上编译和运行; 线程支持,Ice run time 完全是线程化的,其 API 是线程安全的,作为应用开发者,(除了在访问共享数据时进行同步)无需为开发线程化的高性能客户和服务器付出额外努力。 传输机制无关性,Ice 目前采用了TCP/IP 和 UDP作为传输协议。客户和服务器代码都不需要了解底层的传输机制; 位置和服务器透明性,Ice run time 会负责定位对象,并管理底层的传输机制,比如打开和关闭连接; 安全性,通过 SSL强加密,可以使客户和服务器完全安全地进行通信,这样,应用可以使用不安全的网络安全地进行通信,你可以使用 Glacier穿过防火墙,实现安全的请求转发,并且完全支持回调; 内建的持久机制,使用 Freeze,创建持久的对象实现变成了一件很容易的事情,Ice提供了对高性能数据库 Berkeley DB[18] 的内建支持; 开放源码。 后记 这里只是简单的对ICE进行介绍,还有很多东西没有提到,如ICE的语法规则、ICE的版本控制(Facet)、持久化 (Feeze)、服务装箱管理 (ICEBox)、文件分发(ICEPatch2)、发布/订阅 服务(ICEStorm)、网络拓扑负载解决方案--终极武器(ICEGrid)、提供使用安全传输入协议SSL的插件(IceSSL)、轻量级的ICE应用防火墙其解决方案(Galcier2),这些留待大家后面去学习了。
浏览: 164107 次
来自: 上海
关于eclipse插件安装方法,这里文章图文并茂,讲解的最详细 ...
非常不错 受益匪浅
如果能拿一个项目的例子来说明一下就好了~
不出现异常了,但是访问http://localhost:808 ...
崩溃。。。。。ICE概述 - wangqiaowqo - ITeye技术网站
网络通信引擎(Internet Communications Engine, Ice)是由ZeroC的分布式系统开发专家实现的一种高性能、面向对象的中间件平台。它号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯屏蔽。因此相比CORBA,DCOM,SOAP,J2EE等的中间件技术,自然是集众多优点于一身,而却没有他们的缺点。
Ice提供了完善的分布式系统解决方案,适合所有的异构网络环境:客户端和服务器端可以用不同的程序语言来实现,可以运行在不同的操作系统和不同的体系结构的机器上,使用不同的网络通信技术(TCP/UDP,SSL或通过插件功能扩展协议)。Ice也提供了客户端和服务器端的完全分离,客户端不需要知道服务器的实现过程和具体位置。Ice采用软总线的机制,使得在任何情况下、采用任何语言开发的软件只要符合接口规范的定义,均能集成到分布式环境中去。Ice面向对象,可以将所有应用看作是对象及相关操作的集合,构建在Ice之上的分布式系统的对象的获取只取决于网络的通畅性和获取服务对象特征的准确程度,而与对象的位置以及对象所处的设备环境无关。
1.2 ICE结构
Ice是一种面向对象的中间件平台,从根本上说,这意味着Ice为构建面向对象的客户/服务器模式的应用提供了工具、应用程序接口(API)和库支持。
1.2.1 客户端和服务器
&&&&&&& 客户端是主动的实体,向服务器端发出服务请求;服务器端是被动的实体,他们提供服务,响应客户端的请求。这两个角色并不是应用系统的组成部分的严格指称,而是表示在某个请求从发生到结束期间,应用系统某些部分所承担的角色。通常这样的角色界定是不固定的,甚至会经常性的发生反转行为。所以,许多客户/服务器常可以被准确的描述为对等系统(peer-to-peer),客户端和服务器角色只有在执行某个特定操作、在特定的时间能才有绝对意义。
1.2.2 Ice核心
Ice核心包含大量的链接库,是处于核心地位的对象总线,为客户端和服务器的远程通信提供支持。它主要关心的是网络通信、线程、字节序、其它一些网络细节及相关事务等,并将应用程序与这些底层事务隔离开。
&&&&&&& Ice核心定义了异构环境下对象透明的发送请求和接收响应的基本机制,是建立对象之间客户端/服务器模型的核心组件。它使对象可以透明的向其它对象发出请求或者接收其它对象的响应,这些对象可以位于本地也可以位于远端机器。Ice核心截获客户端的请求调用,找到可以实现请求的服务器对象,并负责传送参数、调用相应的方法、返回结果等。客户端对象并不需要了解和服务器对象的通信、激活或存储服务期对象的机制,也不需要服务器对象位于何处、用何种语言实现、使用什么操作系统或其它不属于对象接口的系统部分。对于服务器对象,也是如此。
Ice核心提供一种客户段/服务器的松耦合通信方式,使得开发人员可以把更多的注意力放在应用逻辑的实现上。
1.2.4 对象适配器
&&&&&& 对象适配器是专用于服务器端的Ice& API的一部分:只有服务器才使用对象适配器。对象服务器有若干功能,如下所列:
1. 对象适配器把来自客户端的请求映射到服务器端特定对象的特定方法上。
2. 对象适配器会跟踪在内存中的伺服对象,记录其对象标识,从而实现适配请求的功能。
3. 对象适配器可以与一个或多个传输端点关联在一起。如果与某个适配器关联的传输端点不止一个,就可以通过多种传输机制到达在该适配器中的伺服对象。为了提供不同的服务质量和性能,一个适配器可以同时关联一个TCP/IP|端点和一个UDP端点。
4. 对象适配器负责创建传给客户端的Ice代理。对象适配器知道每个对象的类型、标识以及传输机制的详细信息。当服务器端应用程序要求创建代理时,对象适配器会在其中嵌入正确的信息。
1.2.5 Ice代理
&&&&&& 代理代码是由用户定义的Slice文件经过编译后生成的。一个客户端要想与一个Ice对象建立联系,必须持有该Ice对象的代理。代理是存在于客户端地址空间的该Ice对象的代表。代理主要有两个功能:
1. 为客户提供了一个向下(down-call)调用的接口。如果客户端调用代理中的某个操作,就会有一个RPC消息被发送到服务器,从而调用目标对象上的某个对应的操作。以代理为中介,客户端发起的调用最终会调用到服务器目标对象上相应的操作。
2. 提供编码(marshaling)和解码(unmarshaling)。编码是将复杂的数据结构串行化,使其便于网络传输的过程。编码把数据转化为适合于传送的标准形式,这种形式不依赖于本地机器的字节序和填充规则。解码是编码的逆过程,将通过网络得到的串化数据重新构造成具有类型的结构化数据。解码之后得到的是与所使用的编程语言相适应的类型表示的数据。
1.2.6 Ice骨架(skeleton)
&&&&&&& 骨架代码也是由用户定义的Slice文件经过编译后生成的,其中的内容与Slice中定义的对象和数据的类型是对应的。骨架代码是客户端的代理代码在服务器端的等价物。它提供了向上调用(up-call)的接口,允许Ice把控制线程转交给服务器端的应用程序代码。骨架也负责编码和解码,所以服务器可以接收客户端发送的参数,并把返回值和异常传回客户。
1.4.1 Ice协议的组成
&&&&&&& Ice提供了一个RPC(Remote Procedure Call)协议,该协议能够运行在各种流传输和数据报传输协议上。目前,该协议支持TCP、UDP和SSL作为底层的传输机制。使用SSL协议时,客户端和服务器端之间的所有通信都可以进行加密,以确保传输的安全性。Ice协议的引擎是可以扩展的,开发人员可以通过增加API插件来增加新的底层传输协议,而不用修改源代码,Ice的SSL传输就采用了这种插件结构。Ice协议定义由三个主要部分组成:
1. 数据编码规则:确定各种数据类型的串行化方式。
2. 协议状态机制:规定客户端和服务器如何交互不同类型的信息。
3. 版本控制:确定客户端和服务器怎样就特定的协议和编码版本达成一致。编码规则和状态机制使用各自独立的版本号,从而保证了良好的向后兼容性。
1.4.4 协议状态机制
&&&&&&&& Ice只有五种协议消息,相对于其它通信协议相当简单。他们分别是:
&&&& 从客户端发到服务器的请求;
&&&& 从客户端发到服务器的批请求;
&&&&&&&&&&&&&&& 从服务器端发到客户端的答复;
&&&&&&&&&&&&&&& 从服务器端发到客户端的验证连接信息;
&&&&&&&&&&&&&&& 双向发送的关闭连接消息;
在这些消息里,验证和关闭连接消息只用于面向连接的传输机制。
&&&&&&& 和数据编码一样,协议消息也没有对齐限制。除了验证和关闭连接消息。每个消息都由一个消息头和一个紧跟其后的消息体组成。
1.5.2 IceGrid
&&&&&&&& IceGrid是Ice定位服务器的一种实现,它从间接绑定的协议-地址对中将一个间接代理中的符号信息解析出来,IceGrid除了能够提供简单的服务对象定位功能,还提供了一些网格计算的特性。
&&&&&&& 客户端通过代理发起调用请求,代理分为直接代理和间接代理。直接代理中保存有服务器的地址的详细信息,使用该信息,直接代理可以直接连接到服务器。而间接代理中只包含对象适配器的信息,没有任何服务器端的地址信息。但是,间接代理是一种更为常见的代理方式,因为间接代理支持服务器的透明迁移,即使服务器地址改变,客户端所持有的已有代理也不会失效。如果使用的是直接代理,虽然不用为了定位服务器而进行额外的查找,但是如果服务器被转移到其他机器上,代理就不能继续工作了。可见定位服务器在分布式系统中是相当最重要的,可以大大提高系统的灵活性。
在IceGrid中维护了记录着对象适配器和服务器地址的对应关系映射表。通过检索这张表,客户端就能获取服务器端当前的地址信息,这个过程类似于通过DNS将网络域名映射成IP地址。通过这种间接代理和IceGrid相结合的方式,服务器的迁移将不会影响到客户端的正常工作。
&&&&&&& IceGrid提供了对象查找的服务,客户端可用来获取他们感兴趣的对象代理。除此以外,还提供了服务器激活服务:当客户端发起请求时,服务器可能处于未运行状态,IceGrid会在第一个客户请求到达时,随需启动服务器。通过这个服务,开发人员可以轻松配置包含若干服务期的复杂应用。
1.6 Ice架构的优势
o 面向对象的语义
&&&&&&&& Ice “在线路上”完全保留了 面向对象范型。所有的操作调用都使用迟后绑定,所以操作实现的选定,是根据对象在运行时的(而不是静态的)实际类型决定的。
o 支持同步和异步的消息传递
&&&&&&& Ice 提供了同步和异步的操作调用(AMI)和分派(AMD),并且通过IceStorm 提供了发布-订阅消息传递机制。这样,你可以根据你的应用的需要来选择通信模型,而不必把你的应用硬塞进某种模型里。
o 支持多个接口
&&&&&&& 通过facets,对象可以提供多个不相关的接口,同时又跨越这些接口、保持单一的对象标识。这提供了极大的灵活性,特别是在这样的情况下:应用在发生演化,但又需要与更老的、已经部署的客户保持兼容。
o 机器无关性
&&&&&&& 客户及服务器与底层的机器架构屏蔽开来。对于应用代码而言,像字节序和填充这样的问题都隐藏了起来。
o 语言无关性
&&&&&&& 客户和服务器可以分别部署,所用语言也可以不同(目前支持C++、Java、.Net、Object-C、Python、Ruby以及PHP (客户端))。 客户和服务器所用的Slice 定义建立两者之间的接口合约,这样的定义也是它们唯一需要达成一致的东西。
o 实现无关性
&&&&&&&& 客户不知道服务器是怎样实现其对象的。这意味着,在客户部署之后,服务器的实现可以改变,例如,它可以使用不同的持久机制,甚至不同的程序设计语言。
o 操作系统无关性
&&&&&&&&& Ice API 完全是可移植的,所以同样的源码能够在Windows 和UNIX上编译和运行。
&&&&&& o 线程支持
&&&&&&&&&&&&&&& Ice run time 完全是线程化的,其API 是线程安全的。 作为应用开发者,(除了在访问&& 共享数据时进行同步)你无需为开发线程化的高性能客户和服务器付出额外努力。
&&&&&& o 传输机制无关性
&&&&&&&&&&&&&&&&& Ice 目前采用了TCP/IP 和UDP 作为传输协议。客户和服务器代码都不需要了解底层的传输机制(你可以通过一个配置参数选择所需的传输机制)。
&&&&&& o 位置和服务器透明性
&&&&&&&&&&&&&&&& Ice run time 会负责定位对象,并管理底层的传输机制,比如打开和关闭连接。客户与服务器之间的交互显得像是无连接的。如果在客户调用操作时,服务器没有运行,你可以通过IcePack 让它们随需启动。服务器可以迁移到不同的物理地址,而不会使客户持有的代理失效,而客户完全不知道对象实现是怎样分布在多个服务器进程上的。
&&&&&&& o 安全性
&&&&&&&&&&&&&&& 通过SSL 强加密,可以使客户和服务器完全安全地进行通信,这样,应用可以使用不安全的网络安全地进行通信。你可以使用Glacier穿过防火墙,实现安全的请求转发,并且完全支持回调。
&&&&&&& o 内建的持久机制
&&&&&&&&&&&&&&& 使用Freeze,创建持久的对象实现变成了一件微不足道的事情。Ice提供了对高性能数据库Berkeley DB[18] 的内建支持。
&&&&&& o 开放源码
&&&&&&& Ice 的源码是开放的。尽管使用Ice 平台,并不一定要阅读源码,但通过源码你可以了 解各种事情是怎样实现的,或把这些代码移植到新的操作系统上。
wangqiaowqo
浏览: 1212732 次
来自: 北京
spring mvc demo教程源代码下载,地址:http: ...
liuyanginjava 写道你好酷啊 打繁体,你是鬼子吧煞 ...
好文章,赞!
[img][list][*][/list][/img]
下面这个文章对log4j的配置讲解的很详细,推荐看看http: ...

我要回帖

更多关于 zeroc ice 教程 的文章

 

随机推荐