Magpie使用說明(byte[])¶
Tip
byte[] 方式主要適用與java和c之間的通訊,支持多種擴展協議 ,c端採用的組件爲MGW。 java端 做服務端和客戶端的配置方式如下。
Server端暴露一個服務的步驟¶
-
新建magpie.xml,放入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>
-
在自定義包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; } }
-
寫代碼啓動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端 引用一個遠端服務的步驟¶
-
新建magpie.xml,放入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>
-
寫代碼啓動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暴露一個服務的步驟¶
-
新建magpie.xml,放入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>
-
寫代碼啓動magpie,請看下面代碼中的註釋:
// 調用Magpie API啓動 // 啓動後,magpie框架會自動讀取並解析magpie.xml,並讀取其中的<protocol>,隨後綁定到ip:port MagpieBootStrap.getBootStrap().start();
-
編寫service接口類
public interface Hello { String sayHello(String name); }
-
編寫service實現類
public class HelloImpl implements Hello { public String sayHello(String name) { return "Hello, " + name; } }
client引用一個遠端RPC服務的步驟¶
-
新建magpie.xml,放入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>
-
將服務端定義的service接口類(Hello.java)拷貝至客戶端。
-
寫代碼啓動magpie,請看下面代碼中的註釋:
// 調用Magpie API啓動 // 啓動後,magpie框架會自動讀取並解析magpie.xml,並讀取其中的<reference>,隨後主動與<reference>中指定的ip:port建立長鏈接 // 如果是web應用,則start動作可以寫到ServletContextListener中,隨中間件一起啓動。 MagpieBootStrap.getBootStrap().start();
-
開始調用RPC服務
// Hello是服務端暴露的service接口類,在客戶端需要存在這個interface Hello helloService = ServiceRegistry.getService(Hello.class); String result = helloService.sayHello("world"); System.out.println(result);