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);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章