快速上手mlcs-ice分布式工具

           mlcs-ice是ICE的底层消息通讯封装,让java开发人员摆脱ice底层的消息通讯细节,直接支持javabean和原生类型的数据传递

 

   好了,废话不多说,现在看看如何来做这些后续的操作吧!

步骤:

   1、在maven工程的pom.xml文件中添加如下依赖:           

         <dependency>

            <groupId>com.mlcs.core</groupId>

            <artifactId>mlcs-ice</artifactId>

            <version>1.0.0-SNAPSHOT</version>

         </dependency>

    2、编写服务端程序(如HelloService.java,必须要继承 DefaultBaseServiceImpl.java;service中对外提供的方法必须满足两个条件:修饰符为public第一个参数为JsonObject):

          package com.mlcs.demo.service.impl;

          public class HelloService extends DefaultBaseServiceImpl {

               public  void watch(JsonObject resultObj,  HelloWorld hello,  int aaa){

                    System.out.println("watch msg : " + hello + "====" + aaa);

               }

               public synchronized  void handleArray(JsonObject resultObj,  int[] ids){

                    System.out.println("handleArray msg : " + ids);

               }

               public static  void handleList(JsonObject resultObj, List<HelloWorld> hwList){

                   System.out.println("handleList msg : " + hwList);

               }

               public void login(JsonObject resultObj, String userName, String passwd){

                   System.out.println(userName + "," + passwd);

                   JSONTool.addToResult(true, resultObj);    //有返回值的情况,可以借助于工具类JSONTool的addToResult*方法来返回数据

               }

          }

    3、编写服务端spring配置文件(例如 applicationContext.xml,放置在src/main/resources/conf/spring目录下):

             <?xml version="1.0" encoding="UTF-8"?>

              <beans xmlns="http://www.springframework.org/schema/beans"

                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://cxf.apache.org/core"

                          xmlns:p="http://cxf.apache.org/policy" xmlns:ss="http://www.springframework.org/schema/security"

                          xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jee="http://www.springframework.org/schema/jee"

                          xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"

                          xmlns:tx="http://www.springframework.org/schema/tx"

                          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd

                        http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd

                         http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd

                         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd

                         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

                         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

                   <bean id="hw"

                             class="com.mlcs.demo.service.impl.HelloService">    <!-- 注意:这个id将被在客户端使用,如果HelloService使用了注解@Service,则无需在这配置 -->

                   </bean>

                  <!--   defaultSecurityInterp这个bean不是必须要配置的,这个主要用作安全访问限制,某个类的方法只能被指定的IP或者服务访问   -->

                   <bean id="defaultSecurityInterp"

                             class="com.mlcs.core.ice.service.impl.DefaultSecurityInterceptor">

                   </bean>

           </beans>

   4、使用zookeeper客户端工具(点击zk_tool.tar.gz下载,如果双击zookeeper-dev-ZooInspector.jar不能成功运行,则使用命令行 java -Djava.ext.dirs=lib -jar zookeeper-dev-ZooInspector.jar 运行)连接 10.249.15.194:2181,建立业务线的zk配置文件根节点(比如:/mlcsconf), 然后在 /mlcsconf 节点下建立自己的模块名节点(比如demo),然后在该模块名下建立配置文件节点 ice_config.xml ,在 ice_config.xml 节点中编写如下内容:

         <?xml version="1.0" encoding="UTF-8"?>

         <ice-config>

                <springConfig>
                    <config>conf/spring/applicationContext.xml</config>   <!--  注意:这个文件路径是相对/WEB-INF/classes 的路径 ,与第3步放置的位置相关;这里配置有误,有可能导致启动时抛FileNotFoundException异常-->
                </springConfig>

                <services>

                    <service identity="testService"   <!--  这个是ice的配置文件里边配置的replica-group的子节点object的identity  -->

                                 replicaGroup="testIceBoxReplicaGroup"  <!--  这是ice的配置文件里边配置的replica-group的id  -->
                                 connectMode="debug"  <!--  这个模式共有4种,debug: 在本地调试的时候使用;dev:在开发环境中使用, test:在测试环境中使用;prod:在线上环境中使用  -->

                                 localHost="10.249.9.234" <!-- 这个给客户端使用的连接服务器的IP,默认为127.0.0.1,这个便于多人进行组合调试,这个只在debug模式下有用,其它模式下可以省略 -->

                                 localPort="10005"/> <!-- 在本地调试时,service将以这个值作为监听端口,client将读取这个端口来连接本地对应的service服务,其它connectMode模式下,这个属性可以省略  -->
               </services>

          </ice-config>

    5、(如果iceintf节点已存在,则这一步可以忽略)使用zookeeper客户端工具连接 10.249.15.194:2181, 建立全局ice配置文件,在 /mlcsconf 下建立iceintf目录,然后在iceintf目录下建立 ice_config.xml 节点,编写内容如下:

         <?xml version="1.0" encoding="UTF-8"?>         

         <ice-config>

            <locators>
              <dev connectUrl="tcp -h 10.249.15.194 -p 4061" />
             <test connectUrl="tcp -h 10.249.15.201 -p 4061" />
             <prod connectUrl="tcp -h 10.14.16.134 -p 4061:tcp -h 10.14.16.51 -p 4061" />
            </locators>

         </ice-config>

    6、编写服务端的本地zk连接的配置文件commons.properties(位置在 src/main/resources/conf 目录下),内容如下:

         zk.quorum=10.249.15.194:2181,10.249.15.195:2181,10.249.15.196:2181  #这里是zk的ip信息

        #zk.session.timeout=25000

        projectName=demo  #这个projectName的名字就是第4步中在zk上建立的/mlcsconf目录下的目录名称,在这里就是demo

        zk.config.prefix=/mlcsconf  #这个是第4步建立的配置文件根节点名称

        is_server_endpoint=true   #如果当前模块为ice的service,则需要配置一下这个属性

 

    7、在本地启动刚才的service服务(即HelloIntfImpl.java服务):

          点击eclipse工具栏中 Run 按钮边上的三角符号,选择 Run Configurations... 菜单项,在弹出的对话框中的左侧 Java Application 下新建一个运行项, 然后在右侧的 Main class 选择 com.meiliwan.emall.icetool.IceServerTester 类,点击 Run 按钮,即可将本地服务启动

    8、编写ice的客户端类(例如:HelloClient.java)

           package com.mlcs.demo.client;

          public class HelloClient {

                public static void watchHello(HelloWorld helloworld, int index){

                      IceClientTool.sendMsg(IceClientTool.TEST_ICE_SERVICE, JSONTool.buildParams("hw/watch", helloworld, index));   //注意标红的地方,不懂的往上边的内容里找;“/” 后边的为HelloService的方法名;

                                                                                                                                                                                       //如果HelloService.java是通过注解@Service注入的,hw需换成helloService;这是spring给注解类生产id的默认规则

                }

               public static void handleArray(int[] ids){

                     IceClientTool.sendMsg(IceClientTool.TEST_ICE_SERVICE, JSONTool.buildParams("hw/handleArray", ids));

               }

              public static void handleList(List<HelloWorld> list){

                    IceClientTool.sendMsg(IceClientTool.TEST_ICE_SERVICE, JSONTool.buildParams("hw/handleList", list));

              }

              public static boolean login(String username, String passwd){

                    JsonObject resultObj = IceClientTool.sendMsg(IceClientTool.TEST_ICE_SERVICE, JSONTool.buildParams("hw/login", username, passwd));

                    return resultObj.get(BaseService.RESULT_OBJ).getAsBoolean();   //如果返回值为基本类型,则可以如例子一样操作;如果为其它复杂类型,

                                                             //可以使用如下方法来转换成目标对象 new Gson().fromJson(resultObj.get(BaseService.RESULT_OBJ), new TypeToken<List<UserCart>>() {}.getType()) ; 注意标颜色的地方为目标类型

              }

        }

    9、编写客户端的本地zk连接的配置文件commons.properties(位置在 src/main/resources/conf 目录下),内容如下:

          zk.quorum=10.249.15.194:2181,10.249.15.195:2181,10.249.15.196:2181  #这里是zk的ip信息

         #zk.session.timeout=25000

         projectName=demo  #这个projectName的名字就是第4步中在zk上建立的/mlwconfig目录下的目录名称,在这里就是demo

         zk.config.prefix=/mlcsconf  #这个是第4步建立的配置文件根节点名称

    10、编写客户端的javabean(比如: HelloWorld.java)

         package com.mlcs.demo.model;

        public class HelloWorld {

             private String prefix;

             private String suffix; //注意生成getter和setter方法

       }


    11、编写客户端测试类 IceTester.java:

       package com.mlcs.demo.client;

       public class IceTester {

            public static void main(String[] args) {

                 HelloWorld helloworld = new HelloWorld();

                 helloworld.setPrefix("hello ");

                 helloworld.setSuffix(" world");

                

                HelloClient.watchHello(helloworld, 4);

                HelloClient.handleArray(new int[]{1, 2, 3, 4, 5});


               List<HelloWorld> hwList = new ArrayList<HelloWorld>();

               hwList.add(helloworld);

               HelloWorld helloworld1 = new HelloWorld();

               helloworld1.setPrefix("hello1 ");

               helloworld1.setSuffix(" world1");

               hwList.add(helloworld1);

               HelloClient.handleList(hwList);

 

               HelloClient.login("hahaha", "sdfsfdj");

          }

     }

 12、运行一下IceTester.java类,看看是否能在HelloService的服务窗口看到输出的信息,如果能看到,那恭喜您,这个demo已经完成了 


  目前还存在的问题:

      1、在与spring的aspectj结合使用的时候,带有泛型的参数解析不正常,(例如:List<HelloWorld>将被解析成List<LinkedHashMap>, List<Integer>将被解析成List<String>)

      2、不支持service方法的重载        

      3、json数据与对象之间的转换,需要用Gson工具进行

      4、客户端和服务器端的数据传输,默认最大支持1M的数据,如果超过该值,将会抛出异常(解决方案,可以在ice服务配置文件中添加  <property name="Ice.MessageSizeMax" value="40960" /> 这样的一个属性)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第 1 章引言 1 1.1 引言 1 1.2 Internet Communications Engine (Ice) 3 1.3 本书的篇章结 4 1.4 排字约定 4 1.5 源码示例 5 1.6 联系作者 5 1.7 Ice 支持 5 第 Ice 综述 7 第 2 章 Ice 综述 9 2.1 本章综 9 2.2 Ice 架构 9 2.3 Ice 服务 21 2.4 Ice 在架构上提供的好处 23 2.5 与 CORBA 的对比 25 第 3 章 Hello World 应用 33 3.1 本章综 33 3.2 编写 Slice 定义 33 3.3 编写使用 C++ 的 Ice应用 34 3.4 编写使用 Java的 Ice 应用 41 3.5 总结 48 第 Ice 核心概念 51 第 4 章 Slice 语言 53 4.1 本章综 53 4.2 引言 53 4.3 编译 54 4.4 源文件 57 4.5 词法规则 59 4.6 基本的 Slice 类型 62 4.7 用户定义的类型 63 4.8 接口、操作,以及异常 70 4.9 类 92 4.10 提前声明 106 4.11 模块 107 4.12 类型 ID 109 4.13 Object 上的操作 110 4.14 本地类 111 4.15 Ice 模块 112 4.16 名字与作用域 113 4.17 元数据 117 4.18 使用 Slice 编译器 118 4.19 Slice 与 CORBA IDL 的对比 119 4.20 总结 127 第 5 章 一个简单文件系统的 Slice 定义 137 5.1 本章综 137 5.2 文件系统应用 137 5.3 文件系统的 Slice 定义 138 5.4 完整的定义 140 第 6 章 客户端的 Slice-to-C++ 映射 143 6.1 本章综 143 6.2 引言 143 6.3 标识符的映射 144 6.4 模块的映射 144 6.5 Ice 名字空间 145 6.6 简单内建类型的映射 146 6.7 用户定义类型的映射 146 6.8 常量的映射 150 6.9 异常的映射 151 6.10 运行时异常的映射 154 6.11 接口的映射 154 6.12 操作的映射 161 6.13 异常处理 167 6.14 类的映射 169 6.15 slice2cpp 命令行选项 183 6.16 与 CORBA C++映射比较 184 第 7 章开发 C++ 文件系统客户 189 7.1 本章综 189 7.2 C++ 客户 189 7.3 总结 194 第 8 章 客户端的 Slice-to-Java 映射 197 8.1 本章综 197 8.2 引言 197 8.3 标识符的映射 198 8.4 模块的映射 198 8.5 Ice Package 199 8.6 简单内建类型的映射 200 8.7 用户定义类型的映射 200 8.8 常量的映射 204 8.9 异常的映射 205 8.10 运行时异常的映射 206 8.11 接口的映射 207 8.12 操作的映射 213 8.13 异常处理 219 8.14 类的映射 220 8.15 Package 224 8.16 slice2java 命令行选项 225 第 9 章开发 Java 文件系统客户 229 9.1 本章综 229 9.2 Java 客户 229 9.3 总结 233 第 10 章 服务器端的 Slice-to-C++ 映射 235 10.1 本章综 235 10.2 引言 235 10.3 服务器端 main函数 236 10.4 接口的映射 247 10.5 参数传递 249 10.6 引发异常 251 10.7 对象体现 252 10.8 总结 257 第 11 章开发 C++ 文件系统服务器 261 11.1 本章综 261 11.2 实现文件系统服务器 261 11.3 总结 276 第 12 章 服务器端的 Slice-to-Java 映射 279 12.1 Chapter Overview 279 12.2 引言 279 12.3 服务器端 main函数 280 12.4 接口的映射 285 12.5 参数传递 287 12.6 引发异常 288 12.7 Tie 类 289 12.8 对象体现 292 12.9 总结 296 第 13 章开发 Java 文件系统服务器 297 13.1 本章综 297 13.2 实现文件系统服务器 297 13.3 总结 306 第 14 章 Ice 属性与配置 307 14.1 本章综 307 14.2 属性 307 14.3 配置文件 309 14.4 在命令行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值