读书人

ice学习与运用

发布时间: 2012-09-15 19:09:28 作者: rapoo

ice学习与应用
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

读书人网 >编程

热点推荐