高性能分布式应用开发中间件ICE介绍

      这份文档原来是基于某个机会做的,放入博客以备存档吧就当作是。请勿转载,谢谢!


作为一个技术人员,你是否在为不断增长的数据量和日益复杂的业务逻辑而头疼不已,杂乱堆砌在一起的庞大业务让系统越来越脆弱,于是你想到了网格,想到了利用分布式来重组一个健壮的系统架构。

随后,RMI,EJB,  WebService,Hessian,http invoke…..一堆名词铺天盖地的向你袭来。面对这么多的技术实现,我们似乎有点难以抉择。EJB太过笨重,webservice的性能似乎有待商榷。http invoker似乎还不如webservice,Hession的功能似乎又太过简单….
      一个面向对象的,性能极高的,平台和语言无关的分布式应用中间件平台,ICE就是这么一个应该被收入我们技术人员工具箱的必备利器。

                                   The Internet Communications Engine
                                 分布式应用中间件平台 ICE 

一. 来源和定义

          ICE是由一些前CORBA阵营中的领军人物创建的ZeroC公司推出的旗舰产品。ICE开放源码遵循GPL协议,目前已经有包括 Lockheed Martin , Skype , Hewlett-Packard , Naval Undersea Warfare Center 以及国内的 CCTVnetTencent 等等非常多的公司和机构采用其产品,并基于该产品构建自己的分布式应用系统。

           那么,ICE是个什么东西呢?我们能用它做什么呢?

         ICE的定义:Ice是一个支持多语言映射的,面向对象的用于构建分布式应用系统的中间件平台

         ICE目前支持到C++, Java, .NET, Python, PHP, Ruby, and Objective-C等多种语言的映射。同时他的分支Ice-E支持使用网络的智能手机,PDA甚至是嵌入式控制器等网络设备.

         目前ICE的最新版本是3.4.1,因为目前我们仍然在使用3.3.1,所以之后的内容都会基于3.3.1版本。    

二. ICE 的特点

     

      ICE相比较其他分布式中间件来讲,具有如下优点:

提供适用于 异种环境 的面向对象中间件平台 .
提供一种在网络带宽、内存使用和 CPU 开销方面都 很高效 的实现 .
提供一组 完整的特性 ,支持广泛的领域中的实际的分布式应用的开发。
避免不必要的复杂性,使平台更 易于学习和使用

      当然,ICE也有其自身的缺点:

需要使用 slice 语言进行接口和对象设计 .
编译前确认,静态的接口。
接口或对象更新需要重新生成映射并分发,部署更新 .
三. ICE 提供的功能

          ICE提供了足够全面和完善的功能特性,使其能应用在各种实际的生产环境中. ICE包含的主要功能如下:

IceRunTime 内建提供的多线程处理。
直接代理对象,组对象和动态代理对象 ( 需要 LocationService ) ,组对象。
异步接口回调和基于流的动态分发 ( 支持防火墙穿透 )
基于 TCP/IP 的高性能单路,批量单路调用      基于 UDP 的数据包,批量数据包调用。

       此外,ICE还提供了多种服务,包括:

Glacier2 服务 (Ice 的防火墙解决方案 , 双向链接通讯,数据采用 SSL 加密 )
IceFreeze 服务 ( 默认基于 Berkeley DB 的对象持久化服务 )
IceStorm 服务 (Ice 的消息服务 , 支持作为 federated 服务运行 )
IcePatch 服务 (Ice 的补丁更新服务 , 一般采用 Glacier2 来保证不被非法下载 )
IceGrid 服务 ( 网格计算服务 , 包含了动态部署 , 自动更新 , 按需启动 , 负载均衡 , 状态监测和自我恢复 ) 是旧版本中 IcePack 的增强版 , 整合了其他服务。
四. ICE 的用途

          尽管ICE提供了极为全面和完善的功能,使其能应用在各种实际的生产环境中. 但我个人认为其在如下场景中能最大化发挥其优点:

整合业务线中的通用服务或核心服务 ( 如用户积分系统 )
流量极高的小数据消息服务 ( 如统一的远程日志统计系统 )
性能要求苛刻的对外系统服务 ( 如提供给第三方的 API 接口 )
五. ICE 实例

          我们现在以一个简单JAVA版本的Hello World远程打印程序为例子,简单说明一下ICE的实现。首先,如前所述,ICE使用一种称之为Slice的描述语言来定义接口和对象,那我们首先来使用Slice定义一个远程接口,如下所示:

      module src{

         module slices{    

            interface Printer{  void remotePrint (string s);  };

         };

      };

    我们把这段文本保存在叫作printer.ice 的文件中。然后利用ice提供的Slice2Java映射工具生成各种远程代理和对象。

        cmd方式下,执行slice2java  printer.ice命令,即可得到所有相关的类和接口。

五. ICE 实例

          示例中我们定义了一个接口Printer,包含一个remotePrint方法,然后我们分别编写服务器端和客户端的代码。注意该接口位于模块src/slice目录下,对于JAVA就是package,对于C++就是namespace

          在服务器端中,我们仅仅只是需要实现扩展该接口的Disp抽象类,并具体实现该远程接口的唯一方法即可。

          在服务器端中的SliceServer类虽然看起来比较复杂,但是实际上我们只需要编写完整之后,每次都可以直接拿来作为新的服务器端启动类来使用。而不需要每次都进行编写。同理,客户端中的SliceClient类也是实际上可以之后进行复用,而无需每次都重新编写的。

          本例中,我们仅仅定义了一个接口,其实可以扩展成定义多个接口,多个接口之间也是完全可以存在扩展和继承关系。本例中我们唯一的接口仅仅包含一个remotePrint方法,自然也可以定义多个方法。并且每个方法都可以有返回值,而且返回值既可以是基本数据类型,也可以是自定义数据类型。

六. SLICE 语法简介
    如前所 述, ICE 为了保证语言无关性,客户和服务器使用 Slice 来定义并建立两者之间的接口合约。
    Slice Specification Language for Ice Slice 在客户与服务器之间建立合约,描述应用所使用的各种类型及对象接口。这种描述与实现语言无关。 Slice 编译器定义了编译到特定的实现语言。编译器把与语言无关的接口和对象定义翻译成针对特定语言的类型定义和 API 。之前的样例就是一个 SLICE 接口合约,下边我们简单介绍一下 SLICE 语言。
所有的 Slice 定义文件扩展名必须是 .ice ,否则 slice 编译器不接受。
可以使用 C 或者 C++ 风格的注释。
包含 class dictionary ice 等关键字,同时保留 Helper Holder 等等保留的标识符。详见相关的文档。
基本的数据类型有 bool byte(8 ),short(16 ), int (32 ),long(64 ),float(IEEE 单精度 ),double(IEEE 双精度 ),string( 没有 null 的概念,因为其难以映射到部分语言中)。
六. SLICE 语法简介
枚举( enumerations )、结构( structures )、序列( sequences )以及词典( dictionaries )。
   
枚举例子 :  enum Fruit { Apple, Pear, Orange };
映射到 Java 为枚举  
   
结构会映射为一个具体的 Javabean 。举例子如下:
 
struct TimeOfDay {  string second; };
    序列默认都是为数组,例如 : sequence<Fruit> FruitPlatter ;
   
词典映射为 Map 类型。例如 : dictionary< int,string > smap ;
可以定义基本数据类型的常量,使用 const 关键字即可。例如:
 const
bool AppendByDefault = true;
 const string Advice = "Don't Panic!";
接口定义。 Slice 的接口可以理解成 Java 的接口。接口中的方法即对应了 Java 接口中的抽象方法。例如我们例子中的 remotePrint 方法就是一个没有返回值的抽象方法,需求我们之后去继承并实现。注意的是接口可以被继承。
六. SLICE 语法简介
此外 slice 还支持用户自定义异常,其结构为
exception 
customexception { string message,string code};
当然,一个异常也可以没有任何信息数据。同时类似 Java ,一个接口的操作可以申明为抛出多个自定义异常。
Slice 还可以定义 class 类,类像是接口:它们都能有操作;类也像是结构:它们都能有数据成员。 Slice 的类定义与结构定义类似,但所用关键字是 class 。例如:
    class TimeOfDay
    {   short hour; // 0 - 23
        short minute; // 0 - 59
        short second; // 0 - 59
    };
  
但是同结构不同的是,类也可以被单继承,能使用 Slice 结构的地方,你都能使用 Slice 类。但根据官方文档的描述,一般而言结构相对于类,定义和实现更清晰,性能也更好。
六. SLICE 语法简介

最后,Slice还支持元数据。元数据指的是某一个具体语言映射的特殊类型或者特定标记。例如:
 ["
java:type:java.util.LinkedList"] sequence <string> seqs;

[[“
java:package:com.kaiqi.slice”]]

   
对于第一个,当其作为到Java的映射时候,该sequence 就不会被转换为通常的数组,而是作为JavaList类型被映射。而如果作为到C或者C++的映射,仍然会被作为数组。
   
第二个是一个比较特殊的元数据,成为全局元数据,映射为我们JAVA经常使用的包名前缀,同样,只有在作为Java映射的时候才有效,对其他语言来说,编译器会自动忽略。

 

七. 结束语

         ICE为我们提供了一个高性能分布式应用开发的框架,基于其提供的各种功能,使得我们可以专注于业务逻辑,而不用关心系统底层的通信和交互细节。面对市面上林林总总的中间件,我们又多了一个值得信赖的选择。

        由于时间有限,我们只能就ICE的基本功能做一个简单的介绍,以便让大家对其有一个全面系统的了解,在我们知道其用途之后,就可以在之后进行系统设计的时候多一份选择。关于ICE更详细的内容,以后有机会的话再同大家一起分享!

        谢谢大家!

        ICE的官网为:http://www.zeroc.com/

猜你喜欢

转载自kekeemx.iteye.com/blog/844285