Ice 是 网络通信引擎 Internet Communications Engine 的简称,是ZeroC开发的一个面向对象的中间件平台。它提供了面向对象的远程过程调用、网格计算和发布/订阅功能,并有基于GPL的双许可协议和一个私有许可协议。它支持Linux、Solaris、Windows和Mac OS X等最主要的操作系统,和C++、Java、.NET语言(如C#或Visual Basic)、Objective-C、Python、PHP和Ruby等语言。
怎么样看node1和node2是否已经注册呢?
输入以下命令启动IceGridAdmin:
icegridadmin –Ice.config=D:MyIceGridconfig.grid
icegridregistry --Ice.Config=config.grid
2)注册节点
192.168.10.4机器:
icegridnode --Ice.Config=config.node4
192.168.10.6机器:
icegridnode --Ice.Config=config.node6
从窗口上能看出来建立的IceGrid使用的Ice版本为3.2。
在这里输入node list可以看到目前注册了的结点:node1和node2。
实施完以上步骤,我们的简单IceGrid就建立好了。当你在运行有node2的计算机上使用IceGridAdmin进要求输入用户名和密码,这个东西在IceGrid的配置文件congfig.grid的最后面。
/************************************************************************/
<icegrid>
<application name="Simple">
<node name="node4">
<server id="SimpleServer" exe="./server" activation="on-demand">
<adapter name="Hello" endpoints="tcp" register-process="true">
<object identity="hello" type="::Demo::Hello" property="Identity"/>
</adapter>
</server>
</node>
<node name="node6">
<server id="SimpleServer2" exe="./server" activation="on-demand">
<adapter name="Hello" endpoints="tcp" register-process="true">
<object identity="hello2" type="::Demo::Hello" property="Identity"/>
</adapter>
</server>
</node>
</application>
</icegrid>
/************************************************************************/
说明:该文件主要配置节点和具体服务.主要配置node name和server id(注意不要重复)即可。
2.6.1 分布式部署
在部署IceGrid分布式服务时,需要启动注册表服务(icegridregistry),并配置注册表服务地址端口、通信协议和注册信息保存的目录地址(ICE的注册信息保存为BerkeleyDB的数据库文件):
IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Data=/opt/ripper/registry
在服务器节点中和客户端都需要配置注册表服务的地址端口和通信协议:
Ice.Default.Locator=IceGrid/Locator:tcp -h 172.0.0.1 -p 4061
然后分别启动注册表服务(icegridregistry)和节点服务(icegridnode).
ICE提供了部署工具icegridadmin, 这个icegridadmin工具也需要定义Ice.Default.Locator属性.
接下需要编写应用部署文件,应用部署文件以XML方式保存。以下为支持适配器复制的应用配置文件,使用了服务模板:
<icegrid>
<application name="Ripper">
<replica-group id="EncoderAdapters"> //定义适配器复制组
<object identity="EncoderFactory" //identity将在客户端中使用。
type="::Ripper::MP3EncoderFactory"/>
</replica-group>
<server-template id="EncoderServerTemplate"> //定义服务器模板
<parameter name="index"/>
<parameter name="exepath"
default="/opt/ripper/bin/server"/>
<server id="EncoderServer${index}"
exe="${exepath}"
activation="on-demand">
<adapter name="EncoderAdapter"
replica-group="EncoderAdapters"
endpoints="tcp"/>
</server>
</server-template>
<node name="Node1">
<server-instance template="EncoderServerTemplate"
index="1"/>
</node>
<node name="Node2">
<server-instance template="EncoderServerTemplate"
index="2"/>
</node>
</application>
</icegrid>
----------------------------------------------------------------------Ice的组件包括面向对象的远程对象调用、响应(replication还是复制?)、网格计算、故障转移、负载均衡、防火墙穿越和发布-订阅服务。为了访问这些服务,应用程序被连接到一个存根库或集合,该存根库或集合产生于一个语言无关的叫做slice的类IDL语法。
IceStorm
是一个面向对象的发布和订阅框架,它还支持联盟(federation)和服务质量(quality-of-service)。不同于其它的发布-订阅框架如TIBCO软件公司的Rendezvous或SmartSockets,它的消息内容是由定义良好的类的对象组成的,而不是由结构化文本组成的。
IceGrid
是一套框架,它提供面向对象的负载均衡、故障转移、对象发现和注册服务。
IcePatch
协助部署基于ICE的软件。例如,希望部署新功能和/或补丁到多台服务器的用户可以使用IcePatch。
Glacier
是一个基于代理的能够穿越防火墙的服务,因此使得ICE成为一个因特网通讯引擎。
IceBox
是一个面向服务架构的容器,它包含可执行的由.dll或.so库实现的服务。这是一个更轻量的选择,可以对每个服务构建整个可执行服务。 2
Slice
Ice规范语言(Specification Language for Ice)是一个Zeroc私有的文件格式,程序员按照它来编辑独立于计算机语言的声明和类、接口、结构和枚举的定义。Slice定义文件被用来作为存根生成过程的输入。存根依次被连接到应用程序和服务器,它们应该基于由slice声明/定义的接口和类进行互相通讯。
不同于CORBA,这里的类和接口还支持继承和抽象类。此外,slice还在宏和属性的表单中提供配置选项来管理代码生成过程。一个例子是,指令可以生成STL模板list<double>
,而不是默认地生成STL模板vector<double>
。
ICE平台内嵌负载均衡功能,对于分布大多个节点上的应用服务提供多种负载均衡方案,只需要通过XML配置文件即可完成负载均衡配置。配置项包括Type (负载均衡类型)、Sampling interval(负载信息收集间隙)、Number of replicas(返回给客户端的适配器个数)。
负载均衡类型有以下4种方式:
Random (随机方式):注册中心随机选择一个适配器给客户端,不检查适配器的负载。
Adaptive(适配方式):注册中心从所有适配器中选择一个负载最轻的适配器给客户端,Sampling interval参数只有在该类型的负载均衡中有效,这个参数指定节点定期向注册中心报告本地系统负载信息(system load information);
Round Robin(最近最少使用):注册中心从对应的适配器组中选择一个最近最少使用的适配器给客户。
Ordered(顺序方式):注册中心根据适配器的优先级,从高到低顺序选择一个适配器给客户端。