業界有不少流行的 API 網關,開源的有 Nginx、Netflix Zuul、Kong 等。固然 Kong 還有商業版,相似的商業版網關還有 GoKu API Gateway 和 Tyk 等。nginx
GoKu API Gateway 是由國內公司 eolinker 使用 Go 語言研發,擁有社區版和商業版,包含 API Gateway 和 Dashboard 兩部分。其中社區版本包含大量基礎功能,能夠知足中型企業和產品的使用;企業版本包含更多擴展;比較適合大型軟件和大型組織使用。git
Tyk 由國外的 TykTechnologies 公司研發,也是基於 Go 語言。Tyk 一切均導向收費版本,免費版本第一次申請有一年的使用受權。後端
下面將會介紹經常使用的 API 網關組件 Nginx、Zuul 和 Kong 的相關特性。api
Nginx 能夠說是互聯網應用的標配組件,主要的使用場景包括負載均衡、反向代理、代理緩存、限流等。跨域
Nginx 由內核和模塊組成,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件與客戶端請求進行 URL 匹配,用於啓動不一樣的模塊去完成相應的工做。緩存
Nginx 在啓動後,會有一個 Master 進程和多個 Worker 進程,Master 進程和 Worker 進程之間是經過進程間通訊進行交互的,如圖所示。Worker 工做進程的阻塞點是在像 select()、epoll_wait() 等這樣的 I/O 多路複用函數調用處,以等待發生數據可讀 / 寫事件。Nginx 採用了異步非阻塞的方式來處理請求,也就是說,Nginx 是能夠同時處理成千上萬個請求的。安全
還能夠將 Lua 嵌入到 Nginx 中,從而可使用 Lua 來編寫腳本,這樣就可使用 Lua 編寫應用腳本,部署到 Nginx 中運行,即 Nginx 變成了一個 Web 容器;這樣開發人員就可使用 Lua 語言開發高性能Web應用了。在開發的時候使用 OpenResty 來搭建開發環境,OpenResty 將 Nginx 核心、LuaJIT、許多有用的 Lua 庫和 Nginx 第三方模塊打包在一塊兒;這樣只須要安裝 OpenResty,不須要了解 Nginx 核心和寫複雜的 C/C++ 模塊就能夠,只須要使用 Lua 語言進行 Web 應用開發了。服務器
使用 Nginx 的反向代理和負載均衡可實現負載均衡及高可用,除此以外還須要咱們解決自注冊和網關自己的擴展性。restful
Zuul 是 Netflix 開源的微服務網關組件,它能夠和 Eureka、Ribbon、Hystrix 等組件配合使用。社區活躍,融合於 SpringCloud 完整生態,是構建微服務體系前置網關服務的最佳選型。Zuul 的核心是一系列的過濾器,這些過濾器能夠完成如下功能:網絡
上面說起的這些特性是 Nigix 所沒有的,Netflix 公司研發 Zuul 是爲了解決雲端的諸多問題(特別是幫助 AWS 解決跨 Region 狀況下的這些特性實現),而不只僅是作一個相似於 Nigix 的反向代理,固然,咱們能夠僅使用反向代理功能,這裏很少作描述。
Zuul 目前有兩個大的版本:Zuul1 和 Zuul2。
Kong 是 Mashape 開源的高性能高可用 API 網關和 API 服務管理層,一款基於 Nginx_Lua 模塊寫的高可用服務網關,因爲 Kong 是基於 Nginx 的,因此能夠水平擴展多個 Kong 服務器。經過前置的負載均衡配置把請求均勻地分發到各個 Server,來應對大批量的網絡請求。
Kong 主要有三個組件:
Kong 採用插件機制進行功能定製,插件集(能夠是 0 或 N 個)在 API 請求響應循環的生命週期中被執行。插件使用 Lua 編寫,基礎功能包括:HTTP 基本認證、密鑰認證、CORS(Cross-Origin Resource Sharing,跨域資源共享)、TCP、UDP、文件日誌、API 請求限流、請求轉發以及 Nginx 監控等。
Kong 網關具備如下的特性:
動態負載均衡、基於散列的負載均衡、斷路器、健康檢查、Websockets、OAuth2.0、日誌記錄、安全性、Syslog、監控、轉發代理、認證、速率限制、故障檢測和恢復
筆者在上面小節簡要介紹了 Nginx、Zuul 和 Kong 這三種 API 網關組件的功能和特性,並製做了以下的對比表格:
組件/指標 | Nginx | Zuul(1.x) | Kong 社區版 |
---|---|---|---|
API 註冊/動態路由 | 在Nginx中配置 | 動態路由 | 經過 Admin API 管理 |
支持協議 | RESTful API | RESTful API | RESTful API |
插件機制 | Lua 插件機制 | 能夠基於源碼定製開發,基於 Servlet/Filter | Lua 插件機制 |
安全認證 & 鑑權 | 插件支持 | 支持 OAuth、JWT 等 | 支持OAuth2.0、黑白名單、ACL、JWT、SSL 等 |
限流 | 插件 | 插件 | 支持Rate Limiting |
高可用集羣 | 配合硬件負載均衡 | 能夠經過部署多個 Zuul 作負載均衡 | 支持集羣 |
可管理性 | 無 | 沒有 GUI 管理臺 | 提供 Rest API 交互 |
性能 | 高 | 通常 | 高 |
日誌記錄 | Nginx 可靈活記日誌 | 可自行配置 | 日誌能夠記錄到磁盤,或者HTTP、TCP、UDP發出去 |
總得來講,Zuul 複雜度較低,上手簡單,能夠自定義開發,可是高併發場景下的性能相對較差;Nginx 性能經受得住考驗,配合 Lua 能夠引入各類插件,可是功能性相對較弱,須要開發者自身去完善不少功能;Kong 基於 Nginx、OpenResty 和 Lua,對性能要求高,須要對外開放,建議考慮使用 Kong。下面咱們將重點介紹。
更多內容,歡迎訂閱。