Magpie1._ 用户手册 - 中间件&公共组件文档中心

Magpie使用说明(byte[])¶
Tip

byte[] 方式主要适用与java和c之间的通讯,支持多种扩展协议 ,c端采用的组件为MGW。 java端 做服务端和客户端的配置方式如下。

Server端暴露一个服务的步骤¶

  1. 新建magpie.xml,放入CLASSPATH/appCfg/CLASSPATH/appCfg/中或者CLASSPATH/中,请看下面的示例中的注释:

     <magpie xmlns='uri:unionpay:magpie:1.0'>
         <!-- 定义全局信息 
            name:                (必填)业务系统标识(强烈建议唯一,可以复用zdogs为该系统定义好的的简称)
            heartbeatInterval:   (必填)心跳间隔时间,即定期向对方汇报自己还活着。单位:毫秒。
          -->
         <application name="SYS_B" heartbeatInterval="60000"/>
    
         <!-- 定义协议信息
             codec:              (必填)协议名,byte[] 方式下 支持的协议为:magpie_binary, uphead, up8583,exp2nap(必须与客户端设置的一致)
             version:            (必填)协议版本号(默认为1.0)
             serializationType:  (必填)报文体数据的序列化类型,byte[]模式下支持的类型只有 binary(必须与客户端设置的一致)
             compressAlgorithm:  (选填)压缩算法,支持类型有:none,snappy,gzip,zlib(必须与客户端设置的一致)
             ip:                 (服务端必填)绑定的ip地址
             port:               (服务端必填) 绑定的端口
             listener:           (选填) 服务端处理请求的方法,使用方式参见代码部分(也可以在服务启动时配置,建议在此处配置)
             maxThreads:         (选填)NettyServer的MemoryAwareThreadPoolExecutor的coreSize(仅支持1.1.9以上版本)                           
         -->
         <protocol id="p1" codec="magpie_binary" version="1.0" serializationType="binary" 
         compressAlgorithm="none" ip="127.0.0.1" port="5555" listener="com.unionpay.xxx.MyServerPayloadListener"/>
    
         <!-- 定义service来暴露一个服务。(可配置多个service)  
             serviceId:        (必填)服务的唯一标识
             protocol:         (必填)服务暴露使用的协议,协议明确了传输的tcp wire format,此处需设置为protocol标签中设置的id值 , 如果协议中指定了listener,则 该服务收到的byte[],将会由MyServerPayloadListener处理
         -->
         <service serviceId="ServiceA" protocol="p1" />   
     </magpie>
    
  2. 在自定义包com.unionpay.xxx下编写MyServerPayloadListener,定义回调函数,供magpie框架调用。在回调函数中,传入的参数就是客户端传过来的byte[]

     public class MyServerPayloadListener extends AbstractServerPayloadListener {
         @Override
         public byte[] handle(String serviceId, byte[] requestBytes) {
             // 对于设计了serviceId的协议(比如magpie),则可以通过serviceId来判断是哪个服务,所以可以在同一个端口暴露多个服务。
             // 对于没有设计serviceId的协议(比如uphead),则该处的serviceId为null,所以一个端口只能暴露一个服务。       
             try {
               Byte[] result = doSomething(requestBytes);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }      
             return result;
         }
     }
    
  3. 写代码启动magpie,请参考下面代码中的注释:

     // 调用Magpie API启动
     // 启动后,magpie框架会自动读取并解析magpie.xml,并读取其中的<protocol>,随后绑定到ip:port
     // 如果是web应用,则start动作可以写到ServletContextListener中,随中间件一起启动。
    
     //方法一(在protocol中指定了MyServerPayloadListener):      直接启动,推荐使用
     MagpieBootStrap.getBootStrap().start();   
    
     //方法二(在protocol中没有指定了MyServerPayloadListener):   指定全局的listener,多协议下不推荐使用  
     MagpieBootStrap.getBootStrap(new MyServerPayloadListener()).start();
    

client端 引用一个远端服务的步骤¶

  1. 新建magpie.xml,放入CLASSPATH/appCfg/CLASSPATH/appCfg/中或者CLASSPATH/中,请看下面的示例中的注释:

     <magpie xmlns='uri:unionpay:magpie:1.0'>
         <!-- 定义全局信息 
            name:                  业务系统标识(强烈建议唯一,可以复用zdogs为该系统定义好的的简称)
            heartbeatInterval:     心跳间隔时间,即定期向对方汇报自己还活着。单位:毫秒。
          -->
         <application name="SYS_A" heartbeatInterval="60000"/>
    
         <!-- 定义协议信息
             codec:               (必填)协议名(必须与服务端设置的一致)
             version:             (必填)协议版本号(默认为1.0)
             serializationType:   (必填)报文体数据的序列化类型,当前模式下支持的类型只有 binary(必须与服务端设置的一致)
             compressAlgorithm:   (选填)压缩算法,支持类型有:none,snappy,gzip,zlib(必须与服务端设置的一致)
         -->
         <protocol id="p1" codec="magpie_binary" version="1.0" serializationType="binary" compressAlgorithm="none"/>
    
         <!-- 定义reference来引用provider提供的服务 -->
    
         <!-- 定义服务引用(既然调用一个远程的服务,就需要指定该服务的相关信息。可配多个reference)       
             serviceId:            (必填)我要调用谁?总该明确一下吧。该服务id由远程服务提供者定义,客户端来引用
             urls:                 (必填)远程服务通常位于多台后端主机上,在magpie目前的版本1.*中(无zookeeper),需要手动指定
                                   格式为"ip1:port1,ip2:port2,ip3:prot3" ,当采用priority均衡策略,则优先调用第一个可用服务器
             protocol:             (必填)指定协议(<protocol>中的id属性值)
             oneway:               (必填)true: 不等待结果。 false: 同步等待结果(true:api采用acall方法, false:api采用call方法)       
             weights:              (选填)当负载均衡为random策略时,通过 weight进行计算。 值越大,机率越高。  格式为 "50,100,50", 与url一一对应
             loadbalanceStrategy:  (选填)既然后端是多台主机,那么就应该有一个负载均衡策略来确定报文到底应该被发往哪一台 ,默认random(均衡策略 见后面的配置参考表)
             failStrategy:         (选填)如果发往其中一台失败了,怎么办?是否要尝试其他台?这里就需要有一个fail策略(fail策略 见后面的配置参考表)
             retries:              (选填)调用远端整个集群的尝试总次数,默认三次     
             timeout:              (选填)调用某一台机器的业务超时时间,如果超过该时间,视为调用失败,magpie会根据fail策略决定下一步做什么。默认60s   
          -->
    
         <reference serviceId="ServiceA" urls="127.0.0.1:5555"
             loadbalanceStrategy="random" failStrategy="failover" retries="2" oneway="false" 
             timeout="5000" weights="100" protocol="p1"/>  
     </magpie>
    
  2. 写代码启动magpie,请看下面代码中的注释:

已复制
// 调用Magpie API启动
// 启动后,magpie框架会自动读取并解析magpie.xml,并读取其中的,随后主动与中指定的ip:port建立长链接
// 如果是web应用,则start动作可以写到ServletContextListener中,随中间件一起启动。
MagpieBootStrap.getBootStrap().start();
3. 调用magpie API来call或者acall服务。

    // 开始引用服务,并调用
    byte[] resultBytes = null;
    try {
        resultBytes = ServiceRegistry.getService("ServiceA").call("hello, magpie".getBytes());
        System.out.println("Received message: " + new String(resultBytes));
    } catch (RemotingException e) {
        e.printStackTrace();
    }

Magpie使用说明(RPC)¶
Tip

RPC(远程过程调用协议)方式只适用于java和java之间的通讯,只支持一种协议:magpie_rpc。

server暴露一个服务的步骤¶

  1. 新建magpie.xml,放入CLASSPATH/appCfg/CLASSPATH/appCfg/中或者CLASSPATH/中,请看下面的示例中的注释:

     <magpie xmlns='uri:unionpay:magpie:1.0'>
         <!-- 定义全局信息 
            name:              业务系统标识(强烈建议唯一,可以复用zdogs为该系统定义好的的简称)
            heartbeatInterval: 心跳间隔时间,即定期向对方汇报自己还活着。单位:毫秒。
          -->
         <application name="SYS_D" heartbeatInterval="60000"/>
    
         <!-- 定义协议信息
             codec:              (必填)协议名,RPC方式下 支持的协议为:magpie_rpc(必须与客户端设置的一致)
             version:            (选填)协议版本号(默认为1.0)
             serializationType:  (必填)报文体数据的序列化类型,rpc模式下支持的类型有hessian2,kryo,jdk (必须与客户端设置的一致)
             compressAlgorithm:  (选填)压缩算法,支持类型有:none,snappy,gzip,zlib(必须与客户端设置的一致)
             ip:                 (服务端必填)绑定的ip地址
             port:               (服务端必填)绑定的端口
             maxThreads:          (选填) NettyServer的MemoryAwareThreadPoolExecutor的coreSize (仅支持1.1.9以上版本)
         -->
         <protocol id="p1" codec="magpie_rpc" version="1.0" serializationType="hessian2" compressAlgorithm="none" ip="127.0.0.1" port="6666"/>
    
         <!-- 定义service来暴露一个服务。(可配置多个service)
             serviceId:         (必填)服务的唯一标识
             protocol:          (必填)服务暴露使用的协议,协议明确了传输的tcp wire format
            interfaceClass:    (rpc必填)使用rpc,则填写服务pojo的接口类,否则留空
             implClass:         (rpc必填)使用rpc,则填写服务pojo的实现类,否则留空
         -->
         <service serviceId="ServiceD" protocol="p1" 
             interfaceClass="bbbbbbbbbb.binaryserver.Hello" 
             implClass="bbbbbbbbbb.binaryserver.HelloImpl"/>
    
     </magpie>
    
  2. 写代码启动magpie,请看下面代码中的注释:

     // 调用Magpie API启动
     // 启动后,magpie框架会自动读取并解析magpie.xml,并读取其中的<protocol>,随后绑定到ip:port
     MagpieBootStrap.getBootStrap().start();
    
  3. 编写service接口类

     public interface Hello {
         String sayHello(String name);
     }
    
  4. 编写service实现类

     public class HelloImpl implements Hello {
         public String sayHello(String name) {
             return "Hello, " + name;
         }
     }
    

client引用一个远端RPC服务的步骤¶

  1. 新建magpie.xml,放入CLASSPATH/appCfg/CLASSPATH/appCfg/中或者CLASSPATH/中,请看下面的示例中的注释:

     <magpie xmlns='uri:unionpay:magpie:1.0'>
    
         <!-- 定义全局信息 
            name: 业务系统标识(可以复用zdogs为该系统定义好的的简称)
            heartbeatInterval: 心跳间隔时间,即定期向对方汇报自己还活着。单位:毫秒。
          -->
         <application name="SYS_C" heartbeatInterval="60000"/>
    
         <!-- 定义协议信息
             codec:                (必填)协议名(必须与服务端设置的一致)
             version:              (选填)协议版本号(默认为1.0)
             serializationType:    (必填)报文体数据的序列化类型(必须与服务端设置的一致)
             compressAlgorithm:    (选填)压缩算法(必须与服务端设置的一致)    
         -->
         <protocol id="p1" codec="magpie_rpc" version="1.0" serializationType="hessian2" compressAlgorithm="none"/>
    
         <!-- 定义reference来引用provider提供的服务 -->
    
         <!-- 
             既然调用一个远程的服务,就需要指定该服务的相关信息。(可配多个reference)
    
             serviceId:            (必填)我要调用谁?总该明确一下吧。该服务id由远程服务提供者定义,客户端来引用
             urls:                 (必填)远程服务通常位于多台后端主机上,在magpie目前的版本中(无zookeeper),需要手动指定
                                   格式为"ip1:port1,ip2:port2,ip3:prot3" ,当采用priority均衡策略,则优先调用第一个可用服务器       
             protocol:             (必填)指定协议,client必须与server端一致。
             oneway:               (必填)true: 对方只返回一个magpie报文头,报文体为空。 false: 同步等待结果。
             interfaceClass:       (必填)如果是采用rpc的方式的话,那么需要指定interface,如果采用binary方式,可留空
             weights:              (选填)当负载均衡为random策略时,通过 weight进行计算。 值越大,机率越高。  格式为 "50,100,50", 与url一一对应
             loadbalanceStrategy:  (选填)既然后端是多台主机,那么就应该有一个负载均衡策略来确定报文到底应该被发往哪一台 (均衡策略 见后面的配置参考表)
             failStrategy:         (选填)如果发往其中一台失败了,怎么办?是否要尝试其他台?这里就需要有一个fail策略(fail策略 见后面的配置参考表)
             retries:              (选填)调用远端整个集群的尝试总次数。      
             timeout:              (选填)调用某一台机器的业务超时时间,如果超过该时间,视为调用失败,magpie会根据fail策略决定下一步做什么。       
          -->
         <reference serviceId="ServiceD" urls="127.0.0.1:6666"
             loadbalanceStrategy="random" failStrategy="failover" retries="2" oneway="false" 
             timeout="5000" weights="100" protocol="p1" interfaceClass="bbbbbbbbbb.binaryserver.Hello" />
    
     </magpie>
    
  2. 将服务端定义的service接口类(Hello.java)拷贝至客户端。

  3. 写代码启动magpie,请看下面代码中的注释:

     // 调用Magpie API启动
     // 启动后,magpie框架会自动读取并解析magpie.xml,并读取其中的<reference>,随后主动与<reference>中指定的ip:port建立长链接
     // 如果是web应用,则start动作可以写到ServletContextListener中,随中间件一起启动。
     MagpieBootStrap.getBootStrap().start();
    
  4. 开始调用RPC服务

     // Hello是服务端暴露的service接口类,在客户端需要存在这个interface
     Hello helloService = ServiceRegistry.getService(Hello.class);
     String result = helloService.sayHello("world");
     System.out.println(result);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章