API網(wǎng)關(guān)基石:泛化調(diào)用

API網(wǎng)關(guān)泛化調(diào)用


可能大部分人第一次在軟件開發(fā)中接觸到“泛化”這個詞是在學(xué)習(xí)UML的過程中秸歧,泛化是UML所述的四中關(guān)系(泛化關(guān)系灾锯、實現(xiàn)關(guān)系葬凳、依賴關(guān)系绰垂、關(guān)聯(lián)關(guān)系)中的一種。泛化關(guān)系指的是類與類火焰、接口與接口之間的繼承關(guān)系劲装,UML中用帶箭頭的實線表示,如下:


01.png

本文中講到的泛化是一個動作荐健,可以理解為“變的寬泛”酱畅,由具體到抽象,由特殊到一般的一個動作實現(xiàn)江场》乃幔可以先簡單理解為就是沒有了具體的POJO,統(tǒng)一使用Map來封裝對象址否。為什么說泛化調(diào)用時網(wǎng)關(guān)的基石呢餐蔬?原因之一也在于此,使用者在調(diào)用提供者接口時佑附,不再需要依賴服務(wù)提供方客戶端的JAR包樊诺,因此也就沒有了POJO,通過泛化的方式進(jìn)行遠(yuǎn)程調(diào)用音同。

一般情況下我們需要通過RPC調(diào)用接口提供方的服務(wù)词爬,首先在消費端嵌入提供方的Jar包,從而使用Jar包中的類和方法权均。那對于網(wǎng)關(guān)服務(wù)來說顿膨,如果一個網(wǎng)關(guān)調(diào)用了N個服務(wù),那就需要引入N個Jar依賴叽赊,這樣網(wǎng)關(guān)系統(tǒng)難以維護(hù)恋沃,如下:


02.png

在網(wǎng)關(guān)系統(tǒng)中,我們需要另外一種方式實現(xiàn)調(diào)用必指,這就是泛化調(diào)用囊咏。這種方式不在需要服務(wù)提供方提供jar包便可完成RPC調(diào)用,其中的原理跟普通的RPC調(diào)用時一致的,網(wǎng)絡(luò)梅割、序列化霜第、反射這些底層的技術(shù)原理一致。區(qū)別在于參數(shù)和返回值都用Map來表示户辞。通過GenericService來調(diào)用所有的服務(wù)實現(xiàn)庶诡。任何一個成熟的RPC框架都會支持泛化調(diào)用,比如阿里巴巴優(yōu)秀的RPC框架Dubbo官網(wǎng)提供的泛化為例咆课,示例代碼:

import org.apache.dubbo.rpc.service.GenericService; 
... 
 
// 引用遠(yuǎn)程服務(wù) 
// 該實例很重量,里面封裝了所有與注冊中心及服務(wù)提供方連接扯俱,請緩存
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); 
// 弱類型接口名
reference.setInterface("com.xxx.XxxService");  
reference.setVersion("1.0.0");
// 聲明為泛化接口 
reference.setGeneric(true);  

// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用  
GenericService genericService = reference.get(); 
 
// 基本類型以及Date,List,Map等不需要轉(zhuǎn)換书蚪,直接調(diào)用 
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"world"}); 
 
// 用Map表示POJO參數(shù),如果返回值為POJO也將自動轉(zhuǎn)成Map 
Map<String, Object> person = new HashMap<String, Object>(); 
person.put("name", "xxx"); 
person.put("password", "yyy"); 
// 如果返回POJO將自動轉(zhuǎn)成Map 
Object result = genericService.$invoke("findPerson", new String[]
{"com.xxx.Person"}, new Object[]{person}); 
 
...

使用泛化調(diào)用的網(wǎng)關(guān)系統(tǒng)只需要繼承RPC框架基礎(chǔ)的一個JAR包即可迅栅,其余的接口都通過泛化來調(diào)用服務(wù)的實現(xiàn)殊校,這樣無論網(wǎng)關(guān)系統(tǒng)承載多少個接口,都不需要引入多余的JAR包了读存,結(jié)構(gòu)如下:


03.png

這樣看來为流,泛化調(diào)用并不是一種很神秘的技術(shù),它仍然實在基于RPC底層通信的基礎(chǔ)之上進(jìn)行調(diào)用的让簿,跟普通RPC區(qū)別在于不在依賴多個服務(wù)提供方客戶端JAR包了敬察,入?yún)⒑统鰠⒕拖馜ubbo官方示例代碼中的一樣,完全用Map來代替尔当。泛化在RPC中出現(xiàn)的概念來與此莲祸,從具體到抽象,不在需要具體的POJO對象椭迎。

如何發(fā)布API接口到網(wǎng)關(guān)


網(wǎng)關(guān)系統(tǒng)與RPC環(huán)境起初是兩個環(huán)境的事務(wù)锐帜,網(wǎng)關(guān)系統(tǒng)不需要依賴RPC的存在,各有各的生命周期:


04.png

在RPC環(huán)境下畜号,調(diào)用者編寫好各自的業(yè)務(wù)邏輯代碼缴阎,通過提供者的客戶端JAR包調(diào)用提供者的服務(wù),注冊中心負(fù)責(zé)同步數(shù)據(jù)简软,如下圖所示蛮拔。這個時候網(wǎng)關(guān)系統(tǒng)跟RPC服務(wù)是沒有聯(lián)系的。


05.png

現(xiàn)在要把API網(wǎng)關(guān)暴漏給外部使用者替饿,我們通過前面介紹的泛化調(diào)用技術(shù)语泽,以不需要引入API客戶端的JAR包的方式調(diào)用服務(wù)提供者,如下圖所示:


06.png

現(xiàn)在的問題是如何把API接口發(fā)布到網(wǎng)關(guān)系統(tǒng)中视卢。實際問題是需要利用什么方法將RPC環(huán)境下的API接口讓網(wǎng)關(guān)也能識別識別到踱卵,剩余的工作還是交給RPC本身去完成,包括編解碼、序列化惋砂、反序列化妒挎、長連接等。

有了泛化調(diào)用作為基礎(chǔ)支持西饵,我們需要做的就是將API通過一種方式存儲到網(wǎng)關(guān)系統(tǒng)能夠訪問的一種存儲中酝掩,為了提高系統(tǒng)的性能一般會選用Redis存儲。根據(jù)泛化調(diào)用的方式眷柔,網(wǎng)關(guān)系統(tǒng)需要知道服務(wù)的類名和方法名期虾。網(wǎng)關(guān)系統(tǒng)可以提供一個API發(fā)布平臺入口,讓API發(fā)布者將RPC環(huán)境下的API數(shù)據(jù)錄入到API發(fā)布平臺驯嘱。RPC本身就可以為官網(wǎng)系統(tǒng)提供一個獲取API信息的接口镶苞,API發(fā)布平臺可以在用戶輸入服務(wù)的類名之后直接通過這個接口獲取要發(fā)布的API整體信息,包括所有的方法鞠评、入?yún)⒚尽⒊鰠ⅰ⒆⑨屘昊稀⒚枋隽恰⒔涌谪?fù)責(zé)人信息等。剩余的工作就可以交給API網(wǎng)關(guān)的泛化調(diào)用邏輯了负乡,如下圖:


07.png

總結(jié)


本片文章主要介紹了API網(wǎng)關(guān)的基石:泛化調(diào)用牍白,以及通過如何發(fā)布API到API網(wǎng)關(guān)示例來說明為什么被稱之為基石。

文章內(nèi)容來源:《架構(gòu)修煉之道》

更多個人博客:http://www.wangqi94.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖棘,一起剝皮案震驚了整個濱河市淹朋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钉答,老刑警劉巖础芍,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異数尿,居然都是意外死亡仑性,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門右蹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诊杆,“玉大人,你說我怎么就攤上這事何陆〕啃冢” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵贷盲,是天一觀的道長淘这。 經(jīng)常有香客問我剥扣,道長,這世上最難降的妖魔是什么铝穷? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任钠怯,我火速辦了婚禮,結(jié)果婚禮上曙聂,老公的妹妹穿的比我還像新娘晦炊。我一直安慰自己,他們只是感情好宁脊,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布断国。 她就那樣靜靜地躺著,像睡著了一般榆苞。 火紅的嫁衣襯著肌膚如雪并思。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天语稠,我揣著相機(jī)與錄音,去河邊找鬼弄砍。 笑死仙畦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的音婶。 我是一名探鬼主播慨畸,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衣式!你這毒婦竟也來了寸士?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤碴卧,失蹤者是張志新(化名)和其女友劉穎弱卡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體住册,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡婶博,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荧飞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡人。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叹阔,靈堂內(nèi)的尸體忽然破棺而出挠轴,到底是詐尸還是另有隱情,我是刑警寧澤耳幢,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布岸晦,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏委煤。R本人自食惡果不足惜堂油,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碧绞。 院中可真熱鬧府框,春花似錦、人聲如沸讥邻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兴使。三九已至系宜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間发魄,已是汗流浹背盹牧。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留励幼,地道東北人汰寓。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像苹粟,于是被迫代替她去往敵國和親有滑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容