工作中寫(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支持客戶(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ò)誤墩衙。
針對(duì)AWS cloudwatch提供的日志功能,AWS API gateway支持基于部署階段和API方法的配置甲抖。
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í)別的流量管理配置令宿。
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的映射模版配置如下圖所示:
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的特點(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模式孝常。