1、IceGrid应用配置手册 IceGrid应用 配置手册 V 2.1 中诚信资讯科技有限公司 目录 1. 概述 3 1.1 配置目标 3 1.2 实验环境 3 1.3 局限 3 2. 配置过程 3 2.1 服务器端配置 3 2.1.1 主注册服务配置 5 2.1.2 从注册服务配置 7 2.1.3 应用部署配置 10 2.1.4 节点配置 13 2.2 客户端配置 14 3. 结果验证 14 3.1 程序方式 14 3.2
2、工具方式 14 4. 高级应用配置 20 4.1 集成IceBox 20 4.1.1 IceBox服务程序编写 20 4.1.2 IceGrid集成IceBox服务 21 4.1.3 测试验证 25 4.2 集成IcePatch2 27 1. 概述 1.1 配置目标 本文档是描述Ice中间件中的IceGrid服务的应用配置,通过使用IceGrid服务来实现: 1. 服务器端服务分布式部署。 2. 服务器端服务按需激活。 3. 服务器端服务多节点负载均衡。 4. 注册服务主/从热备(Master/Slaves) 5. 集成IceBox服
3、务 1.2 实验环境 1. 硬件:hp服务器,3台 2. 操作环境:Red Hat 5 3. 服务器程序:ServerApp.jar 4. 说明:实际应用中,服务器节点可任意扩充、操作系统可被更换、服务器程序可用实际项目的服务程序替换,本文档所描述的配置方式具有通用性,适用但不局限于当前实验环境。 1.3 局限 本文档不详细描述IceGrid服务的运行机制和实现原理,不详细介绍服务器端和客户端程序的实现,主要描述IceGrid服务应用的配置步骤、主要配置项及验证配置结果等。 2. 配置过程 2.1 服务器端配置 配置步骤: 1. 创建主注册服务(Master)的配置文
4、件config_master.grid,文件名称可以任意 2. 创建从注册服务(Slave)的配置文件 config_slave.grid, 文件名称可以任意 3. 创建各节点服务的配置文件config.node,文件名称可以任意 4. 创建分布式应用配置文件app.xml,文件名称可以任意,但格式最好定义成xml 5. 运行Ice提供的工具,启动我们的分布式应用,主要有如下两个工具:icegridnode和icegridadmin。详细启动过程如下: 1) icegridnode --Ice.Config=config_master.grid 启动主注册服务 2) icegr
5、idnode --Ice.Config=config_slave.grid 启动从注册服务 3) icegridadmin --Ice.Config= config_master.grid -e "application add app.xml" 部署分布式服务 icegridadmin --Ice.Config= config_master.grid -e "application update app.xml" 重新部署分布式服务 4) icegridnode --Ice.Config=config.node 将各节点注册到注册服务的注册表中 配置文件清单: 假设有n
6、个节点(n > 0), 其中从注册服务有x个,(x > 0) config_master.grid ---------- 主注册服务配置文件 --------- 1份 config_slave.grid ----------- 从注册服务配置文件 --------- x份 config.node ----------------- 节点配置文件 -------------- n份 app.xml ---------------------- 部署配置文件 -------------- 1份 通常情况下,由于注册服务占用资源很少,所以一
7、般都会和一个节点集成在一起,并且可以和节点服务在一个进程中运行。因此,如果假设服务部署到n个服务器,通常情况下配置文件清单如下: config_master.grid -- 主注册服务配置文件 -- 1份 -- 主注册服务信息+节点信息 config_slave.grid --- 从注册服务配置文件 -- x份 -- 从注册服务信息+节点信息 config.node --------- 节点配置文件 ---- n-1-x份 -- 节点信息 app.xml ------------- 部署配置文件 -------- 1份 -- 部署信息 其中app.xml要和config_ma
8、ster.grid放在一台服务器上,下面的各章节将详细介绍各配置文件。 2.1.1 主注册服务配置 config_master.grid的内容: # # The IceGrid Instance Name # IceGrid.InstanceName=IceGridRDDataSource # 1 # # The IceGrid locator proxy. # Ice.Default.Locator=IceGridRDDataSource/Locator:default -h 10.0.5.201 -p 12000:default -h 10.0.5.20
9、2 -p 12000 #2 # # IceGrid registry configuration. # IceGrid.Registry.Client.Endpoints=default -p 12000 #3 IceGrid.Registry.Server.Endpoints=default #4 IceGrid.Registry.Internal.Endpoints=default #5 IceGrid.Registry.Data=master #6 IceGrid.Registry.PermissionsVerifier=IceGridRDDataSo
10、urce/NullPermissionsVerifier #7 IceGrid.Registry.AdminPermissionsVerifier=IceGridRDDataSource/NullPermissionsVerifier#8 IceGrid.Registry.SSLPermissionsVerifier=IceGridRDDataSource/NullSSLPermissionsVerifier#9 IceGrid.Registry.AdminSSLPermissionsVerifier=IceGridRDDataSource/NullSSLPermissionsV
11、erifier #10 # # IceGrid SQL configuration if using SQL database. # #Ice.Plugin.DB=IceGridSqlDB:createSqlDB #11 #IceGrid.SQL.DatabaseType=QSQLITE #12 #IceGrid.SQL.DatabaseName=register/Registry.db #13 # # #Ice Error and Standard output Set # #Ice.StdErr=master/stderr.txt #14 #I
12、ce.StdOut= master /stdout.txt #15 # #Trace Registry properties # Ice.ProgramName=Master #16 IceGrid.Registry.Trace.Node=3 #17 IceGrid.Registry.Trace.Replica=3 #18 # # IceGrid node configuration. # IceGrid.Node.Name=node_1 #19 IceGrid.Node.Endpoints=default #20 IceGrid.Node.
13、Data=node_1 #21 IceGrid.Node.CollocateRegistry=1 #22 #IceGrid.Node.Output=node_1 #23 #IceGrid.Node.RedirectErrToOut=1 #24 # Trace properties. # IceGrid.Node.Trace.Activator=1 #25 #IceGrid.Node.Trace.Adapter=2 #26 #IceGrid.Node
14、Trace.Server=3 #27 # # Dummy username and password for icegridadmin. # IceGridAdmin.Username=mygrid #28 IceGridAdmin.Password=mygrid #29 配置项说明: # 1 为这个应用实例指定一个唯一的标识 # 2 注册服务的端点信息(主注册服务和所有的从注册服务),节点注册时要用到 # 3 客户端访问注册服务器的端点信息 # 4 服务访问注册服务
15、器的端点信息,通常是default # 5 内部访问端点信息,通常是default,节点用这个端口和注册服务通信 # 6 注册服务的数据目录的路径 # 7 设定防火墙安全代理,从而控制客户端访问注册表时可用的权限 # 8 设定防火墙安全代理,从而控制注册表管理者可用的权限 # 9 设定SSL安全代理,从而设定客户端访问注册表时的SSL安全访问机制 # 10 设定SSL安全代理,从而设定注册表管理者的SSL安全访问机制 # 11 指定Ice对象序列化的机制,如果不设置,默认用Freeze机制 # 12 指定使用数据库
16、的类型 # 13 指定使用数据库的名称 # 14 指定标准错误输出文件 # 15 指定标准输出文件 # 16 指定主注册服务的名称 # 17 指定主注册服务跟踪节点信息的级别(0~3),默认为0 # 18 指定主/从热备注册服务的跟踪级别(0~3),默认为0 # 19 定义节点的名称,必须唯一 # 20 节点被访问的端口信息,注册服务使用这个端点和节点通信,通常设为default # 21 节点的数据目录的路径 # 22 定义节点是否和注册服务并置在一起,设为1时并置,设为0时不并置 #
17、 23 节点标准输出信息重定向蹈的目录路径,会自动生成输出文件 # 24 节点上的服务程序的标准错误重定向到标准输出 # 25 激活器跟踪级别,通常有0,1,2,3级,默认是0 # 26 对象适配器跟踪级别,通常有0,1,2,3级,默认是0 # 27 服务跟踪级别,通常有0,1,2,3级,默认是0 # 28 IceGrid管理器登录该应用的用户名 # 29 IceGrid管理器登录该应用的密码 未涉及的属性还有一些,如果需要请参考官方文档。 2.1.2 从注册服务配置 config_slave.grid的内容:
18、 # The IceGrid locator proxy. # Ice.Default.Locator=IceGridRDDataSource/Locator:default -h 10.0.2.241 -p 12000:default -h 10.0.2.242 -p 12000 #1 # # IceGrid registry configuration. # IceGrid.Registry.Client.Endpoints=default -p 12000 #2 IceGrid.Registry.Server.Endpoints=default #3
19、IceGrid.Registry.Internal.Endpoints=default #4 IceGrid.Registry.Data=slave_1 #5 IceGrid.Registry.ReplicaName=slave_1 #6 IceGrid.Registry.PermissionsVerifier=IceGridRDDataSource/NullPermissionsVerifier #7 IceGrid.Registry.AdminPermissionsVerifier=IceGridRDDataSource/NullPermissionsVerifie
20、r#8 IceGrid.Registry.SSLPermissionsVerifier=IceGridRDDataSource/NullSSLPermissionsVerifier#9 IceGrid.Registry.AdminSSLPermissionsVerifier=IceGridRDDataSource/NullSSLPermissionsVerifier #10 # # IceGrid SQL configuration if using SQL database. # #Ice.Plugin.DB=IceGridSqlDB:createSqlDB #11
21、 #IceGrid.SQL.DatabaseType=QSQLITE #12 #IceGrid.SQL.DatabaseName=register/Registry.db #13 # # #Ice Error and Standard output Set # #Ice.StdErr=slave_1/stderr.txt #14 #Ice.StdOut=slave_1 /stdout.txt #15 # #Trace Registry properties # Ice.ProgramName=Slave_1 #16 IceGrid.Registry.Tra
22、ce.Node=3 #17 IceGrid.Registry.Trace.Replica=3 #18 # # IceGrid node configuration. # IceGrid.Node.Name=node_2 #19 IceGrid.Node.Endpoints=default #20 IceGrid.Node.Data=node_2 #21 IceGrid.Node.CollocateRegistry=1 #22 #IceGrid.Node.Output=node_2 #23
23、IceGrid.Node.RedirectErrToOut=1 #24 # Trace properties. # IceGrid.Node.Trace.Activator=1 #25 #IceGrid.Node.Trace.Adapter=2 #26 #IceGrid.Node.Trace.Server=3 #27 # # Dummy username and password for icegridadmin. # IceGridAdmin.Username=mygrid
24、 #28 IceGridAdmin.Password=mygrid #29 配置项说明: 其实这个文件和主注册配置文件基本一样,差别只有一点: 1. 没有指定应用实例名,因为在主注册服务中已经有了定义 2. 多了第6行,IceGrid.Registry.ReplicaName=slave_1,指定从注册服务的名称 其它的基本就没有差别了,大部分属性项在config_master.grid里面都有定义,为了方便阅读,下面也将用到的各项给出说明: # 1 注册服务的端点信息(主注册服务和所有的从注册服务),节点注册时要用到
25、 2 客户端访问注册服务器的端点信息 # 3 服务访问注册服务器的端点信息,通常是default #4 内部访问端点信息,通常是default,节点用这个端口和注册服务通信 # 5 注册服务的数据目录的路径 # 6 指定从注册服务的名称 # 7 设定防火墙安全代理,从而控制客户端访问注册表时可用的权限 #8 设定防火墙安全代理,从而控制注册表管理者可用的权限 # 9 设定SSL安全代理,从而设定客户端访问注册表时的SSL安全访问机制 #10 设定SSL安全代理,从而设定注册表管理者的SSL安全访问机制
26、 11 指定Ice对象序列化的机制,如果不设置,默认用Freeze机制 # 12 指定使用数据库的类型 # 13 指定使用数据库的名称 # 14 指定标准错误输出文件 # 15 指定标准输出文件 # 16 指定从注册服务运行时程序名称 # 17 指定从注册服务跟踪节点信息的级别(0~3),默认为0 # 18 指定主/从热备注册服务的跟踪级别(0~3),默认为0 # 19 定义节点的名称,必须唯一 # 20 节点被访问的端口信息,注册服务使用这个端点和节点通信,通常设为default # 21
27、 节点的数据目录的路径 # 22 定义节点是否和注册服务并置在一起,设为1时并置,设为0时不并置 # 23 节点标准输出信息重定向蹈的目录路径,会自动生成输出文件 # 24 节点上的服务程序的标准错误重定向到标准输出 # 25 激活器跟踪级别,通常有0,1,2,3级,默认是0 # 26 对象适配器跟踪级别,通常有0,1,2,3级,默认是0 # 27 服务跟踪级别,通常有0,1,2,3级,默认是0 # 28 IceGrid管理器登录该应用的用户名 # 29 IceGrid管理器登录该应用的密码 2.1.3 应用部
28、署配置
app.xml配置文件内容:
1
31、
33、n> 33 配置文件结构分析: IceGrid里,部署是一个在注册服务中表述一个应用(Application)的过程,而部署配置文件就是来描述这些配置信息的文件,这个配置文件是用xml标记性语言来描述的。通常一个部署应该包含如下信息: 1. 应用标签(application),name属性定义这个应用的名字 2. 服务(server), 一个逻辑上的服务器,能够通过exe命令而启动的一个服务程序。activation属性,是设置服务的启动方式,on-demand是最常用的方式,另外还有always等启动方式;option标签是exe执行命令命令行的参数; 3
34、 适配器(adpter),定义服务器端的适配器。 name属性唯一标志这个适配器; endpoints属性指定端点信息; replica-group属性标示该适配器是个可复制组集群,并指定这个可复制组的名称; register-process属性定义了是否这个节点是否可以被icegrid关闭; 4. 节点(node),它应该代表了一个物理上的节点。 name属性指定节点的名字,并且是唯一的。 5. 可复制组(replica-group),一组对象适配器的集合。 id属性唯一标识一个可复制组; load-balancing子项中type属性指定负载均衡策略,icegrid提供
35、了四种负载均衡策略: Random (随机方式) Adaptive(适配方式) Round Robin(最近最少使用) Ordered(顺序方式) object子项定义适配器绑定的服务对象信息。其中identity属性指定对象的标识,type属性指定了对象的层次结构类型。这两个属性都可以唯一的标识一个服务对象。 6. 服务模板(server-temple),服务模板是对服务的一个抽象,避免了重复定义。这样,在节点中描述服务时只需要实例化它的服务模板就可以了。 id属性唯一标识一个服务模板; parameter子项定义服务模板的参数,可
36、包含多个,主要实例化服务时用; server子项就是上面2中的服务定义; 另外还有一些特殊的服务模板,比如:icebox服务模板,它的定义和通用的服务模板的定义不太一样。 解析app.xml文件: 通过对配置文件结构的分析,来解析一下app.xml。 第1行,标识这是一个icegrid的配置文件; 第2行,标识应用的名称为RTDSSystem,这个名称是唯一的; 第3~10行,定义了一个服务模板RTDSSystemServer,并有一个参数index; 其中5~9定义了这个模板包含的服务定义,第6行是这个服务包含的对象适配器 的定义
37、 第12~15行,是对可复制组的定义,包括服务对象的定义和负载均衡策略; 第17~21行,是对节点node_1的定义,指定了节点的名称,包含的服务(3个服务); 第22~26行,是对节点node_2的定义 第27~31行,是对节点node_3的定义 最后两行是闭合标签,至此一个icegrid的分布式部署配置文件就完成了。 部署配置文件的扩展: app.xml中对服务模板、适配器、服务对象等的配置都是一个,事实上这些可以在文件中定义多个,比如可以有多个服务模板,一个服务里可以有多个适配器,可以有多个可复制组,一个节点里可以有多个不同类型的服务等。 另外,app.xml可以包
38、含其它的xml。 2.1.4 节点配置 config.grid文件的内容: # # The IceGrid locator proxy. # Ice.Default.Locator=IceGridRDDataSource/Locator:default -h 10.0.2.241 -p 12000:default -h 10.0.2.242 -p 12000 #1 # # IceGrid node configuration. # IceGrid.Node.Name=node_2 #2 IceGrid.Node.Endpoints=default #3 I
39、ceGrid.Node.Data=node_2 #4 IceGrid.Node.Output=node_2 #5 IceGrid.Node.RedirectErrToOut=1 #6 # Trace properties. # IceGrid.Node.Trace.Activator=1 #7 #IceGrid.Node.Trace.Adapter=2 #8 #IceGrid.Node.Trace.Server=3 #9 配置项说明: 事实上,这个文件里面的配置项,在config_sl
40、ave.grid中都有描述,但这里也列出来,方便阅读。 #1 注册服务的端点信息(主注册服务和所有的从注册服务),节点注册时要用到 #2 定义节点的名称,必须唯一 #3 节点被访问的端口信息,注册服务使用这个端点和节点通信,通常设为default #4 节点的数据目录的路径 #5 节点标准输出信息重定向的目录路径,会自动生成输出文件 #6 节点上的服务程序的标准错误重定向到标准输出 #7 激活器跟踪级别,通常有0,1,2,3级,默认是0 #8 对象适配器跟踪级别,通常有0,1,2,3级,默认是0 #9 服务跟踪级别,通常有0,1,2,3级,默
41、认是0 2.2 客户端配置 客户端的配置很简单,和分布式相关的配置就一项,添加如下: # # The IceGrid locator proxy. # Ice.Default.Locator=IceGridRDDataSource/Locator:default -h 10.0.2.241 -p 12000:default -h 10.0.2.242 -p 12000 #注册服务的端点信息(主注册服务和所有的从注册服务),用于定位 3. 结果验证 3.1 程序方式 1. 启动服务器 1) icegridnode --Ice.Config=config_master.gr
42、id 启动主注册服务和节点1 2) icegridnode --Ice.Config=config_slave.grid 启动从注册服务和节点2 3) icegridadmin --Ice.Config=config_master.grid -e "application add app.xml" 部署分布式服务 4) icegridnode --Ice.Config=config.node 启动节点3 2. 启动客户端,进行多次远程调用,根据执行情况就可以判断服务器端是否配置成功。 3.2 工具方式 用Ice官方提供的可视化管理工具IceGridGUI.jar来验证和
43、管理icegrid的部署。 1. 打开dos窗口,在命令行下进入C:\Program Files\ZeroC\Ice-3.4.1\bin目录下,然后运行“java –jar IceGridGUI.jar”,弹出IceGrid Admin的主界面,如下图所示: 图3.2.1主界面 2. 点击按钮File—>login,弹出登录对话框,输入用户名、密码,Ice Instance Name和ice Registry endpoint,点击“OK”按钮,就可以进入该部署的管理界面 图3.2.2 File菜单 图3.2.3 登陆窗口 图3.2.4 实时管理(服务已加载,但
44、未激活) 图3.2.5 实时管理(服务已激活) 3. 由图3.2.4和3.2.5可以看到,该应用部署的名字是IceGridRDDataSource,它进行了主/从注册服务的热备(Master/slave_1),当Master崩溃后,slave_1就会接收客户端的请求;同时该应用有三个节点(node_1,node_2,node_3),每个节点都分布了同一类服务,通过负载均衡的方式共同完成客户端的请求,其中node_1部署了三个,node_2和node_3分别部署了一个。 4. 注册服务(Master/Slave)可以通过该管理工具被关闭,在其上面点击右键,选取弹出的菜单项“shutdo
45、wn”。只要存在一个活动状态的注册服务,整个应用依然能够提供服务。由于该工具登陆时默认使用的是主注册服务(Master),所以,当关闭Master后管理界面将被关闭,如果想再次进入管理界面,需要重新登陆并选择slave注册服务器,因为主注册服务已经被关闭。 图3.2.6 关闭Master 5. 同注册服务器一样,各个节点也是可以用同样的方式被关闭,同样由于主注册服务和节点1的应用服务集成在一起,当节点1被关闭时,主注册服务也将结束。如果希望再次进入管理界面,需要用从注册服务(slave)重新登陆。 图3.2.7 关闭节点
46、6. 每个节点上的服务可以被启动、停止,也可以被设置为有效或失效,还有一些其它的功能菜单,这里不再详述,这些操作通过右键菜单都可以方便的进行。 图3.2.8 关闭节点 7. 如果我们能看到部署的各个注册服务、节点、各个应用服务,并能操纵正常,就说明部署成功了。 4. 高级应用配置 4.1 集成IceBox 在文档《IceBox开发和配置》(当前是1.0版)中,介绍了一个IceBox服务程序的开发方法和单独应用中配置和管理的过程。在实际的应用中,IceBox服务通常集成到IceGrid中,并通过IceGrid进行激活和部署。 本章节中IceBox服务是集成
47、在IceGrid中,并通过IceGrid进行部署,所以IceBox服务的配置信息不再同《IceBox开发和配置》中一样在config.icebox中描述,而是直接配置在部署文件app.xml中。那也就是说,IceGrid集成IceBox服务,只需要在app.xml文件中添加Icebox服务相关的配置信息就可以了。事实上,有关Ice所有的配置信息(除IceGrid自身的配置信息),都可以添加到app.xml中,并通过icegrid部署后生效。 下面各节详细描述IceBox服务的集成过程。 4.1.1 IceBox服务程序编写 请参考文档《IceBox开发和配置》,这里不再详述。由于Ic
48、eBox服务相关的配置信息都放在了app.xml中,并且服务是通过IceGrid按需激活的,因此这里程序代码略有调整。下面列出IceBox服务的实现代码: 文件名:ServerService.java import main.java.DataSource; import IceBox.Service; public class ServerService implements IceBox.Service { /** * @param name 配置文件中的service名称 * @param communicator对象,由IceBox.Servic
49、eManager负责创建和销毁。 * 可能同时被其他服务共享使用(由配置文件决定),object Adapter的名 * 称必须是唯一的; * @param args 配置文件中的参数列表 * @Override **/ public void start(String name, Ice.Communicator communicator, String[] args){ //创建objectAdapter,名称有配置文件决定 Adapter = communica
50、tor.createObjectAdapter( "RTDataSystem-"+name); //创建servant String RTDataSourceIdentity = communicator.getProperties(). getProperty("RTDataSource.Identity"); DataSource objDataSrc = new DataSource("dataSource"); Adapter.add(objDataSrc,






