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

嵌入式 75浏览

http://lanhy2000.blog.163.com/blog/static/436786082012327449775/

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

随后,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
 以及国内的CCTVnet,Tencent 等等非常多的公司和机构采用其产品,并基于该产品构建自己的分布式应用系统。

           那么,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 是一种面向对象的中间件平台。从根本上说,这意味着  Ice 为构建面向对象的客户-服务器应用提供了工具、 API  和库支持。 Ice  应用适合在异构环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论部署环境如何,这些应用的源码都是可移植的。

 

 

Slice语言

在介绍 Ice 工作原理之前,有必要来了解一下 Slice语言。

Slice( Specification Language for Ice )是一种用于使对象接口与其实现相分离的基础性抽象机制。  Slice 在客户与服务器之间建立合约,描述应用所使用的各种类型及对象接口。这种描述与实现语言无关,所以编写客户所用的语言是否与编写服务器所用的语言相同,这没有什么关系。 Slice 定义由编译器编译到特定的实现语言 。编译器把与语言无关的定义翻译成针对特定语言的类型定义和  API 。开发者使用这些类型和 API  来提供应用功能,并与  Ice  交互。用于各种实现语言的翻译算法称为语言映射( language mappings )。  Ice  目前定义了 C++, Java, C#, Python, Objective-C, Ruby, PHP. 的语言映射。 Slice 定义的文件扩展名为  .ice 。

以上是官方文档的表述,难以形成清晰的概念,如果用一种不太严谨但更容易理解的话来讲,

Slice是一种用于定义接口的中间语言。

 

 

Slice语言编译

Ice为每种其所支持的语言 ( 以下称宿主语言 ) 提供了相关编译器,假设语言为 XXX, 则编译命令一般为slice2XXX, 用于为 slice 文件生成相对应的用宿主语言定义的映射代码,以辅助服务端或客户端的开发。

 

 

Ice基本原理

 

有了Slice 语言的基本概念,理解 Ice 的工作原理变得容易,下图很好地呈现了 Ice 的工作原理及执行流程:

 

 

 

1. 首先用slice 语言编写好“接口”

2. 接口编好后,自然要去实现它,这时可以选择任一种宿主语言去实现该接口。本图例用的是C++ 。用相应编译器生成辅助代码后,开发者在此基础上进行业务逻辑的开发。实现接口的一方通常作为服务端,可利用 Ice 提供的 api 发布服务。

3. 作为调用方,同样可以选择任一种宿主语言。本图例是用Java 。

4. 服务端运行后,客户端便可调用其提供的接口。Ice 为我们屏蔽了底层的通讯细节。

总结,以上两篇博文分别介绍了ICE中间件的用途和编写语言。下一篇博文中,我将以C#编程语言为例,编写一个ICE端、客户端、服务端的demo。