zoukankan      html  css  js  c++  java
  • ICE集群环境搭建

    本文将介绍ice搭建高可用集群环境的详细操作步骤,实现 register 的主从备份、双服务器节点负载均衡等功能
     
    1、下载:
         到官网 http://www.zeroc.com/ 下载最新的Ice-x.x.x.msi (windows)版本
     
    2、安装:
         双击下载下来的安装文件,安装到自己喜欢的目录下(例:D:Program FileseroC)
     
    3、环境配置:
          设置ICE的环境变量 ICEJ_HOME = D:Program FileseroCice-x.x.x
          同时将 %ICEJ_HOME%in 目录添加到 Path 路径中
     
    下边介绍一个伪集群环境的配置和搭建步骤,节点情况如下:
         主注册节点(Master):tcp -h 127.0.0.1 -p 4061
         从注册节点(Replica):tcp -h 127.0.0.1 -p 4062
         服务节点node1: tcp -p 5062
         服务节点node2: tcp -p 5063
     
    1、编写主注册节点 register_master.conf 配置文件
            IceGrid.InstanceName=DemoGrid  #设置注册节点的实例名称,其它的配置均基于该名字配置
            IceGrid.Registry.Client.Endpoints=tcp -p 4061  #设置用于监听客户端连接的协议类型及端口
            IceGrid.Registry.Data=D:ice_service egisterdata  #设置主注册节点的数据存储目录
            IceGrid.Registry.Server.Endpoints=tcp    #设置与服务器节点之间通讯的协议类型,不指定端口则由系统自动分配
            IceGrid.Registry.Internal.Endpoints=tcp   #
            IceGrid.Registry.AdminPermissionsVerifier=DemoGrid/NullPermissionsVerifier #指定进入管理系统的安全验证方式

            IceGridAdmin.Username=test #设置管理用户名
            IceGridAdmin.Password=test #设置管理密码
     
    2、编写从注册节点 register_slave.conf 配置文件
            Ice.Default.Locator=DemoGrid/Locator:tcp -h 127.0.0.1 -p 4061  #指定主注册节点的位置
            IceGrid.Registry.Client.Endpoints=tcp -p 4062  #设置用于监听客户端连接的协议类型及端口
            IceGrid.Registry.Data=D:ice_service egister eplica_data  #设置主注册节点的数据存储目录
            IceGrid.Registry.Server.Endpoints=tcp    #设置与服务器节点之间通讯的协议类型,不指定端口则由系统自动分配
            IceGrid.Registry.Internal.Endpoints=tcp   #
            IceGrid.Registry.AdminPermissionsVerifier=DemoGrid/NullPermissionsVerifier #指定进入管理系统的安全验证方式

            IceGridAdmin.Username=test #设置管理用户名
            IceGridAdmin.Password=test #设置管理密码
     
    3、编写服务节点 node1.conf 配置文件
            Ice.Default.Locator=DemoGrid/Locator:tcp -h 127.0.0.1 -p 4061   #指定主注册节点的位置
            IceGrid.Node.Data=D:ice_service odedata  #设置节点1相关数据的存储目录
            IceGrid.Node.Endpoints=tcp -p 5062  #指定节点1用于监听客户端连接的端口号
            IceGrid.Node.Name=MyNode1 #指定节点1的名称

            Ice.StdErr=D:ice_service odelogs ode.stderr.log  #指定错误日志文件
            Ice.StdOut=D:ice_service odelogs ode.stdout.log #指定标准输出流日志文件
     
    4、编写服务节点 node2.conf 配置文件
            Ice.Default.Locator=DemoGrid/Locator:tcp -h 127.0.0.1 -p 4061   #指定主注册节点的位置
            IceGrid.Node.Data=D:ice_service odedata2  #设置节点1相关数据的存储目录
            IceGrid.Node.Endpoints=tcp -p 5063  #指定节点1用于监听客户端连接的端口号
            IceGrid.Node.Name=MyNode2 #指定节点2的名称

            Ice.StdErr=D:ice_service odelogs ode2.stderr.log  #指定错误日志文件
            Ice.StdOut=D:ice_service odelogs ode2.stdout.log #指定标准输出流日志文件
     
    5、编写IceBox.Service服务及相应的实现类
            1)编写slice配置文件,内容如下:
                    module com{
                module mop{
                  module interf{
                    module generated{
                      interface CalcServiceIce{
                        double calc(double d1,double d2);
                      };   
               
                      interface MessageServiceIce{
                        string sendMessage(string msg );  //string全为小写
                      };
                   };
                 };
               };
             };
               2)使用eclipse的slice2java插件将该配置文件生成相应的java源码
               3)编写实现类 MessageServiceIceImpl 实现第二步生成的抽象类 _MessageServiceIceDisp ,代码如下:
              package com.mop.ice.serv;

                        import Ice.Current;

                        import com.mop.interf.generated._MessageServiceIceDisp;

                        public class MessageServiceIceImpl extends _MessageServiceIceDisp{

                                 private static final long serialVersionUID = -6954195427744180145L;

         @Override
         public String sendMessage(String msg, Current __current) {
              System.out.println("recv:"+msg);
              return "msg handled success";
         }

                        }
                  4)编写IceBox.Service服务类,用于将服务配置到icegrid中:
                            package com.mop.ice.icebox;

    import com.mop.ice.serv.MessageServiceIceImpl;
    import Ice.Communicator;
    import IceBox.Service;
    public class MessageServiceI extends Ice.ObjectImpl implements Service {
         /**
         *
         */
         private static final long serialVersionUID = 43338146304475187L;
        
         private Ice.ObjectAdapter _adapter;
         @Override
         public void start(String name, Communicator ci, String[] args) {
              _adapter=ci.createObjectAdapter(name);
             
              _adapter.add(new MessageServiceIceImpl(), Ice.Util.stringToIdentity("IceBoxTest"));
              _adapter.activate();
         }
         @Override
         public void stop() {
              if(_adapter!=null){
                   _adapter.deactivate();
              }
         }
    }
     
                  5)将上述生成的类和自己编写的两个类打包,并放到指定的lib目录下
     
    6、编写xml配置文件 app.xml ,在icegrid中集成icebox服务
              <?xml version="1.0" encoding="UTF-8"?>
      <icegrid>
    <application name="testIceBoxApp">  <!-- 必须设置应用的名称 -->
      <replica-group id="testIceBoxReplicaGroup">  <!-- 对特定类型的icebox服务提供负载均衡策略  -->
           <load-balancing type="adaptive" />  <!--  有random、adaptive、round-robin、ordered 这4中负载均衡策略  -->
          <object identity="IceBoxTest"
                   type="::com::mop::interf::generated::_MessageServiceIceDisp" />
      </replica-group>
      <node name="MyNode2"> <!-- 必须指定节点的名称,且该名称不能与其它节点名称同名  -->
        <icebox id="testIceBox"   <!-- 必须指定icebox的id,且在MyNode2节点中,次名字必须唯一  -->
                    exe="C:Program FilesJavajdk1.7.0_09injava.exe">  <!-- 指定可执行程序路径  -->
          <option>-server</option>
          <option>-classpath</option>
          <option>-Djava.ext.dirs=D:ice_servicelib</option>
           <!-- <env>CLASSPATH=D:ice_servicelib*</env> -->   <!-- 此行可以 代替上面两行 -->
          <option>IceBox.Server</option>  <!-- 指定icebox的启动类  -->
          <log path="D:ice_servicePassportAdminOut.log" property="Ice.StdOut"/>
          <log path="D:ice_servicePassportAdminErr.log" property="Ice.StdErr"/>
          <service name="testIceAdapter" entry="com.mop.ice.icebox.MessageServiceI">
             <adapter name="testIceAdapter"   <!--  此处的adapter名字一定要和上边service 的名字一样  -->
                          replica-group="testIceBoxReplicaGroup"  <!--  此处指定本服务需要的负载均衡策略  -->
                          />
           </service>
          
         </icebox>
         <icebox id="testIceBox1" exe="C:Program FilesJavajdk1.7.0_09injava.exe">
           <option>-server</option>
           <option>-classpath</option>
           <option>-Djava.ext.dirs=D:ice_servicelib</option>
           <!-- <env>CLASSPATH=D:ice_servicelib*</env> -->
           <option>IceBox.Server</option>
           <log path="D:ice_servicePassportAdminOut.log" property="Ice.StdOut"/>
           <log path="D:ice_servicePassportAdminErr.log" property="Ice.StdErr"/>
           <service name="testIceAdapter1" entry="com.mop.ice.icebox.MessageServiceI">
             <adapter name="testIceAdapter1"
                          replica-group="testIceBoxReplicaGroup"
                          />
           </service>
          
         </icebox>
      </node>
    </application>
    </icegrid>
     
    7、启动
           >  icegridregistry --Ice.Config=register_master.conf   #启动主注册服务器
           >  icegridregistry --Ice.Config=register_slave.conf   #启动从注册服务器 
           >    icegridnode --Ice.Config=node1.conf   #启动服务器节点1
           >    icegridnode --Ice.Config=node2.conf   #启动服务器节点2
           >    icegridadmin -u test -p test --Ice.Default.Locator="IceGrid/Locator:tcp -p 4061:tcp -p 5061" -e "application add 'app.xml' "
     
    8、编写客户端进行测试
           使用eclipse编写客户端测试类Client,代码结构如下:
          public class Client {
             public static void main(String[] args) {
                 int status = 0;
                Communicator ic = null ;
                 try {
                      String str = String. format( "%s:%s -h %s -p %s:%s -h %s -p %s", "IceGrid/Locator",
                                   "tcp" , "127.0.0.1" , "4061" ,
                                   "tcp" , "127.0.0.1" , "4062" );
                      InitializationData localInitializationData = new InitializationData();
                      localInitializationData. properties = Util.createProperties();
                      localInitializationData. properties .setProperty(
                                   "Ice.Default.Locator" , str);
                      ic = Util. initialize(localInitializationData);
                      
                      MessageServiceIcePrx msgIceBoxclient = MessageServiceIcePrxHelper
                                  . checkedCast(ic.stringToProxy( "IceBoxTest"));  //此处IceBoxTest可以替换
                                                                                  //成IceBoxTest@testIceBoxReplicaGroup
     
                      System. out .println(msgIceBoxclient.sendMessage( "IceBox msg"));
     
                } catch (Ice.LocalException e) {
                      e.printStackTrace();
                      status = 1;
                } catch (Exception e) {
                      System. err .println(e.getMessage());
                      status = 1;
                }
                 if (ic != null) {
                       try {
                            ic.destroy();
                      } catch (Exception e) {
                            System. err .println(e.getMessage());
                            status = 1;
                      }
                }
                System. exit(status);
          }
        }
     
     
     
    扩展知识:
       其实可以自己实现一个与icebox功能类似的server类,用以加载同样的服务,同时修改配置文件app.xml 即可。
       例:
         保持上述其它操作不变,只需对如下两步进行修改即可,具体操作如下:
         1、编写 IceService 类如下(上述的MessageServiceI 类就用不着了):
            package com.mop.ice;
    import com.mop.ice.serv.CalcServiceIceImpl;
    import com.mop.ice.serv.MessageServiceIceImpl;
    import Ice.Communicator;
    import Ice.ObjectImpl;
    public class IceService {
         /**
         * @Description:
         *
         * @param args
         */
         public static void main(String[] args) {
              int status = 0;
              Communicator ic = null;
             
              try{
              ic=Ice.Util.initialize(args);
              Ice.ObjectAdapter adapter=ic
                        .createObjectAdapterWithEndpoints("testAdapter", "default -h *");
             
              ObjectImpl object1=new MessageServiceIceImpl();
              ObjectImpl object2=new CalcServiceIceImpl();
             
              adapter.add(object1, ic.stringToIdentity("messageService"));
              adapter.add(object2, ic.stringToIdentity("calcService"));
             
              adapter.activate();
              ic.waitForShutdown();
              }catch(Ice.LocalException le){
                   le.printStackTrace();
                   status=1;
              }catch(Exception e){
                   e.printStackTrace();
                   status=2;
              }
              if(ic!=null){
                   try{
                   ic.destroy();
                   }catch(Exception e){
                        e.printStackTrace();
                        status=3;
                   }
              }
              System.exit(status);
         }
    }
     
    2、将app.xml配置文件修改如下:
        
    <?xml version="1.0" encoding="UTF-8" ?>

    <icegrid>
      <application name="testApp">
        <replica-group id="ReplicatedTestAdapter">
           <load-balancing type="adaptive" load-sample="1" n-replicas="1"/>
          <object identity="IceBoxTest"
                   type="::com::mop::interf::generated::_MessageServiceIceDisp" />
           <object identity="calcService"
                   type="::com::mop::ice::serv::CalcServiceIceImpl" />
         </replica-group>

         <server-template id="testServerTemplate">
          <parameter name="index"/>
           <parameter name="servClass"/>
           <parameter name="exepath" default="C:Program FilesJavajdk1.7.0_09injava"/>
           <server id="testServer${index}"
                   exe="${exepath}"
                     activation="on-demand">
             <option>-server</option>
              <option>-classpath</option>
              <option>C:Program FileseroCIce-3.4.1in</option>
              <option>-Djava.ext.dirs=D:ice_servicelib</option>
             <option>${servClass}</option> 
              
              
              <adapter name="testAdapter"
                            replica-group="ReplicatedTestAdapter"
                            endpoints="tcp"/>
          
           </server>
         </server-template>

         <node name="MyNode1">
          <server-instance template="testServerTemplate"
                                    index="1"
                                    servClass="com.mop.ice.IceService"/>
         </node>

    <!--
         <node name="MyNode2">
          <server-instance template="testServerTemplate"
                            index="2"/>
         </node>
    -->
      </application>
    </icegrid>
    3、将第一步写好的IceService 类随同前一部分的内容重新打包,并放到指定的lib目录中
    4、执行命令:
         >    icegridadmin -u test -p test --Ice.Default.Locator="IceGrid/Locator:tcp -p 4061:tcp -p 5061" -e "application update 'app.xml' "
    5、使用前一部分编写好的客户端进行测试,即可成功!
  • 相关阅读:
    JavaScript cookie详解
    Javascript数组的排序:sort()方法和reverse()方法
    javascript中write( ) 和 writeln( )的区别
    div做表格
    JS 盒模型 scrollLeft, scrollWidth, clientWidth, offsetWidth 详解
    Job for phpfpm.service failed because the control process exited with error code. See "systemctl status phpfpm.service" and "journalctl xe" for details.
    orm查询存在价格为空问题
    利用救援模式破解系统密码
    SSH服务拒绝了密码
    C# 调用 C++ DLL 中的委托,引发“对XXX::Invoke类型的已垃圾回收委托进行了回调”错误的解决办法
  • 原文地址:https://www.cnblogs.com/blogszixin/p/3852913.html
Copyright © 2011-2022 走看看