上一篇提到IceBox没有地方存储服务的Endpoints信息。为了解决这个问题,诞生了服务注册表Registry组件,是一个以二进制文件形式存储运行期Ice服务注册信息的独立进程,支持主从同步,从节点可以分担查询请求,类似MySql读写分离的功能,以防止单点故障,同时依托registry的功能,Zeroc设计实现了Service Locator服务组件,它是一个标准的Ice Object服务对象,可以在Ice程序中调用这个服务,从而解决服务地址的查询问题。另外,Service Locator服务组件与Ice客户端Runtime框架结合,实现了自动透明的服务调用均衡负载功能。
(1)registry.cfg
#registry configfor icegrid
IceGrid.Registry.Client.Endpoints=tcp -p 7061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
# 手动创建
IceGrid.Registry.Data=D:\data1\registry
# 是否允许动态注册,在开发阶段允许
IceGrid.Registry.DynamicRegistration=1
(2) 启动注册表
icegridregistry --Ice.Config=./resources/registry.cfg
(3) 修改config.properties,增加下面几行代码
# 和registry同步
Ice.Default.Locator=IceGrid/Locator:tcp -h localhost -p 7061
#指定AdapterId,就可以使用XX@XX来访问
OnlineBookService.AdapterId = OnlineBookServiceAdapter
SMSService.AdapterId = SMSServiceAdapter
(4) 此时修改Client中的访问代码
(1) OnlineBookService
Ice.Communicator ic=null;
String[] initparams = new String[]{"--Ice.Default.Locator=IceGrid/Locator:tcp -h localhost -p 7061"};
try{
//初始化Communicator连接对象,负责处理客户端的连接,可以进行设置,如客户端连接数量
ic = Ice.Util.initialize(initparams);
// 客户端代理proxy对象,访问确定的endpoints,返回的对象是广义的
Ice.ObjectPrx base = ic.stringToProxy("OnlineBookService@OnlineBookServiceAdapter");
// 此时是根据XX@XX来访问的,如果指定一个命名规则,就很方便的查询出具体的endpoints,不用详细给定。
(2)SMSClient
String[] initparams = new String[]{"--Ice.Default.Locator=IceGrid/Locator:tcp -h localhost -p 7061"};
try{
//初始化Communicator连接对象,负责处理客户端的连接,可以进行设置,如客户端连接数量
ic = Ice.Util.initialize(initparams);
// 客户端代理proxy对象,访问确定的endpoints,返回的对象是广义的
Ice.ObjectPrx base = ic.stringToProxy("SMSService@SMSServiceAdapter");
(3)SMSServiceImpl 中的访问OnlineBook代码
Ice.ObjectPrx base =_adapter.getCommunicator().stringToProxy("OnlineBookService@OnlineBookServiceAdapter");
(5) 具体的输出和前面是一样的。
(6) 运行图片