微服務(wù)架構(gòu)下的API Gateway

工作中寫(xiě)了很多RESTful API芍殖,也用了Axway作為API Gateway,這篇文章希望總結(jié)一下API Gateway的知識(shí)點(diǎn)。

API gateway

什么是API gateway?API gateway解決哪些問(wèn)題呵晨?

在微服務(wù)架構(gòu)中,每個(gè)客戶(hù)端需要調(diào)用一個(gè)或者多個(gè)API熬尺,那么客戶(hù)端如何知道要調(diào)用的后端接口是什么摸屠?當(dāng)引入新的API接口或者現(xiàn)有API接口被更新時(shí),如何把信息同步給客戶(hù)端粱哼?以及API如何處理安全餐塘,日志,限速等所有API都需要考慮的問(wèn)題皂吮?

API gateway是位于客戶(hù)端和API之間的一個(gè)單點(diǎn)入口戒傻,它作為反向代理將客戶(hù)端請(qǐng)求路由到后面的一組API。同時(shí)蜂筹,API gateway可以承擔(dān)cross-cutting交叉功能需纳,如安全與認(rèn)證,請(qǐng)求速率管理艺挪,日志不翩,緩存等。如果沒(méi)有API gateway麻裳,客戶(hù)端就會(huì)直接把請(qǐng)求發(fā)給API口蝠,此時(shí)可能會(huì)有下列問(wèn)題:

1)客戶(hù)端調(diào)用代碼復(fù)雜,客戶(hù)端需要和多個(gè)API交互津坑,并且處理來(lái)自不同API的不同錯(cuò)誤妙蔗。

2)客戶(hù)端與API之間的耦合度高,客戶(hù)端需要知道各個(gè)API的調(diào)用細(xì)節(jié)疆瑰,當(dāng)API的接口發(fā)生變化眉反,客戶(hù)端也需要進(jìn)行更改昙啄。

3)客戶(hù)端的一次操作可能需要調(diào)用多個(gè)API接口,此時(shí)會(huì)產(chǎn)生多次網(wǎng)絡(luò)調(diào)用并增加延遲寸五。

4)每個(gè)面向公共網(wǎng)絡(luò)調(diào)用的API都需要實(shí)現(xiàn)安全梳凛,請(qǐng)求速率管理等功能,都需要經(jīng)過(guò)安全測(cè)試梳杏。

5)API必須使用對(duì)調(diào)用端友好對(duì)通信協(xié)議韧拒,如http或者websocket。

API gateway歸納為三種模式

1)路由:API gateway作為反向代理將客戶(hù)端的請(qǐng)求路由到API十性,API gateway作為單點(diǎn)入口對(duì)客戶(hù)端和API進(jìn)行解耦叛溢。

2)聚合:當(dāng)客戶(hù)端的某個(gè)操作需要調(diào)用多個(gè)API時(shí),API gateway可以把多個(gè)API請(qǐng)求聚合為一個(gè)請(qǐng)求烁试,即客戶(hù)端發(fā)送一個(gè)請(qǐng)求至API gateway,API gateway分發(fā)多個(gè)請(qǐng)求到各個(gè)API拢肆,并且將各個(gè)API返回到應(yīng)答聚合成一個(gè)應(yīng)答返回給客戶(hù)端减响,從而達(dá)到降低請(qǐng)求交互次數(shù)的作用晰赞。

3)卸載:API gateway可以卸載 API的功能步氏,尤其是一些crossing cutting交叉功能问慎。因此我們可以在API gateway單點(diǎn)實(shí)現(xiàn)功能闰挡,而不是在各個(gè)API上重復(fù)實(shí)現(xiàn)诅迷,尤其是一些專(zhuān)業(yè)性要求高的庵朝,如安全的實(shí)現(xiàn)衬以,而API則可以專(zhuān)注于業(yè)務(wù)邏輯李根。

綜上攒庵,我們對(duì)API gateway有了基本對(duì)認(rèn)識(shí)嘴纺,接下來(lái)介紹兩種API gateway產(chǎn)品:AWS API gateway,Kong API gateway

AWS API gateway

AWS API gateway Overview

AWS API gateway overview

如圖所示浓冒,AWS API gateway支持客戶(hù)端包括:移動(dòng)端應(yīng)用栽渴,網(wǎng)頁(yè)應(yīng)用和web服務(wù),支持的后端調(diào)用包括:部署在amazon EC2上的服務(wù)稳懒,使用AWS lambda實(shí)現(xiàn)的serverless服務(wù)闲擦,以及其他部署可以通過(guò)公共網(wǎng)絡(luò)訪問(wèn)的接口。AWS API gateway依托于AWS平臺(tái)及其豐富的組件场梆,比如基于amazon CloudWatch提供監(jiān)控相關(guān)功能墅冷,基于AWS Lambda提供Serverless功能,基于AWS CloudTrail提供審計(jì)功能等等或油。

另外寞忿,AWS API gateway還可以提供MOCK集成,即配置靜態(tài)應(yīng)答顶岸。這樣罐脊,只需要確定后端服務(wù)的接口定義定嗓,即使后端服務(wù)沒(méi)有開(kāi)發(fā)完成,也可以通過(guò)配置API gateway的Mock應(yīng)答萍桌,使得客戶(hù)端的開(kāi)發(fā)和測(cè)試可以順利進(jìn)行宵溅,從而解耦了客戶(hù)端和API的開(kāi)發(fā)測(cè)試過(guò)程。

AWS API gateway提供的主要功能

1. Security and Authorization

1)AWS API gateway可以保護(hù)后端API免受DDoS攻擊上炎。

2)通過(guò)AWS Cloudtrail記錄審計(jì)日志并持續(xù)監(jiān)控服務(wù)調(diào)用情況恃逻。

3)通過(guò)AWS IAM,AWS COGNITO藕施,AWS SIGNATURE V4等組件提供安全支持寇损,此外也支持通過(guò)AWS Lambda實(shí)現(xiàn)可定制的授權(quán)訪問(wèn)。

4)通過(guò)配置trusted relationship裳食,以白名單方式進(jìn)行訪問(wèn)控制矛市。

5)支持客戶(hù)端調(diào)用代碼的自動(dòng)生成,包括認(rèn)證授權(quán)的相關(guān)代碼诲祸。

2. Monitoring, Metrics and Logging

AWS API gateway通過(guò)AWS cloudwatch對(duì)API的調(diào)用情況浊吏,性能指標(biāo)和錯(cuò)誤率進(jìn)行監(jiān)控,并提供控制面板如下圖所示救氯。我們可以通過(guò)AWS控制面板監(jiān)測(cè)API的調(diào)用找田,API調(diào)用延遲,API集成延遲着憨,調(diào)用時(shí)出現(xiàn)的客戶(hù)端錯(cuò)誤及服務(wù)端錯(cuò)誤墩衙。

AWS控制面板

針對(duì)AWS cloudwatch提供的日志功能,AWS API gateway支持基于部署階段和API方法的配置甲抖。

基于stage的logging配置


基于method的logging配置

3. Throttling and Caching

AWS API gateway提供緩存及流量管理功能漆改。如下圖所示,當(dāng)請(qǐng)求到達(dá)AWS API gateway准谚,API gateway首先檢查請(qǐng)求資源是否存在于緩存中籽懦,如果存在,則直接返回緩存中的內(nèi)容氛魁。如果不存在暮顺,則檢查當(dāng)前的請(qǐng)求速率(RPS:Request Per Second),如果超過(guò)了允許的最大速率則返回HTTP status 429(Too Many Request)秀存,只有速率檢查通過(guò)捶码,才真正執(zhí)行后端調(diào)用。


AWS API gateway通過(guò)緩存后端返回的應(yīng)答或链,可以有效減少后端調(diào)用惫恼。通過(guò)流量管理,可以保護(hù)后端API經(jīng)受峰值流量的考驗(yàn)澳盐。

AWS API gateway支持部署階段級(jí)別的緩存和流量管理配置祈纯,支持API方法級(jí)別的流量管理配置令宿。

stage級(jí)別的緩存與流量管理配置
method級(jí)別的流量管理配置

4. Payload Modeling and Transformation

在API Gateway 中,客戶(hù)端發(fā)送的請(qǐng)求負(fù)載格式可能與后端API接受的請(qǐng)求負(fù)載格式不同腕窥。同樣粒没,API返回的響應(yīng)負(fù)載可能不同于客戶(hù)端接收的響應(yīng)負(fù)載。AWS API Gateway 提供映射模板將負(fù)載從客戶(hù)端請(qǐng)求映射到API接收的請(qǐng)求簇爆,以及從API響應(yīng)映射到相應(yīng)的客戶(hù)端響應(yīng)癞松。

映射模版是一個(gè)用Velocity模版語(yǔ)言表示的腳本。

AWS API gateway的映射模版配置如下圖所示:

請(qǐng)求負(fù)載映射模版配置


應(yīng)答負(fù)載映射模版配置

5. Native Code Generation

AWS API gateway提供自動(dòng)代碼生成功能來(lái)生成客戶(hù)端調(diào)用代碼入蛆,支持的語(yǔ)言平臺(tái)如下圖所示:

作為總結(jié)响蓉,AWS API gateway尤其適用于較多使用AWS平臺(tái)組件的組織。如果團(tuán)隊(duì)中使用Amazon ALM哨毁,包括CodeCommit, CodeDeploy and CodePipeline枫甲,那么和AWS API gateway的集成是非常非常方便的。最后扼褪,如果你希望基于AWS Lambda開(kāi)發(fā)微服務(wù)想幻,那么AWS API gateway也是首選。

AWS API gateway的其他優(yōu)勢(shì)包括:依托于AWS CloudFront的全球邊緣網(wǎng)絡(luò)作為基礎(chǔ)設(shè)施迎捺,為API調(diào)用提供盡可能低的網(wǎng)絡(luò)延遲举畸;基于請(qǐng)求和應(yīng)答數(shù)目計(jì)費(fèi)查排,沒(méi)有請(qǐng)求則無(wú)費(fèi)用產(chǎn)生凳枝。

Kong API gateway

首先kong API gateway分為社區(qū)版和企業(yè)版,其中社區(qū)版是開(kāi)源的跋核。之所以選擇Kong作為開(kāi)源API gateway來(lái)了解岖瑰,是因?yàn)閺腒ong社區(qū)版的官網(wǎng)上,我們可以看到:

“The World’s Most Popular Open Source Microservice API Gateway.”

下圖列舉了Kong API gateway提供的主要功能砂代,可以看到和AWS API gateway的區(qū)別并不大蹋订,就不重復(fù)說(shuō)明了。

Kong API gateway核心功能

Kong的特點(diǎn)在于刻伊,通過(guò)插件實(shí)現(xiàn)API gateway的可擴(kuò)展性露戒,我們可以通過(guò)配置插件來(lái)實(shí)現(xiàn)上述的功能,另外除了Kong本身提供的插件捶箱,我們也可以自定義插件智什。

負(fù)載均衡功能

除了上述功能,Kong還通過(guò)Ring-balancer的方式提供負(fù)載均衡功能丁屎。如下圖所示荠锭,配置一個(gè)可工作的ring-balancer,我們需要配置route晨川,service证九,upstream和targets删豺。按照自頂而下的順序:

1)配置route,路由規(guī)則為:當(dāng)請(qǐng)求頭部中的host設(shè)定為‘a(chǎn)ddress.mydomain.com’時(shí)愧怜,就路由到‘a(chǎn)ddress service’呀页;

2)配置‘a(chǎn)ddress service’,將請(qǐng)求轉(zhuǎn)發(fā)給名為‘a(chǎn)ddress.v1.service’的upstream叫搁,且路徑為/address赔桌;

3)配置名為‘a(chǎn)ddress.v1.service’的upstream;

4)為上述upstream配置兩個(gè)target渴逻,配置屬性包括IP地址和權(quán)重疾党。比如下圖中target1具有權(quán)重100,target2具有權(quán)重50惨奕,則請(qǐng)求來(lái)臨時(shí)雪位,2/3會(huì)被分配到target1,1/3會(huì)被分配到target2梨撞。

Health Check & Circuit Breaker

基于ring-balancer雹洗,Kong API gateway還提供了health check和circuit breaker的功能。上面已經(jīng)說(shuō)過(guò)卧波,一個(gè)upstream包括多個(gè)target时肿,Kong提供兩種方式檢查target是否處于運(yùn)行狀態(tài),如果不是港粱,則負(fù)載均衡器不會(huì)向其發(fā)送請(qǐng)求螃成。

Kong API gateway提供兩種方式進(jìn)行health check:主動(dòng)檢查和被動(dòng)檢查。主動(dòng)檢查即周期性地發(fā)送請(qǐng)求至各個(gè)target查坪,基于target的應(yīng)答進(jìn)行判斷寸宏。被動(dòng)檢查即circuit breaker,Kong通過(guò)監(jiān)測(cè)發(fā)送給各個(gè)target的請(qǐng)求及應(yīng)答情況進(jìn)行判斷偿曙。

一般情況下氮凝,circuit breaker是指:當(dāng)A服務(wù)實(shí)時(shí)調(diào)用B服務(wù)時(shí),B有可能發(fā)生不可用或者高延遲的情況望忆,此時(shí)A的線程資源可能會(huì)在等待中被占用罩阵,最糟糕的情況會(huì)造成資源耗盡導(dǎo)致A也服務(wù)不可用,從而引發(fā)傳遞性失敗启摄。為了解決這個(gè)問(wèn)題稿壁,A服務(wù)可以通過(guò)代理訪問(wèn)B服務(wù),當(dāng)連續(xù)出現(xiàn)的失敗次數(shù)超過(guò)配置的門(mén)限時(shí)鞋仍,即觸發(fā)斷路常摧,接下來(lái)timeout時(shí)間內(nèi)對(duì)B服務(wù)的調(diào)用都會(huì)不經(jīng)嘗試,直接失敗。timeout時(shí)間過(guò)后落午,cirtuit breaker會(huì)允許通過(guò)一部分到B服務(wù)的請(qǐng)求谎懦,如果成功則繼續(xù)正常調(diào)用,如果失敗那么又開(kāi)始新一輪的timeout處理溃斋。

BFF模式與API gateway的結(jié)合

BFF模式即Backend For Frontend界拦。如何理解呢?假設(shè)我們要構(gòu)造一個(gè)寵物商店在線管理系統(tǒng)梗劫,且該系統(tǒng)基于微服務(wù)架構(gòu)享甸,而此時(shí)我們需要構(gòu)造一個(gè)寵物詳情頁(yè)面,包括web端和mobile端梳侨。首先蛉威,寵物詳情頁(yè)面的信息需要通過(guò)多個(gè)API來(lái)獲取,比如寵物基本信息API走哺,訂單API蚯嫌,庫(kù)存API,定價(jià)API等等丙躏。其次择示,網(wǎng)頁(yè)端和移動(dòng)端需要的信息不盡相同。

那么這種情況下API的應(yīng)答需要通過(guò)組合晒旅,裁剪栅盲,轉(zhuǎn)化以適應(yīng)客戶(hù)端的需求。因此Backend For Frontend就是通過(guò)介紹中間層废恋,來(lái)完成上述的組合谈秫,裁剪與轉(zhuǎn)化。而這一部分也是可以通過(guò)API gateway這一中間層來(lái)實(shí)現(xiàn)的拴签,相當(dāng)于前文中提到的API gateway aggregation模式孝常。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旗们,一起剝皮案震驚了整個(gè)濱河市蚓哩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌上渴,老刑警劉巖岸梨,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異稠氮,居然都是意外死亡曹阔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)隔披,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赃份,“玉大人,你說(shuō)我怎么就攤上這事∽ズ” “怎么了纠永?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谒拴。 經(jīng)常有香客問(wèn)我尝江,道長(zhǎng),這世上最難降的妖魔是什么英上? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任炭序,我火速辦了婚禮,結(jié)果婚禮上苍日,老公的妹妹穿的比我還像新娘惭聂。我一直安慰自己,他們只是感情好相恃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布彼妻。 她就那樣靜靜地躺著,像睡著了一般豆茫。 火紅的嫁衣襯著肌膚如雪侨歉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天揩魂,我揣著相機(jī)與錄音幽邓,去河邊找鬼。 笑死火脉,一個(gè)胖子當(dāng)著我的面吹牛牵舵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倦挂,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼畸颅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了方援?” 一聲冷哼從身側(cè)響起没炒,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犯戏,沒(méi)想到半個(gè)月后送火,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡先匪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年种吸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀非。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坚俗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猖败,我是刑警寧澤形耗,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站辙浑,受9級(jí)特大地震影響激涤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜判呕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一倦踢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侠草,春花似錦辱挥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至功蜓,卻和暖如春园爷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背式撼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工童社, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人著隆。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓扰楼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親美浦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弦赖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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