ICE集群环境搭建 - blogs_zixin

blogszixin 2021-08-27 原文


ICE集群环境搭建

本文将介绍ice搭建高可用集群环境的详细操作步骤,实现 register 的主从备份、双服务器节点负载均衡等功能
 
1、下载:
     到官网 http://www.zeroc.com/ 下载最新的Ice-x.x.x.msi (windows)版本

 
2、安装:
     双击下载下来的安装文件,安装到自己喜欢的目录下(例:D:\Program Files\ZeroC)
 
3、环境配置:
      设置ICE的环境变量 ICEJ_HOME = D:\Program Files\ZeroC\ice-x.x.x
      同时将 %ICEJ_HOME%\bin 目录添加到 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\register\data  #设置主注册节点的数据存储目录
        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\register\replica_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\node\data  #设置节点1相关数据的存储目录
        IceGrid.Node.Endpoints=tcp -p 5062  #指定节点1用于监听客户端连接的端口号
        IceGrid.Node.Name=MyNode1 #指定节点1的名称

        Ice.StdErr=D:\ice_service\node\logs\node.stderr.log  #指定错误日志文件
        Ice.StdOut=D:\ice_service\node\logs\node.stdout.log #指定标准输出流日志文件

 
4、编写服务节点 node2.conf 配置文件
        Ice.Default.Locator=DemoGrid/Locator:tcp -h 127.0.0.1 -p 4061   #指定主注册节点的位置
        IceGrid.Node.Data=D:\ice_service\node\data2  #设置节点1相关数据的存储目录
        IceGrid.Node.Endpoints=tcp -p 5063  #指定节点1用于监听客户端连接的端口号
        IceGrid.Node.Name=MyNode2 #指定节点2的名称

        Ice.StdErr=D:\ice_service\node\logs\node2.stderr.log  #指定错误日志文件
        Ice.StdOut=D:\ice_service\node\logs\node2.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 Files\Java\jdk1.7.0_09\bin\java.exe”>  <!– 指定可执行程序路径  –>

      <option>-server</option>

      <option>-classpath</option>

      <option>-Djava.ext.dirs=D:\ice_service\lib</option>

       <!– <env>CLASSPATH=D:\ice_service\lib\*</env> –>   <!– 此行可以 代替上面两行 –>

      <option>IceBox.Server</option>  <!– 指定icebox的启动类  –>

      <log path=”D:\ice_service\PassportAdminOut.log” property=”Ice.StdOut”/>

      <log path=”D:\ice_service\PassportAdminErr.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 Files\Java\jdk1.7.0_09\bin\java.exe”>

       <option>-server</option>

       <option>-classpath</option>

       <option>-Djava.ext.dirs=D:\ice_service\lib</option>

       <!– <env>CLASSPATH=D:\ice_service\lib\*</env> –>

       <option>IceBox.Server</option>

       <log path=”D:\ice_service\PassportAdminOut.log” property=”Ice.StdOut”/>

       <log path=”D:\ice_service\PassportAdminErr.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 Files\Java\jdk1.7.0_09\bin\java”/>
       <server id=”testServer${index}”
               exe=”${exepath}”
                 activation=”on-demand”>
         <option>-server</option>
          <option>-classpath</option>
          <option>C:\Program Files\ZeroC\Ice-3.4.1\bin</option>
          <option>-Djava.ext.dirs=D:\ice_service\lib</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、使用前一部分编写好的客户端进行测试,即可成功!

发表于
2014-07-18 10:20 
blogs_zixin 
阅读(6130
评论(0
编辑 
收藏 
举报

 

版权声明:本文为blogszixin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/blogszixin/p/3852913.html

ICE集群环境搭建 - blogs_zixin的更多相关文章

  1. 验证码 – echoshao

    验证码 <?php session_start(); //登录验证码function GetVerify […]...

  2. SPSS-比较均值-独立样本T检验 案例解析 – yycGIS

    SPSS-比较均值-独立样本T检验 案例解析  在使用SPSS进行单样本T检验时,很多人都会问,如果数据不符合 […]...

  3. 个人常用Android手机软件 – 张荣华

    使用HTC My Touch 4G 有一段时间了,感觉Android上面的软件还是不少的,不过不如iOS上面好 […]...

  4. 关于在Eclipse中导入现有项目 – kejian of 20

    在Eclipse新建一个文件时,系统会自动生成一个.project文件,在用file  import 导入一个 […]...

  5. js – 预加载+监听图片资源加载制作进度条

    页面加载完毕后刷新,再展示的图片都是缓存的图,而load又监听不到缓存的图… 这两天遇到一个新需求 […]...

  6. ubuntu — 运行.sh文件、编写.sh文件

      一、运行.sh文件 (1)使用sh testsh执行 (2)使用bash testsh 执行 (3)使用点 […]...

  7. [转载]分享日志 Word,PDF,PPT,TXT之间的转换方法 – 编著人

    Word,PDF,PPT,TXT之间的转换方法 作者:乖乖飞不高~~ 一、把PPT转WORD形式的方法 1.利 […]...

  8. 别被你的双眼所欺骗 100张神奇的视觉欺骗图 – jack船长大哥

    别被你的双眼所欺骗 100张神奇的视觉欺骗图  人类的大脑分工不同,所导致的眼睛所见到的图像在左右脑中处理时产 […]...

随机推荐

  1. 区别计算机概念 位(bit)、字节(Byte)、字

    如何区别计算机概念 位(bit)、字节(Byte)、字 位、字节、字是计算机数据存储的单位。位是最小的存储单位 […]...

  2. 戴尔灵越15-5000/3558等系列修改BIOS设置U盘启动

    今天在电脑群遇到一个群友的机型是戴尔灵越15-5000,他问我这款机器怎么设置U盘启动。 看到它的BIOS界面 […]...

  3. Spark:一个独立应用

    目录 Spark:一个独立应用 关于构建 Java和Scala Python 初始化SparkContext […]...

  4. 学习了JsonSchema,我自定义了一个校验代码

    JsonSchema 使用fastjsonschema来校验数据 # 导入验证器 import json im […]...

  5. 最佳开源应用程序:图形/图像处理软件

    我们这里就将介绍六种开源的图形/图像处理应用软件,它们能够满足一系列广泛的需求,并且可以在Linux、Wind […]...

  6. 蚁群算法简介

    蚁群算法(Ant Colony Optimization, ACO) 一、概述:      又称蚂蚁算法,是一 […]...

  7. 自学思科SD-WAN理论知识(共13篇) – CARLOS_CHIANG

    自学思科SD-WAN理论知识(共13篇)   自学思科SD-WAN理论知识 01 思科SD-WAN架构概念和基 […]...

  8. 使用FinalShell 安装jdk和tomcat流程(Linux系统是centOS7.5)

    本文是作者原创,版权归作者所有.若要转载,请注明出处 我今天刚刚买了一个一年的百度云服务器,85元,还是很便宜 […]...

展开目录

目录导航