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 ,内容如下
Xml代码
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, 内容如下
Xml代码
#
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 ,内容如下
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 不同的是,需配上注册服务器地址
Xml代码
#
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!
http://yangguo.iteye.com/blog/1096630
分享到:
相关推荐
此外,论文还可能对比了ICE与其他中间件如CORBA、RMI的差异,并通过实际案例展示了ICE在实际应用中的效果。 综合这些资料,学习ICE不仅需要理解其核心概念,如对象代理、冰点接口(Ice interfaces)、多线程通信,...
总结来说,文档为开发者提供了一个全面的ICE学习指南,从ICE的基础知识到实际的编程应用,再到配置和性能优化,覆盖了ICE开发的各个方面。通过阅读这份文档,开发者能够掌握ICE的使用方法,并能在实际项目中有效应用...
**Zeroc ICE 学习大全** Zeroc ICE(Integration and Communication Environment)是一种高性能、跨平台的中间件,用于构建分布式系统。它提供了一种简单而强大的方式来实现对象间的远程调用,使得开发人员可以像...
### Ice分布式应用开发知识点概述 #### 一、Ice框架简介 - **Ice**(Internet Communications Engine)是一款开源的中间件框架,旨在简化分布式应用程序的开发。它提供了跨平台的通信能力,支持多种编程语言(如...
这个“一个ICE的简单应用(客户端,服务端都有)”的压缩包提供了一个快速上手ICE的实例,非常适合初学者进行学习。 ICE支持C++,Java,Python等多种编程语言,而这里标签明确指出了"ICE c++",所以我们将重点讨论...
标题中的“ice与pb结合”指的是在IT领域中,ICE(Internet Communication Engine)框架与Protocol Buffers(简称PB)的整合应用。ICE是一款强大的分布式中间件,它支持多种编程语言,如C++、Java、Python等,用于...
《Ice-1.3.0 分布式应用(中文版)》是一份关于ZeroC ICE(Internet Communication Engine)RPC框架的教程,虽然版本较旧,但依然具备学习价值。RPC,即远程过程调用,是一种分布式系统通信技术,使得应用程序可以像...
理解并掌握ICE源码有助于我们深入学习数字图像处理,不仅能应用在冈萨雷斯的教材中,也能灵活运用到实际项目中。通过阅读和分析ice.m文件,我们可以学习到MATLAB在图像处理领域的强大功能,以及如何利用这些功能实现...
ICE中文版手册是针对中国开发者特别准备的文档,有助于那些更习惯阅读中文文档的程序员更好地理解和应用ICE。手册中通常包含了详细的技术规范、API参考、示例代码以及最佳实践。通过阅读手册,开发者可以了解如何...
描述:"ICE最新版官方的学习资料,因为中文基本没有,一起啃吧" 标签:"ICE" 知识点解析: ### Ice:分布式编程框架 Ice,全称为Internet Communications Engine,是ZeroC公司开发的一款用于分布式编程的框架。...
《ICE for Windows安装包详解及应用》 ICE(Integration and Communication Engine)是一种高性能、轻量级的中间件...通过深入学习和实践,开发者可以充分利用ICE的强大功能,解决复杂的应用场景中的通信和集成问题。
ICE(Integrated Cloud Environment)是一种分布式系统框架,专为构建大规模、高性能、高可用的应用程序而设计。这个学习资料包提供了全面了解和掌握ICE技术的宝贵资源,包括英文原版文档和对应的中文翻译版本,这...
Ice-3.5.1是其在201X年发布的一个稳定版本,包含了丰富的功能和改进,对于学习和应用分布式系统开发具有重要的价值。本文将深入探讨Ice-3.5.1的核心特性、主要组件以及源码分析。 一、Ice的核心特性 1. 跨语言支持...
文档`android连接ICE步骤.docx`可能包含了更详细的步骤和示例代码,建议结合该文档进一步学习。在实际开发中,确保对ICE的API有深入理解和熟悉,同时考虑到Android的多线程模型,合理安排网络操作,避免阻塞UI线程。...
ICE的学习曲线比较短,很容易上手只要你熟悉某一种语言(例如C++或Java),了解了ICE编程范式之后,很快就能开发出实际的应用。ICE提供了一种在网络带宽、内存使用和CPU开销方面都很高效的实现。同时,ICE还提供了一...
总的来说,这些文章涵盖了ICE的各个方面,从基础到高级,从理论到实践,为初学者提供了全面的学习资源,同时也为有经验的开发者提供了深入了解和优化ICE应用的思路。通过学习这些材料,读者将能够掌握ICE的关键技术...
### 分布式编程与ICE 3.3.1:关键知识点概述 #### 一、ICE 3.3.1 概览 - **版本信息**:文档为ICE 3.3.1版本,包含了IceTouch 1.0的相关内容。 - **发布时间**:此文档修订版发布于2009年7月。 - **版权所有**:...
### ZeroC Ice 3.7 官方手册知识点解析 #### 一、Ice 手册概览 ...通过以上内容的详细介绍,可以看出ZeroC Ice 3.7 手册覆盖了从基本概念到高级应用的各个方面,为开发者提供了全面而深入的学习资源。
5. **ICEChatClient**:这个可能是客户端应用程序的源代码目录,包含与服务器交互的代码,调用由Chat.ice定义的接口来发送和接收消息。 6. **Debug**:这是一个目录,通常在编译过程中用于存放调试版本的输出文件,...