我是做客戶端開發的,老是聽到服務端開發的同學提到網關,最近培訓課上一位老師又講到了網關,雖然不知道是什么,但是聽他講的就是很好,非常方便,所以就來學習一下了。
1. 什么是 API 網關(API Gateway)
1.1. 定義
API 網關是一個處於應用程序或服務(提供 REST API 接口服務)之前的系統,用來管理授權、訪問控制和流量限制等,這樣 REST API 接口服務就被 API 網關保護起來,對所有的調用者透明。因此,隱藏在 API 網關后面的業務系統就可以專注於創建和管理服務,而不用去處理這些策略性的基礎設施。
網關的角色是作為一個 API 架構,用來保護、增強和控制對於 API 服務的訪問。
1.2. 職責
2. 為什么用API Gateway
API gateway是位於客戶端和API之間的一個單點入口,它作為反向代理將客戶端請求路由到后面的一組API。同時,API gateway可以承擔cross-cutting交叉功能,如安全與認證,請求速率管理,日志,緩存等。
如果沒有API gateway,客戶端就會直接把請求發給API,此時可能會有下列問題:
1)客戶端調用代碼復雜,客戶端需要和多個API交互,並且處理來自不同API的不同錯誤。
2)客戶端與API之間的耦合度高,客戶端需要知道各個API的調用細節,當API的接口發生變化,客戶端也需要進行更改。
3)客戶端的一次操作可能需要調用多個API接口,此時會產生多次網絡調用並增加延遲。
4)每個面向公共網絡調用的API都需要實現安全,請求速率管理等功能,都需要經過安全測試。
5)API必須使用對調用端友好對通信協議,如http或者websocket。
3. 如何使用API Gateway
API Gateway是一個服務器,它是系統的單一入口點。它類似於面向對象設計中的立面模式。API Gateway封裝了內部系統體系結構,並提供了適合每個客戶端的API。它可能具有其他職責,如身份驗證、監視、負載平衡、緩存、請求形成和管理以及靜態響應處理。
下圖顯示了API Gateway通常是如何適應體系結構的:
API Gateway負責請求路由、組合和協議轉換。所有來自客戶端的請求首先通過API Gateway。然后它將請求路由到適當的微服務。API Gateway通常通過調用多個微服務並聚合結果來處理請求。它可以在內部使用的web協議(如HTTP和WebSocket)和web不友好協議之間進行轉換
API Gateway還可以為每個客戶端提供自定義API。它通常為移動客戶端公開粗粒度API。例如,考慮產品詳細信息場景。API Gateway可以提供一個端點(/productdetails?productid=xxx),使移動客戶端能夠通過一個請求檢索所有產品細節。API Gateway通過調用各種服務(產品信息、建議、評論等)並結合結果來處理請求。
Netflix 是使用API Gateway的一個成功案例, Netflix流媒體服務可以在數百種不同的設備上使用,包括電視、機頂盒、智能手機、游戲系統、平板電腦等。最初,Netflix試圖為其流媒體服務提供一種一刀切的API。然而,他們發現,由於設備的多樣性和他們獨特的需求,它並不能很好地工作。今天,他們使用一個API Gateway,通過運行特定於設備的適配器代碼為每個設備量身定制API。適配器通常通過平均調用6到7個后端服務來處理每個請求。Netflix API Gateway每天處理數十億個請求。
4. 哪些API Gateway產品推薦
目前社區的關於 API Gataway 的項目有以下這些:
Tyk:Tyk是一個開放源碼的API網關,它是快速、可擴展和現代的。Tyk提供了一個API管理平台,其中包括API網關、API分析、開發人員門戶和API管理面板。Try 是一個基於Go實現的網關服務。
Kong:Kong是一個可擴展的開放源碼API Layer(也稱為API網關或API中間件)。Kong 在任何RESTful API的前面運行,通過插件擴展,它提供了超越核心平台的額外功能和服務。
Orange:和Kong類似也是基於OpenResty的一個API網關程序.
Netflix zuul:Zuul是一種提供動態路由、監視、彈性、安全性等功能的邊緣服務。Zuul是Netflix出品的一個基於JVM路由和服務端的負載均衡器。
apiaxle: Nodejs 實現的一個 API 網關。
api-umbrella: Ruby 實現的一個 API 網關。
AWS API gateway
Spring Cloud Gateway
參考資料:
https://www.jianshu.com/p/1803b8609e0b
https://www.imooc.com/article/287392
https://blog.csdn.net/rain_web/article/details/102469745
AMQP:(高級消息隊列協議)
https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol
REST API: