1. IceBox与IceGrid集成
IceGrid可以很容易地配置IceBox服务端的一个或多个服务。
2. 部署一个IceBox服务端
IceBox服务端与其他服务端有许多相同的特性,但是它的特殊要求需要一个新的描述符。与其他服务端不同,IceBox服务端通常承载多个独立服务,每个服务都需要自己的communicator实例和配置文件。
例如,以下应用程序将部署包含一个服务的IceBox服务器:
<icegrid>
<application name="IceBoxDemo">
<node name="Node">
<icebox id="IceBoxServer" exe="/opt/Ice/bin/icebox" activation="on-demand">
<service name="ServiceA" entry="servicea:create">
<adapter name="${service}" endpoints="tcp"/>
</service>
</icebox>
</node>
</application>
</icegrid>
它看起来像一个服务端描述符。最大的区别就是服务描述符,它的构造很像一个服务端,所以你可以声明它的属性,如对象适配器和配置属性。服务的顺序决定了IceBox服务器加载的顺序。
适配器中name
属性的值需要额外的解释。符号service
是IceGrid保留的名称之一。在服务描述符的上下文中,${service}
被替换为服务的名称,因此对象适配器也被命名为ServiceA
。
3. 服务模版
如果你熟悉普通的模版,IceBox服务模板就很容易理解:
<icegrid>
<application name="IceBoxApp">
<service-template id="ServiceTemplate">
<parameter name="name"/>
<service name="${name}" entry="DemoService:create">
<adapter name="${service}" endpoints="default"/>
<property name="${service}.Identity" value="${server}-${service}"/>
</service>
</service-template>
<node name="Node1">
<icebox id="IceBoxServer" endpoints="default"
exe="/opt/Ice/bin/icebox" activation="on-demand">
<service-instance template="ServiceTemplate" name="Service1"/>
</icebox>
</node>
</application>
</icegrid>
在这个应用程序中,一个IceBox服务端部署在一个节点上,并且有一个从服务模板实例化的服务。特别有趣的是property
描述符,它使用另一个保留名称server
来形成属性值。当模板被服务实例描述符实例化时,符号${server}
被替换为封闭服务端的名称,所以属性定义展开如下:
Service1.Identity=IceBoxServer-Service1
与服务端实例一样,你可以在不修改模板的情况下,为服务实例指定其他属性。这些属性可以在service-instance
元素中定义,如下所示:
<icegrid>
<application name="IceBoxApp">
...
<node name="Node1">
<icebox id="IceBoxServer"endpoints="default"
exe="/opt/Ice/bin/icebox" activation="on-demand">
<service-instance template="ServiceTemplate" name="Service1">
<properties>
<property name="Ice.Trace.Network" value="1"/>
</properties>
</service-instance>
</icebox>
</node>
</application>
</icegrid>
4. 高级服务模版
更复杂的模板使用,涉及在服务端模板中实例化服务模板:
<icegrid>
<application name="IceBoxApp">
<service-template id="ServiceTemplate">
<parameter name="name"/>
<service name="${name}" entry="DemoService:create">
<adapter name="${service}" endpoints="default"/>
<property name="${name}.Identity" value="${server}-${name}"/>
</service>
</service-template>
<server-template id="ServerTemplate">
<parameter name="id"/>
<icebox id="${id}" endpoints="default"
exe="/opt/Ice/bin/icebox" activation="on-demand">
<service-instance template="ServiceTemplate" name="Service1"/>
</icebox>
</server-template>
<node name="Node1">
<server-instance template="ServerTemplate" id="IceBoxServer"/>
</node>
</application>
</icegrid>
这个应用程序相当于我们服务模板的第一个例子。但是,现在,在多个节点上部署相同的服务端的过程变得更加简单。
如果你需要自定义特定服务实例的配置,那么,你的服务端实例可以定义仅适用于所需服务的属性集:
<icegrid>
<application name="IceBoxApp">
<node name="Node1">
<server-instance template="ServerTemplate" id="IceBoxServer">
<properties service="Service1">
<property name="Ice.Trace.Network" value="1"/>
</properties>
</server-instance>
</node>
</application>
</icegrid>
如本例所示,属性集的service
属性表示目标服务的名称。