您的位置:首页 > 其它

详细教你如何部署ICE服务(三)---IceBox框架 & Ice Registry服务注册中心的联合使用

2017-07-06 17:54 381 查看
详细教你如何部署ICE服务(二)---IceBox加载启动Ice服务这篇博客中,我们使用了IceBox来设计服务代码和启动Ice服务。单单使用IceBox组件来设计和启动Ice服务,客户端必须将服务端的EndPoint写死到代码中,为了解决这个问题,Ice设计了服务注册表Registry组件,这是一个以二进制文件形式存储运行期Ice服务注册信息的独立进程,作为服务的metadata存储数据中心,以供客户端查询。依托Registry的功能,Ice服务实现了ServiceLocator组件,这是一个标准的Ice Object服务对象,我们可以在自己的服务端调用这个寻址服务,从而解决客户端寻址的问题。Service Locator组件实现了两个非常实用和重要的功能:
Ⅰ:自动实现了多种可选择的负载均衡算法,客户端代码无需自己再实现
Ⅱ:服务部署位置和部署数量发送变化之后,客户端无需重启,自动感知和适应
Registry组件作为一个独立的进程,他通过icegridregistry命令,依赖一个属性配置文件来启动。
我们先来看Registry的配置文件registry.cfg
#开放Registry连接协议 端口
IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
#设置登录Registry方式
IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
#Registry持久化数据存放目录,这个目录需要手动提前创建,否则启动Registry会报错
IceGrid.Registry.Data=/data/web/yujie_ice/registry/data/registry
#是否允许动态注册服务,开发阶段可以,而生产部署建议禁止开启
IceGrid.Registry.DynamicRegistration=1
通过命令icegridregistry --Ice.Config=/data/web/yujie/etc/registry.cfg
启动之后,在Registryde的持久化数据目录中可以看到如下的文件:
介绍完Registry之后,我们开始改造上篇博客中查询雇员信息的服务。
(1)服务端的代码保持不变
/*** 使用IceBox 来加载启动 ice服务* @author yujie.wang**/public class QueryEmployeeServer implements Service{private ObjectAdapter adapter;/*** ice服务在start方法中初始化* paramString :ice Object name* paramCommunicator: Ice 通信器* paramArrayOfString : 服务启动的一些初始化参数*/@Overridepublic void start(String paramString, Communicator paramCommunicator,String[] paramArrayOfString) {// TODO Auto-generated method stubadapter = paramCommunicator.createObjectAdapter(paramString);QueryEmployeeImpl servant = new QueryEmployeeImpl();adapter.add(servant, paramCommunicator.stringToIdentity(paramString));// 激活adapteradapter.activate();System.out.println("adapter has been activate");}@Overridepublic void stop() {// TODO Auto-generated method stubadapter.destroy();System.out.println("adapter has been destory");}}
(2)修改IceBox的配置文件config.properties
增加如下两行:
#Ice Registry的协议 地址 端口Ice.Default.Locator=IceGrid/Locator:tcp -h 10.4.30.81 -p 4061#配置queryServer的适配器IdqueryServer.AdapterId=queryServerAdapter
通过配置服务的AdapterId,我们就可以使用service@adapterId的间接代理的EndPoint方式来寻址服务了。
修改好IceBox的配置文件之后,我们还是使用我的简易容器来启动Ice服务。
我们执行 sh startIceServer.sh & 启动服务。
(3)改造客户端代码
/*** 使用IceBox和IceRegistry,客户端调用服务的方式* @author yujie.wang**/public class QueryEmployeeClient {public static void main(String[] args) {// TODO Auto-generated method stubIce.Communicator communicator = null;try {// 传入远程服务单元的名称、网络协议、IP及端口,构造一个Proxy对象//communicator = Ice.Util.initialize(args);// Ice.ObjectPrx op = communicator.stringToProxy("queryServer1:default -h 10.4.30.81 -p 10006");//这里配置好Ice Registry的协议 主机 端口 作为通信器communicator的初始化参数String[] initParams = new String[]{"--Ice.Default.Locator=IceGrid/Locator:tcp -h 10.4.30.81 -p 4061"};// 初始化通信容器communicator = Ice.Util.initialize(initParams);//这里使用service@adapterId的形式寻址Ice.ObjectPrx op = communicator.stringToProxy("queryServer@queryServerAdapter");QueryEmployeePrx qp = QueryEmployeePrxHelper.checkedCast(op);if(qp == null){throw new Exception("qp == null");}EmployeeInfo ei = new EmployeeInfo();ei.name = "yujie.wang";EmployeeInfo result = qp.query(ei);if(result == null){throw new Exception("result == null");}System.out.println(result.remark);} catch (Exception e) {// TODO: handle exception}}}
之后调用服务输出:
(4)总结
使用IceBox和Ice Registry方式来部署服务,虽然解决了客户端寻址的问题,但是还是没有实现Ice服务的负载均衡,
Ice服务的启动方式,还是用我的简单容器来启动。
为了解决这个问题Ice设计了Ice Node来进行服务的部署,并且通过统一的xml文件来配置服务,这个xml文件替代了IceBox的属性配置文件。
下一篇博客我们将会讲解 Ice服务的真正的强大的Ice Grid部署方式。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Ice Box Registry
相关文章推荐