ICE动态调用与分发机制的研究与实现
2012-11-26李海江徐志江
王 刚,李海江,徐志江
(1.浙江工业大学省通信网应用技术研究重点实验室,浙江杭州310023;2.杭州龙骞科技有限公司,浙江杭州310012)
0 引言
当前,互联网的高速发展,使得通信网络的规模越来越大,复杂性不断增加,异构性越来越多。分布式网络系统因其健壮性及能够实现负载均衡,有效地提高系统的扩展能力,而广泛应用于通信网络中[1]。但是,这种规模庞大,结构复杂,可扩展能力强,性能稳定以及与平台无关性的分布式系统,必须要有一种标准的,独立于计算机硬件与操作系统的开发和运行环境。在这个背景下,一种用于分布式系统的中间件网络通信引擎(Intenet Communications Engine,ICE)被提出[2、3]。同时,不同平台,不同语言环境下的客户端和服务器之间要进行各种数据的交互,包括文件。在ICE中,静态调用与分发能完成大部分的功能,但不适合输入输出流[4]。本文阐述了在异构环境下ICE通信的基本原理,设计了一种基于ICE动态调用与分发机制,结合Java IO技术的方案,解决这一问题,实现跨平台通信。
1 ICE中间件
ICE是Zeroc公司提出的一款应用于分布式系统、面向对象的、开源的中间件平台。它支持主流的编程语言,比如 C++,Java,Python,PHP,.NET,Object-C 等。应用于不同的操作系统:Linux,Windows,MacOS,Android等。ICE中间件屏蔽了底层通信细节,开发人员可以灵活的选择开发语言和操作系统来实现自己的业务逻辑。
Slice规范,在ICE中间件中,会有很多ICE对象,每个ICE对象包含了要实现的业务逻辑的定义。在业务逻辑中,所有的接口、操作和数据类型都遵循Slice语言规范,定义在后缀名为.ice的文件中。Slice是一种用于使对象接口与其实现相分离的抽象机制,在客户端与服务器之间建立契约关系[5]。这样,ICE为不同的语言,不同的平台提供了业务逻辑统一、独立的接口规范。
ICE通信原理,在ICE中,要实现客户端和服务器的通信,必须使用不同的编译器(slice2cpp,slice2java,slice2py等),完成.ice文件到不同的语言的映射。其实现的过程如图1所示:
在客户端,映射完成生成代理代码,生成代码和客户端程序共同编译生成客户端可执行程序。在服务器端,映射完成生成骨架代码,生成代码和服务器端程序共同编译生成服务器端可执行程序。
ICE通信采用典型的CS模式。客户端调用代理中的操作,来访问服务器。服务器调用Servant(代理中的操作在本地的具体实现)做出响应,并将结果反馈回客户端。
图1 *.ice文件到不同语言的映射
2 ICE动态调用与分发
在ICE中,静态调用与分发已经很好地完成大部分功能,但不适合输入输出流。ICE动态调用与分发提供了流接口,实现了通信过程中字节流的处理。
2.1 流接口和Java IO
ICE动态调用和分发中,流接口是最本质、最核心的内容。它能实现Slice类型数据与字节流序列之间的转换。在ICE到Java语言的映射中,ICEAPI提供了InputStream和OutputStream两个流接口。InputStream和OutputStream是字节流接口,定义了一系列的read()和write()方法。read()在ICE的InputStream字节流序列中读取Slice类型数据,write()将Slice类型数据写进ICE能够处理的OutputStream字节流中。
要处理文件,在Java语言中,需借助Java IO技术,主要是使用FileInputStream和FileOutputStream两个字节流。FileInputStream将文件转换为字节流,供ICE中的OutputStream使用,FileOutputStream将ICE中的InputStream转换成文件。
2.2 ICE动态调用与分发机制
在ICE中,要运用动态调用和分发机制,必须调ObjectPrx和重载Blobject中的ice_invoke()方法。其定义分别为:
boolean ice_invoke(String operation,Ice.OperationMode mode,byte[]inParams,Ice.ByteSeqHolder outParams)和 boolean ice_invoke(byte[]inParams,Ice.ByteSeqHolder outParams,Ice.Current current)
在客户端,调用ObjectPrx类型代理中的ice_invoke方法实现动态调用。operation参数动态指定在.ice文件中的各种方法;mode指定方法调用的模式,包括Idempotent等[5];inParams和outParams对应了ICE流接口中的InputStream和OutputStream字节流。
在服务器端,Servant必须继承Blobject类,并重载其ice_invoke方法实现动态分发。客户端的请求操作被保存在current参数中。Servant根据current中的操作,来动态调用对应的操作的实现,并将结果保存在outParams中,反馈给客户端。
2.3 设计方案
设计的流程如图2所示:
图2 ICE动态调用与分发流程
这一过程简单的表述为:(1)客户端获取FileInputStream;(2)客户端获取ICE OutputStream,调用ObjectPrx类型代理中的ice_invoke方法,根据operation值实现动态调用;(3)服务器端调用Servant中ice_invoke方法,根据current值,实现分发处理;(4)在ICE inputStream字节流中读取参数和FileOutput-Stream,并形成文件;(5)逆向处理,实现服务器到客户端的Slice类型数据和文件传送。
2.4 实验结果与分析
基于本方案的设计,实验测试环境如下:在Linux平台下搭建服务器,安装jdk6.0和ICE的linux版本,有公网ip地址210.32.200.129。在Windows平台下搭建客户端,安装jdk6.0和ICE的Windows版本以及eclipse集成开发环境,有局域网ip地址192.168.1.247。测试内容为:(1)客户端调用代理中的add方法,服务器处理后,将结果返回客户端;(2)客户端将名为1.jpg的图片传递给服务器,保存在/home/wg/Computer下。经测试,可以实现Slice类型数据和文件图片等的跨平台传送,结果如图3所示。
图3 跨平台参数和文件传送
结果表明:ICE动态调用与分发,能够处理在ICE通信中静态调用与分发不支持的文件传送问题。
3 结束语
ICE是一个面向对象的中间件平台,在分布式通信系统中表现出良好的性能。基于ICE的动态调用和分发机制,能够实现跨平台文件传送,这对于共享参数文件以及xml等配置文件的传送具有良好的参考价值。
[1] 丁云亮,谷利泽,杨瑜.基于分布式中间件ICE的应用架构研究[J].计算机应用,2009,29(12):27-29.
[2] 陈增孝,裘雪红.面向对象的ICE中间系统设计[J].电子元器件应用,2008,10(8):16-18.
[3] 管志东,李建华,张少俊.ICE在网络管理中的应用研究[J].计算机技术与发展,2006,16(2):1-3.
[4] Michi Henning Mark Spruiell.Distributed Programming with Ice .Zeroc[EB/OL].http://download.zeroc.com/Ice/3.4/Ice -3.4.1.pdf,2010 -06 -08.
[5] 马维达.Ice分布式程序设计[EB/OL].http://www.Zeroc.com,2004-08-24.