IceGrid域由注册表和任意数量的节点组成。 注册表和节点一起合作,来管理组成应用程序的信息和服务端进程。每个应用程序指定服务器端到某个节点。注册表维护这些信息的持久记录,而节点负责启动和监视他们分配的服务端进程。 在典型的配置中,每台运行Ice服务端的计算机上运行一个节点。注册表消耗很少的处理器时间,所以它通常与节点在同一台计算机上运行; 实际上,如果需要,注册表和节点可以运行在相同的进程中。 如果需有容错要求,则注册表要支持使用主从设计进行复制。
1. 一个简单IceGrid应用程序的体系结构
举个例子,这个插图展示了一个在三台电脑上,运行非常简单的IceGrid应用程序。注册表是主机PC1上唯一的进程,而节点则运行在主机PC2和PC3上。 在这个示例应用程序中,Server X和Server Y已被分配给每个节点。

从客户端应用程序的角度来看,注册表的主要职责是将间接代理解析为Ice位置服务。因此,这种做法在很大程度上是透明的:客户端首次尝试使用间接代理时,客户端中的Ice运行时会联系注册表,将代理的符号信息转换为允许客户端建立连接的端点。
虽然注册表可能听起来不过是一个简单的查询表,但现实却完全不同。例如,在幕后,定位请求可能会提示节点自动启动目标服务端,或者注册表可能会根据每台计算机的负载统计信息选择适当的端点。
这也说明了间接代理的好处:定位服务可以提供大量的功能,而不需要客户做任何特殊的操作,而且与直接代理不同,客户端不需要事先知道服务器的地址和端口。额外的间接操作为客户端首次使用代理服务器增加了一些延迟;然而,所有后续的交互直接发生在客户端和服务器之间,所以成本可以忽略不计。此外,间接方式允许服务器迁移到不同的计算机,而无需更新客户端持有的代理服务端。
2. IceGrid的服务端复制
IceGrid的灵活性允许各种各样的配置。 例如,假设我们有一个网格网络,并且要在每个刀片机上复制服务端,如下所示:

Ice中的复制基于对象适配器,而不是服务端。任何服务端中的任何对象适配器都可以参与复制,但是更有可能,所有复制对象适配器都是由每台计算机上运行的相同服务端可执行文件的实例创建的。我们在上面的示例中使用了这个配置,但是IceGrid要求每个服务端都有唯一的名字。Server 1和Server 2是同一个可执行文件的唯一名称。
当涉及到复制时,绑定过程的工作原理有所不同,因为注册表现在有多个对象适配器可供选择。IceGrid应用程序的描述会影响注册表关于使用哪个对象适配器(或对象适配器)的决定。例如,注册表可以考虑每台计算机的系统负载(由节点定期报告),并以最低的负载返回计算机上对象适配器的端点。注册表也可以组合几个对象适配器的端点,在这种情况下,客户端的Ice运行时将选择初始连接尝试的端点。
3. 部署一个IceGrid应用程序
在IceGrid中,部署是向注册表描述应用程序的过程。 此说明包含以下信息:
- 副本组
副本组是复制对象适配器集合的术语。应用程序可以创建任意数量的副本组。每个组需要一个唯一的标识符。
- 节点
应用程序必须将它的服务端分配给一个或多个节点。
- 服务器端
服务端的描述包括一个唯一的名称和可执行文件的路径。它还列出了它创建的对象适配器。
- 对象适配器
有关对象适配器的信息包括它的端点以及它所公布的任何知名对象。如果对象适配器是副本组的成员,则它也必须提供该组的标识符。
- 对象
一个知名对象是一个只能通过ID找到的对象。注册表维护一个在定位请求期间使用对象的全局列表。
IceGrid使用描述符,来作为应用程序和它组件描述的参考;部署应用程序涉及在注册表中创建其描述符。有几种方法可以实现这一点:
- 你可以使用命令行工具,读取包含描述符的XML表示的文件。
- 你可以使用图形管理工具,以交互方式创建描述符。
- 你可以通过IceGrid的管理界面,以编程方式创建描述符。
注册表服务端必须正在运行才能部署应用程序,但节点不必处于活动状态。部署后启动的节点会自动从注册表中检索他们需要的信息。一旦部署,你可以随时更新应用程序。