- 浏览: 110790 次
- 性别:
- 来自: 深圳
博客专栏
-
告诉你什么是优雅的代码
浏览量:22930
最新评论
-
wfm0105:
不支持小数
告诉你什么是优雅的代码(6)------阿拉伯钱数转换为中文形式 -
wfm0105:
daisy_rainbow 写道 不懂这些数组里 ...
告诉你什么是优雅的代码(4)-----智力题的解法(答案) -
恒之疆:
无敌模式有问题
告诉你什么是优雅的代码(11)----html5 之XXOO棋 -
Shengli_fu:
...
告诉你什么是优雅的代码 -
Shengli_fu:
...
告诉你什么是优雅的代码(5)------ 百度之星也是普通人(答案)
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
# 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!
评论
不知道有没有更多的例子, 尤其是关于Ice一些服务的例子, 像IceBox, IceStorm等等. 这些资料,国内的好像比较少
发表评论
-
shiro 整合dwz 解决登录跳转问题
2014-02-26 11:07 5637在dwz界面操作会话超时时,有两种处理方法。一种是跳 ... -
html5--笑傲弈林
2011-06-24 17:39 2440结合笔者发过的ht ... -
朝花夕拾-----中国象棋
2011-03-10 22:51 1989整理文件,发现昔日写的中国象棋程序,把玩一番,直叹今不如昔,锋 ... -
告诉你什么是优雅的设计(2)--------重构EasyMonitor
2011-01-20 17:33 2229EasyMonitor1.0出来后不久,玩着玩着,我就敏锐 ... -
告诉你什么是优雅的设计(1)--------EasyMonitor1.0
2011-01-19 17:44 2584公司里不知哪个“专家”做的项目,总把tomcat ... -
还原javaeye的崇高文化
2010-12-07 18:57 1482平时对帖子的质量比较苛刻,对一些没内容帖子不免冷嘲热讽。 本来 ... -
html5-贪食蛇
2010-11-30 14:09 1418随着HTML5的插入触碰到RIA的G点,b/s的生产力将进一步 ... -
告诉你什么是优雅的代码(10)----鬼斧神工
2010-11-03 16:06 2362最近逛javaeye得出的体会就是现在的弟弟妹妹确实都很强。动 ... -
告诉你什么是优雅的代码(9)----山寨版猜珍珠
2010-10-08 17:16 1783国庆长假百无聊赖,于是玩玩3366的游戏。 玩到一款小游戏ht ... -
告诉你什么是优雅的代码(8)-----排列组合专题
2010-09-25 14:20 6165http://www.iteye.com/topic/7703 ... -
JAVA程序员情书
2010-09-21 11:55 3578根据网络同名情书改编,版权所有,盗版不究。 我能抽象出整个 ... -
告诉你什么是优雅的代码(7)-----银行作业调度系统
2010-09-20 11:51 2328公告:C1000,请到1号窗口办理,估计用时48秒。 公 ... -
告诉你什么是优雅的代码(6)------阿拉伯钱数转换为中文形式
2010-09-19 14:08 3181http://www.iteye.com/topic/7668 ... -
告诉你什么是优雅的代码(5)------ 百度之星也是普通人(答案)
2010-09-19 09:49 2850最近在写优雅代码系列 ... -
世人谓我太疯癫,我笑世人看不穿
2010-09-17 17:44 1315你来迟了。 首先来看下这个系统的使用方法: publ ... -
告诉你什么是优雅的代码(5)------ 百度之星也是普通人
2010-09-14 16:34 2003今天在挖掘《优雅代码》系列的题材的时候,发现一贴http:// ... -
告诉你什么是优雅的代码(4)-----智力题的解法(答案)
2010-09-08 16:08 2645以下智力题摘自某一帖子。在纸上画了一下之后有了答案。出于职业敏 ... -
告诉你什么是优雅的代码(4)-----智力题的解法
2010-09-08 10:43 1871以下智力题摘自某一帖子。在纸上画了一下之后有了答案。出于职业敏 ... -
告诉你什么是优雅的代码(3)------山寨拼音分词
2010-09-06 16:27 4500早上看见一帖《拼音语法检查》,感觉比较啰嗦,也比较低效。于是自 ... -
用hibernate也能玩出jdbc的感觉
2010-09-03 15:20 1383相信大家都看了那篇《用jdbc也能玩出hibernate的 ...
相关推荐
#资源达人分享计划#
ICE中间件技术研究 引言 当前,随着计算机网络的规模不断扩大,复杂性不断增加,异构也越来越多。一个网络 往往由若干个大大小小的子网组成,它们分别运用不同的网络技术,涵盖了不同厂家、公司 的网络设备和通信...
#资源达人分享计划#
基于ICE中间件的文件传输方法的设计与实现,李琦,陈伟,石油,电力,银行等行业是国家的国民经济的重要部门,其系统组织结构复杂,部门繁多。要维持整个系统的高效准确的运行,必须对很
中间件Ice中消息服务的技术研究及改进中间件Ice中消息服务的技术研究及改进中间件Ice中消息服务的技术研究及改进
#资源达人分享计划#
简介了IEC61970标准及国内外研究现状,初步研究了标准中的组件接1:7规范CIS(Component Interface Specification)、组件技术和因特网通信引擎Ice(Internet communications engine)的特点,阐述了组件接1:7规范中最...
ICE(Internet Communications Engine)是一个为现实中程序员而写的中间件平 台。作为一个高性能的互联网通信平台,ICE包含了很多分层的服务和插件 (Plug-ins),并且简单、高效和强大。
应用分层架构和面向服务的软件开发思想,采用ICE中间件的网络通信技术,使用XML格式作为数据交换模式,研究并实现C/S(Client/Server)架构的灵活、友好、高效的遥感数据集群处理作业调度管理系统。
ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,源码供大家研究使用。
研究了基于Ice中间件的MAS开发方法,采用COM技术构建了具有二进制重用性的Agent组件,可实现对原有系统的重用;实现了MAS与专家系统、神经网络和模糊控制技术的融合;开发了新型干法水泥生产过程控制MAS,实现了水泥...
基于ICE中间件的卫星地面测试系统充分利用ICE中间件分布式、跨平台和跨语言的特点,采用客户端/服务器构架,实现了卫星测试业务软件部分的各项功能,提供对系统运行状态的全面监控。提出了一种Android平台客户端解决...
M-ICE是基于主机的模块化入侵检测框架。 它用作中间件来缩小IDS研究与IDS开发之间的差距。 M-ICE由各个部分组成,可以通过网络或进程间通信将其连接在一起