Ice中间件研究
简介
Ice 是一种面向对象的中间件平台。从根本上说,这意味着 Ice 为构建面向对象的客户-服务器应用提供了工具、 API 和库支持。 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
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
- #
- 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!