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. 常用资源(不定期更新) – jack_Meng

    常用资源(不定期更新) 目录 好用的网站课程学习网站好用的软件  安卓端  PC端  Adobe软件Chrom […]...

  2. oracle定时器在项目中的应用 – 人生24k

    oracle定时器在项目中的应用 oracle定时器在项目中的应用 业务需求: 现在业务人员提出了一个需求: […]...

  3. 蓝松SDK – 卡点视频制作介绍

    卡点视频制作 蓝松短视频SDK 图片卡点 , 音乐视频 —恢复内容开始— 说明:卡点视 […]...

  4. 1-51单片机开发板介绍(所讲内容,功能介绍) – 杨奉武

    1-51单片机开发板介绍(所讲内容,功能介绍) 教程资料 链接:https://pan.baidu.com/s […]...

  5. python中数据分析常用函数整理 – xuzhengzhu

    一. apply函数 作用:对 DataFrame 的某行/列应用函数之后,Apply 返回一些值。函数既可以 […]...

  6. SQL DISTINCT 多字段查询用法 – jaywoo

    SQL DISTINCT 多字段查询用法 2011-07-28 08:34  jaywoo  阅读(1710) […]...

  7. 微信小程序des加密、PHP des解密 – Favour丶in

    微信小程序des加密、PHP des解密 最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称 […]...

  8. it工程师常用英文自我介绍常用用语 – nevergiveupzeng

    it工程师常用英文自我介绍常用用语   Good morning !   It is really my ho […]...

随机推荐

  1. Loadrunner集合点Rendezvous知识

    摘自: http://blog.csdn.net/richnaly/article/details/79673 […]...

  2. weex 小结 —

    可以包含各种子组件 <refresh style="width:750;padding:30;flex- […]...

  3. VS CODE中配置JAVA格式化细节

    VS CODE版本:1.46 由于VS CODE是使用“Language Support for Java(T […]...

  4. 华硕印象–谨以此文送给惨遭华硕郁闷的用户

    声明:本文不代表博客园观点,转载请注明出处及此声明。 2000年左右,我高中。玩DIY。大家都说华硕的东西好, […]...

  5. 从分布式一致性到共识机制(一)Paxos算法

    从分布式系统的CAP理论出发,关注分布式一致性,以及区块链的共识问题及解决。 区块链首先是一个大规模分布式系统 […]...

  6. RSA算法原理(转)

    如果你问我,哪一种算法最重要?我可能会回答“公钥加密算法”。因为它是计算机通信安全的基石,保证了加密数据不会被 […]...

  7. java Random概述及练习

    java Random概述及练习 Random类,是生成随机数的方法类。不过,Random类使用的是随机算法是 […]...

  8. 使用 jsPlumb 绘制拓扑图 —— 异步加载与绘制的实现

    本文实现的方法可以边异步加载数据边绘制拓扑图。主流程很简单: 发送 AJAX 请求获取数据 —&g […]...

展开目录

目录导航