自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

RPC框架泛化調(diào)用原理及轉(zhuǎn)轉(zhuǎn)的實(shí)踐

開發(fā) 架構(gòu)
RPC框架的泛化調(diào)用在網(wǎng)關(guān)、測(cè)試平臺(tái)等領(lǐng)域應(yīng)用廣泛,目前主流的泛化調(diào)用實(shí)現(xiàn)有基于Java Bean規(guī)范的泛化調(diào)用和基于序列化中間體的泛化調(diào)用。

?RPC框架泛化調(diào)用功能在網(wǎng)關(guān)、接口測(cè)試等場(chǎng)景下有著廣泛的需求,本文給各位讀者介紹一下主流的泛化調(diào)用實(shí)現(xiàn)方式及原理,比較各種實(shí)現(xiàn)方案的優(yōu)缺點(diǎn),并分享泛化調(diào)用在轉(zhuǎn)轉(zhuǎn)的實(shí)踐。一方面有助于RPC框架使用方理解泛化調(diào)用,更好地使用泛化調(diào)用;另一方面對(duì)于有自研RPC框架需求的開發(fā)者在選擇泛化調(diào)用實(shí)現(xiàn)方案上有一定參考意義。

1、普通RPC調(diào)用

基于動(dòng)態(tài)代理技術(shù),RPC框架客戶端做到了調(diào)用RPC方法與調(diào)用本地方法相同的體驗(yàn)。一般情況下服務(wù)端定義服務(wù)接口,并將接口打包到二方j(luò)ar包發(fā)布。服務(wù)端在服務(wù)進(jìn)程中實(shí)現(xiàn)該接口,而調(diào)用方在進(jìn)程中根據(jù)該接口創(chuàng)建動(dòng)態(tài)代理進(jìn)行調(diào)用,與調(diào)用本地方法體驗(yàn)一致。

例如有接口HelloService?,被打包在demo-service-interfaces.jar包中。

public interface HelloService {
String hello(String name);
}

服務(wù)端依賴demo-service-interfaces.jar?,創(chuàng)建HelloServiceImpl實(shí)現(xiàn)該接口。

public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name){
return "hello, " + name;
}
}

客戶端同樣依賴demo-service-interface.jar?,創(chuàng)建HelloService的代理類,以下為代碼示例,實(shí)際上創(chuàng)建代理類,發(fā)送接口、參數(shù),接收返回結(jié)果等操作都是封裝在框架內(nèi)的。

HelloService helloService = (HelloService)Proxy.newProxyInstance(this.getClass().getClassLoader(), HelloService.class, (InvocationHandler) (proxy, method, args) -> {
//都是封裝在框架內(nèi)的
//獲取方法、參數(shù)類型
String methodName = method.getName();
Class<?>[] parameterTypes = method.getParameterTypes();
//發(fā)送方法、參數(shù)類型和實(shí)參到服務(wù)端并返回結(jié)果
return request(methodName, parameterTypes, args);
});
String result = helloService.hello("jack");
System.out.println(result);

2、網(wǎng)關(guān)、接口測(cè)試等場(chǎng)景下的需求

由上文可以看到普通的RPC調(diào)用需要將接口類(參數(shù)和返回值如果是POJO類型同樣需要一起打包)打到一個(gè)jar包中,被服務(wù)方和調(diào)用方共同依賴。這種方式在多大數(shù)業(yè)務(wù)場(chǎng)景中是適用的,且更加方便,因?yàn)樗蕾嚨慕涌趈ar包是可枚舉的。

但是在一些特殊的場(chǎng)景下依賴接口jar包變得很不方便,比如網(wǎng)關(guān)、接口測(cè)試平臺(tái)等。例如使用http網(wǎng)關(guān)代理私有協(xié)議RPC請(qǐng)求,如果在網(wǎng)關(guān)中依賴接口jar包,那么在新增方法或者接口時(shí)網(wǎng)關(guān)需要重新編譯上線。而接口測(cè)試平臺(tái)需要對(duì)全公司所有的RPC接口進(jìn)行測(cè)試,將全公司所有的接口jar包添加到測(cè)試平臺(tái)的依賴中顯然是不可行的。

在這些場(chǎng)景下就誕生了對(duì)泛化調(diào)用的需求。

3、泛化調(diào)用

泛化調(diào)用就是在不依賴服務(wù)方接口jar包的情況下進(jìn)行調(diào)用,包括對(duì)調(diào)用方法的泛化、參數(shù)的泛化和返回值的泛化。

public interface GenericService {
Object $genericInvoke(String methodName, String[] parameterTypes, Object[] args);
}

在沒有接口類依賴的情況下,parameterTypes?需要通過字符串指定,而args?和返回值如果是jdk?內(nèi)置類型的話與普通調(diào)用無異,而如果是POJO類型的話則需要尋找一種通用的表示方法。

下普通RPC調(diào)用的序列化與反序列化原理,如下圖所示,實(shí)際上序列化框架在將POJO?序列化成字節(jié)數(shù)組之前需要解析POJO的類結(jié)構(gòu)生成序列化中間體,當(dāng)然序列化中間體并非一定能在序列化框架中找到對(duì)應(yīng)的類,有時(shí)候這個(gè)中間體是虛擬的。

圖片

普通RPC調(diào)用序列化原理

3.1 基于Java Bean的泛化調(diào)用

基于Java Bean?的泛化調(diào)用是通過統(tǒng)一的Java Bean?描述符(JavaBeanDescriptor?)來描述POJO?對(duì)象,它工作在序列化層之上,例如dubbo?支持該種類型的泛化調(diào)用,在使用泛化調(diào)用時(shí),直接傳遞JavaBeanDescriptor對(duì)象作為參數(shù),基本原理如下圖所示。

圖片

Java Bean泛化調(diào)用

該泛化調(diào)用的實(shí)現(xiàn)通用性比較強(qiáng),與底層序列化無關(guān),但是復(fù)雜度較高,需要RPC框架處理POJO和JavaBeanDescriptor之間的轉(zhuǎn)換。

3.2 基于序列化中間體的泛化調(diào)用

支持基于序列化中間體的泛化調(diào)用的RPC框架典型的如sofa-rpc?,使用了sofa-hessian?序列化框架,sofa-hessian?是在hessian?序列化框架基礎(chǔ)上進(jìn)行二次開發(fā)的,抽象出了序列化中間體,如GenericObject、GenericMap、GenericArray等。

轉(zhuǎn)轉(zhuǎn)RPC框架在支持泛化調(diào)用時(shí)也參考了sofa-hessian?的實(shí)現(xiàn),對(duì)hessian序列化框架進(jìn)行二次開發(fā),并且有所改進(jìn)。

圖片

基于序列化中間體的泛化調(diào)用

而json?序列化天然具備序列化中間體,即JsonObject?或者json String?,在使用json?序列化時(shí)調(diào)用方可以直接將Json Object?或者json String?作為參數(shù)代替POJO?進(jìn)行調(diào)用。轉(zhuǎn)轉(zhuǎn)RPC框架也支持基于json序列化的泛化調(diào)用。

dubbo?除了支持基于Java Bean?的泛化調(diào)用,還支持json-protobuf?泛化調(diào)用,也就是說調(diào)用方可以使用json?描述protobuf?對(duì)象,在反序列化時(shí)可以將json?反序列為protobuf?對(duì)象再轉(zhuǎn)換成POJO,而這些功能本身是序列化框架所提供,不需要RPC框架做額外的開發(fā)支持。

基于序列化中間體的泛化調(diào)用與基于Java Bean的泛化調(diào)用相比,實(shí)現(xiàn)較為簡(jiǎn)單,有些序列化框架本身原生就支持,或者對(duì)序列化框架做簡(jiǎn)單的二次開發(fā)即可實(shí)現(xiàn),缺點(diǎn)是與序列化框架耦合。

4、泛化調(diào)用在轉(zhuǎn)轉(zhuǎn)的實(shí)踐

目前泛化調(diào)用在轉(zhuǎn)轉(zhuǎn)公司應(yīng)用最廣泛的領(lǐng)域就是接口測(cè)試,我們提供了統(tǒng)一的測(cè)試API平臺(tái)。通過該平臺(tái)可以使用http + json的方式實(shí)現(xiàn)對(duì)任意服務(wù)、任意節(jié)點(diǎn)、任意方法的調(diào)用,而測(cè)試API平臺(tái)不需要依賴任何服務(wù)的接口jar包。并且API平臺(tái)也沒有依賴RPC框架jar包,因?yàn)檗D(zhuǎn)轉(zhuǎn)RPC框架實(shí)現(xiàn)了在同一個(gè)端口上同時(shí)兼容私有的二進(jìn)制協(xié)議及公有的http協(xié)議,也就是說可以使用http請(qǐng)求來發(fā)起RPC調(diào)用。

圖片泛化調(diào)用在轉(zhuǎn)轉(zhuǎn)的應(yīng)用

同時(shí)還支持獲取任意服務(wù)、任意節(jié)點(diǎn)、任意方法參數(shù)及返回值的JsonSchema,如下代碼所示。

{
"msg": "success",
"data": {
"schema": {
"returnValue": {
"type": "array",
"items": {
"type": "object",
"id": "urn:jsonschema:com:bj58:zhuanzhuan:arch:user:atomic:entity:User",
"properties": {
"id": {
"type": "string"
},
"userName": {
"type": "string"
},
"userNamePinyin": {
"type": "string"
},
"mock": {
"type": "boolean"
}
}
}
},
"parameters": {
"pageNum": {
"type": "integer"
},
"pageSize": {
"type": "integer"
}
}
}
},
"code": 0
}

未來轉(zhuǎn)轉(zhuǎn)的網(wǎng)關(guān)也將基于泛化調(diào)用進(jìn)行開發(fā)。

5 總結(jié)

RPC框架的泛化調(diào)用在網(wǎng)關(guān)、測(cè)試平臺(tái)等領(lǐng)域應(yīng)用廣泛,目前主流的泛化調(diào)用實(shí)現(xiàn)有基于Java Bean規(guī)范的泛化調(diào)用和基于序列化中間體的泛化調(diào)用,它們的優(yōu)缺點(diǎn)分別如下:

  • 基于Java Bean?的泛化調(diào)用:優(yōu)點(diǎn)是與序列化無關(guān);缺點(diǎn)是RPC框架需要實(shí)現(xiàn)JavaBeanDescriptor向POJO的轉(zhuǎn)換功能,較為復(fù)雜。
  • 基于序列化中間體的泛化調(diào)用:優(yōu)點(diǎn)是RPC框架實(shí)現(xiàn)簡(jiǎn)單,序列化框架原生支持或者僅需少量改造;缺點(diǎn)是與特定的序列化框架耦合。

在開發(fā)RPC框架時(shí),具體選擇哪種泛化調(diào)用實(shí)現(xiàn)方式,還需要結(jié)合實(shí)際情況做出選擇。

關(guān)于作者

王建新,轉(zhuǎn)轉(zhuǎn)架構(gòu)部服務(wù)治理負(fù)責(zé)人,主要負(fù)責(zé)服務(wù)治理、RPC框架、分布式調(diào)用跟蹤、監(jiān)控系統(tǒng)等。愛技術(shù)、愛學(xué)習(xí),歡迎聯(lián)系交流。

責(zé)任編輯:武曉燕 來源: 轉(zhuǎn)轉(zhuǎn)技術(shù)
相關(guān)推薦

2023-03-29 08:33:03

倉儲(chǔ)自動(dòng)化系統(tǒng)

2022-08-15 08:01:35

微服務(wù)框架RPC

2022-01-07 06:12:08

RPC框架限流

2023-07-19 22:13:25

一體化推送平臺(tái)

2023-11-01 07:44:29

轉(zhuǎn)轉(zhuǎn)Flutter業(yè)務(wù)

2022-11-07 14:45:26

轉(zhuǎn)轉(zhuǎn)價(jià)格DDD

2023-12-27 19:12:42

OLAP自助分析

2022-01-10 17:18:26

框架 RPC架構(gòu)

2023-03-02 08:54:32

2023-03-22 08:32:35

2022-10-28 09:15:02

2022-10-28 08:31:43

2023-03-02 08:32:41

2023-09-14 08:34:28

linux架構(gòu)參數(shù)

2022-02-14 21:17:21

RPC框架協(xié)議

2012-10-10 09:14:50

PHPRPCPHP框架

2023-02-08 09:42:30

策略方式容量

2022-12-15 08:35:01

用戶畫像平臺(tái)

2023-06-07 08:32:32

引擎技術(shù)while

2024-06-06 08:18:42

回收業(yè)務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)