IceGrid作用
IceGrid服务负责定位和启动Ice应用程序
定位服务(Location service)
间接的绑定服务端和客户端,提高应用程序的灵活性和适应需求变化的弹性
按需启动服务(On-demand server activation)
对于配置的节点(node)无需启动,在客户端向iceGrid请求一个服务代理时,icegrid发现这个服务存在但没有被启动,
会激活这个adapter所属的server或者让这个adapter向其注册。这个过程对于客户端来说是透明的
IceGrid服务提供的功能
应用程序部署(Application distribution)
方便的配置IcePath2服务,提供了各个分布服务器上的部署功能,能够帮你保持必要的程序和文件的同步。
复制和负载平衡( Replication and load balance )
提供'一种服务'的'多台服务器'的'服务'组成一个逻辑上的组,当客户端使用间接绑定的时候,可以获得他们任意一个的代理。
IceGrid同时监控着每一个服务器的系统负载,根据负载来给客户端分配代理。
Session和资源分配(Session&resource allocation)
客户端可以建立一个session来独占某个对象或者代理甚至服务器。IceGrid会阻止其他的客户端使用这个分配的资源,直到客户
端释放它。
错误规避
当有多个传输端点(endpoint)时,ice在建立连接失败的情况下会多次尝试连接下一个负载最小的传输端点。
动态查找
你可以在客户端通过查找的方式,查找所有的代理端口信息,并由你决定使用那个代理。
状态监测
提供监控接口,你可以使用监控接口来整合你现有的监控系统。
管理
提供了命令行方式和图形化方式管理你的应用
IceGrid Architecture
IceGrid服务的架构
一个IceGrid域由一个注册表(Registry)和任何数目的节点(Node)构成。注册表(Registry)和节点(Node)一起合作管理一些信息以及包含一些应用(Application)的服务进程。
- 从客户端应用程序的角度来看,注册表(Registry)的主要责任,是解决作为Ice定位服务的间接代理问题。因此,这方面的作用是非常明显的:当客户端第一次尝试使用一种间接代理,客户端的Ice run time连接注册表(registry)并且将代理的符号信息转化为endpoint,允许客户端建立一个连接。.
- 尽管注册表(registry)可能会听起来像只不过是一个简单的查找表,但现实情况是完全不同的。
- 举例来说,在幕后,一个定位请求可能提示一个节点(Node)自动启动目标服务,或Registry可能会根据每台电脑的负荷统计选择适当的 endpoint.
- 这也说明了间接代理(Indirect Proxies)的好处:位置服务可以提供大量没有任何特定客户端动作的功能,Client并不需要更多服务器的地址和端口信息。
- 只是间接代理(Indirect Proxies)在客户的第一使用代理时增加了一些延迟,不过,以后所有的相互作用发生在直接客户端和服务器之间,所以成本是微不足道的。此外,间接允许服务器迁移到不同的计算机上,而不需要更新客户(Client)所持有的代理(Proxies).
Ice中的复制是基于对象适配器(Object Adapters)的,而不是服务。
在任何服务上的任何对象适配器都可以参与复制,但它是迄今为止更可能是所有被复制的对象适配器被建立在同一个可执行的服务上,而这个服务运行在每台计算机上。但IceGrid要求每个服务有一个独特的名称,Server1和Server2是我们特定的名称。
当复制被涉及时,这个绑定过程的工作大不一样,由于注册表(Registry)现在有多个对象适配器(Object Adapter)的选择。IceGrid应用的描述驱动着注册表(Registry)的决定哪些对象适配器使用。举例来说,注册表可以考虑每一台计算机系统负载(作为定期报告的节点)和返回最低负荷计算机的对象适配器的Endpoint。它也有可能为注册表(Registry)结合多个对象适配器的Endpoint,在这种情况下,客户端的Ice run time将选择一个Endpoint尝试初始连接。
IceGrid服务的运行
1. 启动Registry服务
icegridregistry --Ice.Config=config.registry
2.配置Registry信息
icegridadmin --Ice.Config=config.admin -u=user -p=password -e "application add -n 'application.xml'“
3. 启动Node
icegridnode --Ice.Config=config.node
config.registry文件,至少包含以下属性
- IceGrid.InstanceName:Registry服务的名称
- 地址设置
IceGrid.Registry.Client.Endpoints:IceGrid客户端连接的地址,必须是固定端口(4061端口,IANA注册端口)
IceGrid.Registry.Server.Endpoints:服务端Object Adapter的注册端口地址
IceGrid.Registry.Internal.Endpoints:IceGridNode、Registry复制和Registry之间通信使用的地址
IceGrid.Registry.Data:Registry数据库的存放目录 - 权限和验证控制的proxy设置
IceGrid.Registry.PermissionsVerifier:验证每个新的客户端连接。
IceGrid.Registry.AdminPermissionsVerifier:验证Icegridadmin连接
IceGrid.Registry.SSLPermissionsVerifier:验证每个新客户端的SSL连接
IceGrid.Registry.AdminSSLPermissionsVerifier:验证icegridadmin的SSL连接 - 密码设置
IceGridAdmin.Username,IceGridAdmin.Password
config.admin文件,包含以下属性
- Ice.Default.Locator:iceregistry的Client地址
- 账户密码
IceGridAdmin.Username,IceGridAdmin.Password
IceGrid负载平衡
- Random
随机负载平衡,只考虑object adapter的个数,不考虑当前操作系统的负载情况- Adaptive
自适应模式,通过系统负载信息来选择object adapter- Round Robin
该模式复制最近使用的object adapter,同样不考虑系统负载。每个registry复制独立收集最近使用的object adapter信息- Ordered
通过adapter的priority字段设置的优先级来考虑负载平衡
服务的启动方式
server和service(icebox)具有以下启动方式
- manual
必须使用IceGridGUI或icegridadmin工具启动服务- always
Icegridnode启动时启动服务,当服务停止时,icegridnode会负责再次开启服务- on demand
当调用该服务的一个接口时,icegridnode启动该服务- Session
通过session来定位服务时,icegridnode启动该服务
集成IceBox
Icegrid可以通过简单的配置来添加一个包含一个或多个服务的icebox服务。
<icegrid>
<application name="IceBoxDemo">
<node name="Node">
<icebox id="IceBoxServer“ exe="/bin/icebox"
activation="on-demand">
<service name=“Service” entry="serv:create">
<adapter name="${service}" endpoints="tcp"/>
</service>
</icebox>
</node>
</application>
</icegrid>
Registry复制
Registry也可以部署为主从服务的模式,相当于热备的模式,当发生当机时,会自动指向另外一台机器的服务,这个过程对于客户端而言是透明的。
在启动复制registry时,配置文件和主registry配置文件的区别
1) 需要指定主registry的地址
Ice.Default.Locator=DemoIceGrid/Locator:default -p 12000
2) 需要添加一个复制registry的名字(ReplicaName具有唯一性)
IceGrid.Registry.ReplicaName=Replica1
3)不需要设置InstanceName属性
IceGrid 模板
用来创建相同或类似server或service的定义,类似于编程语言中的函数。
<application name="Ripper">
<server-template id="EncoderServerTemplate">
<parameter name="index"/>
<server id="EncoderServer${index}" exe="/bin/server"
activation="on-demand">
<adapter name="EncoderAdapter" 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>
Object Adapter复制
相当于为Object提供一个模板的方式,可以方便的让server/service生成一个Object
<icegrid>
<application name="ReplicaApp">
<replica-group id="ReplicatedAdapter">
<object identity="TheObject"
type="::Demo::ObjectType"/>
</replica-group>
<node name="Node">
<server id="ReplicaServer" activation="on-demand"exe="/bin/server">
<adapter name="TheAdapter" endpoints="default“ replica-group="ReplicatedAdapter"/>
</server>
</node>
</application>
</icegrid>
IceGrid服务的部署
服务的部署信息(XML结构描述)
<icegrid>
<application>
<service-template> ….
<server-template> …
<replica-group> ….
<properties> ….
<node> ….
主要分为五大块内容:
Service Template:IceBox服务的模板
Server Template:服务的模板
Replica Group:复制的模板
Properties Set:属性集合
Node:结点定义