一、什么是API網關
API網關是一個服務器,是系統的后端統一入口。首先,它會提供最基本的路由服務,將調用轉發到上游服務。其次,作為一個入口,它還可以進行認證,鑒權,限流等操作,對上游服務保護。所以說,有了API網關,就可以做到“一夫當關,萬夫莫開”。
從技術設計的角度上來說,API是一種抽象,它隔離了我們的使用以及實現;從開發管理的角度上來說,API是一種契約。
API網關是一種微服務的架構解決方案,服務於API“契約”精神,並盡可能的擴大這種契約的影響力,構建一種圍繞API開發的“生態”。
二、API網關特性
使用面向切面編程在完成一些功能時,可以讓代碼的侵入性更小,實現更加優雅。而在微服務架構中,API網關可以給整個微服務增加面向切面編程的能力。API網關特性如下:
- 路由轉發
之前說了「API網關」是內部微服務的對外唯一入口,所以外面全部的請求都會先發到這個「API網關」上,然后由「API網關」來根據不同的請求去路由到不同的微服務節點上。例如可以 根據路徑 來轉發、也可以 根據參數 來轉發。
並且由於內部微服務實例也會隨着業務調整不停的變更,增加或者刪除節點,「API網關」可以與「服務注冊」模塊進行協同工作,保證將外部請求轉發到最合適的微服務實例上面去。 - 負載均衡
既然「API網關」是內部微服務的單一入口,所以「API網關」在收到外部請求之后,還可以根據內部微服務每個實例的負荷情況進行動態的負載均衡調節。一旦內部的某個微服務實例負載很高,甚至是不能及時響應,則「API網關」就通過負載均衡策略減少或停止向這個實例轉發請求。當所有的內部微服務實例都處理不過來的時候,「API網關」還可以采用限流或熔斷的形式阻止外部請求,以保障整個系統的可用性。 - 安全認證
「API網關」就像是微服務的大門守衛,每一個請求進來之后,都必須先在「API網關」上進行身份驗證,身份驗證通過后才轉發給后面的服務,轉發的時候一般也會帶上身份信息。
同時「API網關」也需要對每一個請求進行安全性檢查,例如參數的安全性、傳輸的安全性等等。 - 日志記錄
既然所有的請求都需要走「API網關」,那么我們就可以在「API網關」上統一集中的記錄下這些行為日志。這些日志既可以作為我們后續事件查詢使用,也可以作為系統的性能監控使用。 - 數據轉換
因為「API網關」對外是面向多種不同的客戶端,不同的客戶端所傳輸的數據類型可能是不一樣的。因此「API網關」還需要具備數據轉換的功能,將不同客戶端傳輸進來的數據轉換成同一種類型再轉發給內部微服務上,這樣,兼容了這些請求的多樣性,保證了微服務的靈活性。
三、常用API網關及其原理
1)Kong
優點:
- 可擴展性,Kong依賴一個數據庫來實現配置存儲,依賴 serf 來實現 instance 之間的通信。任何一個節點修改了其他節點會收到通知並重新reload配置。
- 模塊化,Kong 可以方便地增加新的插件,並且插件可以通過 Restful API 進行管理。
缺點:
lua語言開發,某些功能是收費,維護成本高。
主要分析一下其源碼和原理:
- core目錄里面是一些基礎框架代碼,包括hooks,事件,插件基礎
- plugins目錄包括所有kong自帶的插件,kong的插件擴展有一套自己的規范,按照規范來非常容易地就能擴展kong
- dao是數據庫抽象層,目前kong自帶支持數據庫postgresql和cassandra。
- tools為一些工具函數,需要注意的是cache。因為所有配置(包括插件的配置)都會是用cache來緩存,為了減少讀取數據庫次數。
- api Kong會提供一個系列接口來更新配置
2)Netflix Zuul
Zuul1 是基於 Servlet 框架構建,如圖所示,采用的是阻塞和多線程方式,即一個線程處理一次連接請求,這種方式在內部延遲嚴重、設備故障較多情況下會引起存活的連接增多和線程增加的情況發生。
Zuul2 的巨大區別是它運行在異步和無阻塞框架上,每個 CPU 核一個線程,處理所有的請求和響應,請求和響應的生命周期是通過事件和回調來處理的,這種方式減少了線程數量,因此開銷較小。又由於數據被存儲在同一個 CPU 里,可以復用 CPU 級別的緩存,前面提及的延遲和重試風暴問題也通過隊列存儲連接數和事件數方式減輕了很多(較線程切換來說輕量級很多,自然消耗較小)
缺點: 沒有動態化配置,不利於管理。
3)sc-gateway
spring Cloud Gateway 是 Spring Cloud 的一個全新項目,基於webflux的,底層也是基於netty
,該項目是基於 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。
Spring Cloud Gateway 作為 Spring Cloud 生態系統中的網關,目標是替代 Netflix Zuul,其不僅提供統一的路由方式,並且基於 Filter 鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。
相關概念:
- Route(路由):這是網關的基本構建塊。它由一個 ID,一個目標 URI,一組斷言和一組過濾器定義。如果斷言為真,則路由匹配。
- Predicate(斷言):這是一個 Java 8 的 Predicate。輸入類型是一個 ServerWebExchange。我們可以使用它來匹配來自 HTTP 請求的任何內容,例如 headers 或參數。
- Filter(過濾器):這是
org.springframework.cloud.gateway.filter.GatewayFilter
的實例,我們可以使用它修改請求和響應。
工作流程:
缺點:沒有動態化的配置,只是spring-cloud體系的,其他的業務系統的接入、公用服務的實現、新上接口的添加、動態調整接口的限流速率等等很多問題都很棘手。
四、API網關優缺點
使用API網關的最大優點是,它封裝了應用程序的內部結構。客戶端只需要同網關交互,而不必調用特定的服務。API網關為每一類客戶端提供了特定的API。這減少了客戶端與應用程序間的交互次數,還簡化了客戶端代碼。
API網關也有一些不足,它增加了一個我們必須開發、部署和維護的高可用組件。為了暴露每個微服務的端點,開發人員必須更新API網關。API網關的更新過程要盡可能地簡單,這很重要。否則,為了更新網關,開發人員將不得不排隊等待。由於所有API請求都要經過網關,它很容易成為系統的性能瓶頸。不過,雖然有這些不足,但對於大多數現實世界的應用程序而言,使用API網關是合理的。
參考:
https://zhuanlan.zhihu.com/p/63944586
https://zhuanlan.zhihu.com/p/32660126
API網關作用、方案及如何選擇 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126
https://www.zhihu.com/question/309582197
https://tech.youzan.com/gateway/
https://mp.weixin.qq.com/s/QqFNcZfHdFbY31rVrsLsEA
https://www.zybuluo.com/yishuailuo/note/844059?utm_source=tool.lu
http://blog.didispace.com/hzf-ms-apigateway-1/
http://blog.didispace.com/hzf-ms-apigateway-2/#lg=1&slide=1
API網關作用、方案及如何選擇 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126
API網關作用、方案及如何選擇 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126
API網關作用、方案及如何選擇 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126
API網關作用、方案及如何選擇 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126