`

Ice中间件研究

    博客分类:
  • Java
阅读更多

 

Ice中间件研究

简介

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 为我们屏蔽了底层的通讯细节。

 

 

安装

windows

Windows平台安装比较简单,下载 安装文件 然后安装即可。Windows 安装文件已带有 demo

 

Linux

1. 下载 Ice-3.4.1-rhel5-i386-rpm.tar.gz

2. 安装文件放到linux 任意目录,打开 linux 终端

3. 解压文件

#tar xzvf  Ice-3.4.1-rhel5-i386-rpm.tar.gz

4.安装必要的 rpm

#rpm -ivh ice-3.4.1-1.rhel5.noarch.rpm

#rpm -ivh db48-4.8.30-1ice.rhel5

#rpm -ivh ice-libs-3.4.1-1.rhel5

#rpm -ivh ice-servers-3.4.1-1.rhel5

#rpm -ivh ice-utils-3.4.1-1.rhel5

5. 根据需要安装宿主语言支持,本例为java

#rpm -ivh db48-java-4.8.30-1ice.rhel5

#rpm -ivh ice-java-3.4.1-1.rhel5

#rpm -ivh ice-java-devel-3.4.1-1.rhel5

 

安装完毕,如需要demo, 需要下载 Ice-3.4.1-demos.tar.gz

 

 

Java端开发

以下链接介绍了如何安装和使用Eclipse 插件进行 Ice 程序开发

http://www.zeroc.com/eclipse.html

想进一步了解编程细节,可参考官方提供的Demo

tips

Java语言的 Demo 是用 Ant 来构建的,为方便运行 Demo, 建议采用以下方式。

(为便于表述,以下称Demo 根目录为 ICE_DEMO)

打开ICE_DEMO/config/common.xml 文件,在文档尾部增加以下两个任务:

<target name="runServer" depends="init">

 

        <java className="Server">

                   <classpath refid="ice.classpath" />

                   <classpath location="${class.dir}"/>

        </java>

 </target>

 <target name="runClient" depends="init">

        <echo message="path: ${dist.jar.file}"/>

                <java className="Client">

                   <classpath refid="ice.classpath" />

                   <classpath location="${class.dir}"/>

        </java>

  </target>

 

经过修改后,demo 的运行变得方便,试举一例:

#cd ICE_DEMO/demoj/Ice/minimal

#ant all

#ant runServer

另开一终端

#ant runClient

 

其中ant all 是执行代码生成,编译等任务,如无修改,只需执行一次,以后可省去此步。

 

Ice服务

Ice 核心为分布式应用开发提供了一个完善的客户-服务器平台。但现实应用需要的常常不止是远程通信能力:你通常还需要拥有这样的能力:随需启动服务器、把代理分发给客户、分发异步事件、配置你的应用、分发应用补丁,等等。在  Ice  中有一些服务, 能够提供上述特性及其他一些特性。这些服务被实现成  Ice  服务器,你的应用充当的是这些服务器的客户。这些服务都没有使用  Ice 的任何向应用开发者隐藏起来的内部特性,所以在理论上,你可以自行开发等价的服务。但让这些服务成为平台的一部分,你就可以专注于应用开发,而不必先构建许多基础设施。而且,构建这样的服务所需的工作量并非微不足道,所以你应该了解有哪些服务可用,而不要重新发明你自己的轮子。

Ice服务内容非常丰富,诸如负载均衡,消息服务,容器,持久化等功能都是由 Ice 服务来提供, 以下对 IceGrid服务进行介绍

 

 

IceGrid

IceGrid Ice 定位服务的一个实现,以解决在间接代理中用符号信息来对协议地址对进行间接绑定的问题。定位服务仅仅是IceGrid 的能力的一部分:

IceGrid 允许您注册自动启动服务器:而不需要在运行一个客户端前,必须先启动服务器。当第一客户端请求到达时, IceGrid 将按需启动服务。 

IceGrid 提供的工具可以很容易地配置包含在多台服务器中复杂的应用程序。 

IceGrid 支持复制和负载均衡。 

IceGrid 使可执行文件和依赖文件的分发和打补丁自动化。 

IceGrid 提供了一个简单的查询服务,使客户能够获得他们感兴趣的对象的代理。

 

个 IceGrid 域由一个注册表( Registry )和任何数目的节点 (Node) 构成。注册表( Registry )和节点 (Node) 一起合作管理一些信 息以及包含一些应用( Application )的服务进程。每项应用( Application )被指定在特定节点上的服务。这个注册表 ( Registry )持久记录了这些信息,而节点( Node )负责启动和监测其指定的服务器进程。对于一个典型的配置,一个节点( Node )运行在一台计 算机 ( 称之为 Ice 服务器主机 ) 。注册表( Registry )并不消耗很多处理器时间,所以它常常是和一个节点( Node )运行在同一台计算机上的 ; 事实 上,如果想要的话,注册表( Registry )可以和一个节点( Node )可以运行在同一进程中 . 如果容错是理想的,注册表( Registry )使用主从 式的设计支持复制( Replication )。 也可将注册表与节点进行分离,如下图:

以下将演示一个实例,以对 IceGrid有一个比较清晰的理解。

ICE_DEMO/demoj/IceGrid/simple的例子向我们展示了 IceGrid 的简单应用,该例子主要演示的是服务端实现了打印字符接口,客户端通过调用接口,在服务端打印出 Hello world

1. 要运行该事例,首先开启IceGrid 服务

打开终端1

$ cd ICE_DEMO/demoj/IceGrid/simple

$  icegridnode --Ice.Config=config.grid

2. 部署服务

打开一个新终端2 ,执行

$ icegridadmin --Ice.Config=config.grid -e \

"application add 'application.xml'"

3. 运行客户端

打开一个新终端3 ,执行

$ant runClient

出现界面

 

输入 t后回车

回到终端1 ,出现以下消息:

SimpleServer says Hello World!

 

由此可见,我们并没有手动开启服务端,当客户发出调用请求时,IceGrid 已经帮我们运行并激活了服务程序。

 

 

 

负载均衡集群

修改上面示例,以体现IceGrid 服务的负载均衡特性。

1、 环境
主机1 IP= 90.0.12.199 ,上面部署注册表服务器registry 和节点 node1 registry node1 运行在 不同 进程中;
主机2 IP= 90.0.12.200 ,上面部署节点node2
其中每个节点中包含 个服务程序, 节点 1 各服务器名为 SimpleServer-1/2/3 节点 2 各服务器名为 SimpleServer-4/5/6

2、主机 1 配置
1 注册表服务器 XML config.register ,内容如下


IceGrid.InstanceName=DemoIceGrid

#

# The IceGrid locator proxy.

#

Ice.Default.Locator=DemoIceGrid/Locator:default-p 4061

#

# IceGrid registry configuration.

#

IceGrid.Registry.Client.Endpoints=default-p 4061

IceGrid.Registry.Server.Endpoints=default

IceGrid.Registry.Internal.Endpoints=default

IceGrid.Registry.Data=db/registry

IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier

IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier

IceGrid.Registry.SSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier

IceGrid.Registry.AdminSSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier

 
  (2)节点 1 配置文件 : config.node1, 内容如下


#

Ice.Default.Locator=DemoIceGrid/Locator:default -p 4061

#

# IceGrid registry configuration.

#

#

# IceGrid node configuration.

#

IceGrid.Node.Name=node1

IceGrid.Node.Endpoints=default

IceGrid.Node.Data=db/node

#IceGrid.Node.Output=db

#IceGrid.Node.RedirectErrToOut=1

#

# Trace properties.

#

IceGrid.Node.Trace.Activator=1 

(3)修改服务部署文件  application_with_replication.xml ,内容如下


<icegrid>

  <application name="Simple">

    <server-template id="SimpleServer">

      <parameter name="index"/>

      <server id="SimpleServer-${index}" exe="java" activation="on-demand">

   <option>-classpath</option>

        <option>/usr/share/java/Ice-3.4.1.jar:./classes/</option>

        <option>Server</option>

        <adapter name="Hello" endpoints="tcp" replica-group="ReplicatedHelloAdapter"/>

        <property name="Identity" value="hello"/>

      </server>

    </server-template>

    <replica-group id="ReplicatedHelloAdapter">

      <load-balancing type="round-robin"/>

      <object identity="hello" type="::Demo::Hello"/>

    </replica-group>

    <node name="node1">

      <server-instance template="SimpleServer" index="1"/>

      <server-instance template="SimpleServer" index="2"/>

      <server-instance template="SimpleServer" index="3"/>

    </node>

    <node name="node2">

      <server-instance template="SimpleServer" index="4"/>

      <server-instance template="SimpleServer" index="5"/>

      <server-instance template="SimpleServer" index="6"/>
 

--------------------------------------------------------

2.  主机2 配置

 (1)节点 2 配置文件 : config.node2, 内容如下,与 node1 不同的是,需配上注册服务器地址


#

Ice.Default.Locator=DemoIceGrid/Locator:default   -h  90.0.12.199  -p 4061

#

# IceGrid registry configuration.

#

#

# IceGrid node configuration.

#

IceGrid.Node.Name=node 2

IceGrid.Node.Endpoints=default

IceGrid.Node.Data=db/node 2

#IceGrid.Node.Output=db

#IceGrid.Node.RedirectErrToOut=1

#

# Trace properties.

#

IceGrid.Node.Trace.Activator=1 
 


3 、客户端配置
配置文件:config.client ,内容如下:
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h  90.0.12.190  -p  4061  #只需有注册表服务器的端点信息即可

4 、启动服务程序
1 )主机 1 上先启动注册表 服务器 和节点1

#icegridregistry  --Ice.Config=config. register

新开一终端,执行

# icegridnode --Ice.Config=config. node1
2 )主机 1 上部署服务(只需部署一次,除非修改过),执行:
icegridadmin --Ice.Config=config .register  -e "application add  'application_with_replication.xml' "
若要重新部署,执行:icegridadmin --Ice.Config=config.grid -e " 'application_with_replication.xml' "
3 )主机 2 上启动节点 2

# icegridnode --Ice.Config=config.node 2

 

 

5. 客户端调用测试

#ant runClient

选择 t,然后观察两个节点的终端,可见节点 1 终端出现

SimpleServer-1 says Hello World!

 

将当前客户端暂停运行

#ctrl + z

继续运行一个客户端

#ant runClient

选择 t,然后观察两个节点的终端,可见节点 1 终端出现

SimpleServer-2 says Hello World!

 

反复执行以上各步,当运行到第四个客户端时,观察两个节点的终端,可见节点2 终端出现

SimpleServer-4 says Hello World!

 

 

 

 

分享到:
评论
1 楼 itaxi 2011-06-22  
谢谢, LZ了, 最近正在研究Ice.
不知道有没有更多的例子, 尤其是关于Ice一些服务的例子, 像IceBox, IceStorm等等. 这些资料,国内的好像比较少

相关推荐

    基于Zookeeper的分布式ICE中间件研究.pdf

    总的来说,这项研究的核心是利用Zookeeper来实现分布式ICE中间件中IceGrid服务的高可用性改进,其主要贡献在于提供了一种自动化主从切换的解决方案,大大简化了分布式系统中的故障恢复过程,从而提高了系统的整体...

    基于ICE中间件的分布式卫星地面测试系统研究.pdf

    本篇文档主要讲述了基于ICE中间件的分布式卫星地面测试系统的相关研究,同时通过分析Kalman滤波结合Blob匹配法的运动目标跟踪算法,阐述了在多目标跟踪中如何通过预测和减少计算量来提高算法效率。以下是对文档中...

    ICE中间件资料大全

    《ICE中间件资料大全》是针对ICE(Internet Communication Engine)这一强大的分布式程序设计框架的一份综合资源包。ICE是一款高效、灵活且可扩展的中间件,由ZeroC公司开发,旨在简化多语言、跨平台的分布式系统...

    ICE中间件中文手册

    **ICE中间件中文手册概述** ICE(Integration, Communication, and Embedding)中间件是由ZeroC公司开发的一款高性能、跨平台的分布式系统通信框架。它基于Corba(Common Object Request Broker Architecture)理念...

    基于ICE中间件的分布式应用开发研究.pdf

    基于ICE中间件的分布式应用开发研究 本文研究了基于ICE中间件的分布式应用开发,通过介绍中间件的特点,分析了ICE中间件的架构及主要构成,以地面测试人员获取远端被测设备的系统时间为例,介绍了一种基于ICE中间件...

    ICE中间件的LVC集成模型研究.pdf

    【标题】:“ICE中间件的LVC集成模型研究” 【描述】:该研究探讨了基于ICE中间件的LVC(Live, Virtual, Constructive)集成模型,旨在解决现代防御技术中的仿真验证问题。 【标签】:中间件,微服务,服务器,...

    ICE中间件在机器人中的应用

    ### ICE中间件在机器人中的应用 #### 摘要与背景 本文由Molaletsa Namoshe等人撰写,探讨了ICE(Internet ...未来的研究方向可能会集中在如何进一步提高ICE中间件的性能以及如何更好地与其他机器人技术集成。

    Zeroc ice消息中间件

    最后,`Ice-1.3.0-C.rar`是一个早期版本的压缩包,可能包含了当时的源代码或文档,对于研究ICE的历史演进或者解决特定版本的问题非常有价值。 通过深入学习这些资料,开发者不仅可以掌握Zeroc ICE的基本使用,还能...

    基于ICE中间件平台的短波分布式分集接收系统架构设计.pdf

    【标题】:基于ICE中间件平台的短波分布式分集接收系统架构设计 【描述】:该文讨论了如何利用ICE中间件平台构建短波分布式分集接收系统,旨在提高短波通信的接收效率。 【标签】:分布式、分布式系统、分布式开发、...

    中间件Ice中消息服务的技术研究及改进

    中间件Ice中消息服务的技术研究及改进中间件Ice中消息服务的技术研究及改进中间件Ice中消息服务的技术研究及改进

    ICE在分布式系统消息中间件中的应用.pdf

    研究者深入研究了ICE的体系结构、系统组成和使用模式,确保所设计的消息中间件能够有效地支持消息通信,特别是在异构平台分布式对象间的通信。 研究论文中的关键词包括“网络通信引擎(ICE)”、“消息中间件(MOM)”...

    Ice入门完整实例

    【Ice入门完整实例】是一个针对初学者的教程,旨在引导用户了解并掌握Ice中间件的基本用法和开发流程。在本实例中,我们将深入探讨Ice,一个强大的分布式对象框架,它提供了一种高效的、跨平台的方式来构建分布式...

    基于ICE的分布式自动化快速测试验证平台架构研究.pdf

    在这篇标题为《基于ICE的分布式自动化快速测试验证平台架构研究》的文献中,作者江卓逞、曾加刚和黄玮介绍了一种基于ICE中间件技术的分布式自动化快速测试验证平台架构模型。下面将详细阐述文章中提到的关键知识点。...

    ICE 的聊天demo 含有ICE的配置文档

    1. **ICE中间件**:ICE是由ZeroC公司开发的跨平台通信框架,它提供了多种语言的绑定,如C++、Java、Python等,支持对象间透明的远程方法调用(RPC)。ICE的核心特性包括高效的序列化、负载均衡、容错机制和安全特性...

    ice-3.4.1-demos.zip

    《ICE中间件3.4.1版本Demo详解》 ICE(Internet Communication Engine)是一种高性能、跨平台的分布式计算中间件,它提供了丰富的通信和对象交互功能,广泛应用于各种分布式系统中。ICE 3.4.1是其一个重要的版本,...

    ICE技术研究

    ### ICE技术研究详解 #### 一、ICE技术概述 ICE(Internet Communications Engine)是一个高性能的互联网通信中间件平台,专为现实世界中的程序员设计。它不仅涵盖了多层级的服务与插件,还以其简洁、高效及强大的...

    ICE 示例代码

    **ICE (Internet Communications Engine) 示例代码** ICE 是一种高性能、跨平台的中间件,它...通过深入研究这些示例,你将能够更好地理解和运用 ICE 的核心概念和技术,为你的项目带来高效、可靠的分布式解决方案。

Global site tag (gtag.js) - Google Analytics