API 網(wǎng)關(guān)選型
業(yè)界有很多流行的 API 網(wǎng)關(guān)廓俭,開源的有 Nginx虐急、Netflix Zuul蝠筑、Kong 等狞膘。當(dāng)然 Kong 還有商業(yè)版,類似的商業(yè)版網(wǎng)關(guān)還有 GoKu API Gateway 和 Tyk 等什乙。
GoKu API Gateway 是由國內(nèi)公司 eolinker 使用 Go 語言研發(fā)挽封,擁有社區(qū)版和商業(yè)版捉捅,包含 API Gateway 和 Dashboard 兩部分少辣。其中社區(qū)版本包含大量基礎(chǔ)功能嗦哆,可以滿足中型企業(yè)和產(chǎn)品的使用聂儒;企業(yè)版本包含更多擴(kuò)展瓦盛;比較適合大型軟件和大型組織使用衡载。
Tyk 由國外的 TykTechnologies 公司研發(fā)烈菌,也是基于 Go 語言畴椰。Tyk 一切均導(dǎo)向收費版本弃舒,免費版本第一次申請有一年的使用授權(quán)癞埠。
下面將會介紹常用的 API 網(wǎng)關(guān)組件 Nginx、Zuul 和 Kong 的相關(guān)特性聋呢。
Nginx
Nginx 可以說是互聯(lián)網(wǎng)應(yīng)用的標(biāo)配組件苗踪,主要的使用場景包括負(fù)載均衡、反向代理削锰、代理緩存通铲、限流等。
Nginx 由內(nèi)核和模塊組成器贩,內(nèi)核的設(shè)計非常微小和簡潔颅夺,完成的工作也非常簡單,僅僅通過查找配置文件與客戶端請求進(jìn)行 URL 匹配蛹稍,用于啟動不同的模塊去完成相應(yīng)的工作吧黄。
Nginx 在啟動后,會有一個 Master 進(jìn)程和多個 Worker 進(jìn)程稳摄,Master 進(jìn)程和 Worker 進(jìn)程之間是通過進(jìn)程間通信進(jìn)行交互的稚字,如圖所示。Worker 工作進(jìn)程的阻塞點是在像 select()、epoll_wait() 等這樣的 I/O 多路復(fù)用函數(shù)調(diào)用處胆描,以等待發(fā)生數(shù)據(jù)可讀 / 寫事件瘫想。Nginx 采用了異步非阻塞的方式來處理請求,也就是說昌讲,Nginx 是可以同時處理成千上萬個請求的国夜。
還可以將 Lua 嵌入到 Nginx 中,從而可以使用 Lua 來編寫腳本短绸,這樣就可以使用 Lua 編寫應(yīng)用腳本车吹,部署到 Nginx 中運行,即 Nginx 變成了一個 Web 容器醋闭;這樣開發(fā)人員就可以使用 Lua 語言開發(fā)高性能Web應(yīng)用了窄驹。在開發(fā)的時候使用 OpenResty 來搭建開發(fā)環(huán)境,OpenResty 將 Nginx 核心证逻、LuaJIT乐埠、許多有用的 Lua 庫和 Nginx 第三方模塊打包在一起;這樣只需要安裝 OpenResty囚企,不需要了解 Nginx 核心和寫復(fù)雜的 C/C++ 模塊就可以丈咐,只需要使用 Lua 語言進(jìn)行 Web 應(yīng)用開發(fā)了。
使用 Nginx 的反向代理和負(fù)載均衡可實現(xiàn)負(fù)載均衡及高可用龙宏,除此之外還需要我們解決自注冊和網(wǎng)關(guān)本身的擴(kuò)展性棵逊。
Netflix Zuul
Zuul 是 Netflix 開源的微服務(wù)網(wǎng)關(guān)組件,它可以和 Eureka银酗、Ribbon辆影、Hystrix 等組件配合使用。社區(qū)活躍黍特,融合于 SpringCloud 完整生態(tài)秸歧,是構(gòu)建微服務(wù)體系前置網(wǎng)關(guān)服務(wù)的最佳選型。Zuul 的核心是一系列的過濾器衅澈,這些過濾器可以完成以下功能:
- 身份認(rèn)證與安全:識別每個資源的驗證要求,并拒絕那些與要求不符的請求谬墙。
- 審查與監(jiān)控:與邊緣位置追蹤有意義的數(shù)據(jù)和統(tǒng)計結(jié)果今布,從而帶來精確的生產(chǎn)視圖。
- 動態(tài)路由:動態(tài)地將請求路由到不同的后端集群拭抬。
- 壓力測試:逐漸增加指向集群的流量部默,以了解性能。
- 負(fù)載分配:為每一種負(fù)載類型分配對應(yīng)容量造虎,并棄用超出限定值的請求傅蹂。
- 靜態(tài)響應(yīng)處理:在邊緣位置直接建立部分響應(yīng),從而避免其轉(zhuǎn)發(fā)到內(nèi)部集群。
- 多區(qū)域彈性:跨越 AWS Region 進(jìn)行請求路由份蝴,旨在實現(xiàn) ELB(Elastic Load Balancing犁功,彈性負(fù)載均衡)使用的多樣化,以及讓系統(tǒng)的邊緣更貼近系統(tǒng)的使用者婚夫。
上面提及的這些特性是 Nigix 所沒有的浸卦,Netflix 公司研發(fā) Zuul 是為了解決云端的諸多問題(特別是幫助 AWS 解決跨 Region 情況下的這些特性實現(xiàn)),而不僅僅是做一個類似于 Nigix 的反向代理案糙,當(dāng)然限嫌,我們可以僅使用反向代理功能,這里不多做描述时捌。
Zuul 目前有兩個大的版本:Zuul1 和 Zuul2怒医。
- Zuul1 是基于 Servlet 框架構(gòu)建,如圖所示奢讨,采用的是阻塞和多線程方式稚叹,即一個線程處理一次連接請求,這種方式在內(nèi)部延遲嚴(yán)重禽笑、設(shè)備故障較多情況下會引起存活的連接增多和線程增加的情況發(fā)生入录。
- Netflix 發(fā)布的 Zuul2 有重大的更新,它運行在異步和無阻塞框架上佳镜,每個 CPU 核一個線程僚稿,處理所有的請求和響應(yīng),請求和響應(yīng)的生命周期是通過事件和回調(diào)來處理的蟀伸,這種方式減少了線程數(shù)量蚀同,因此開銷較小。
Kong
Kong 是 Mashape 開源的高性能高可用 API 網(wǎng)關(guān)和 API 服務(wù)管理層啊掏,一款基于 Nginx_Lua 模塊寫的高可用服務(wù)網(wǎng)關(guān)蠢络,由于 Kong 是基于 Nginx 的,所以可以水平擴(kuò)展多個 Kong 服務(wù)器迟蜜。通過前置的負(fù)載均衡配置把請求均勻地分發(fā)到各個 Server刹孔,來應(yīng)對大批量的網(wǎng)絡(luò)請求。
Kong 主要有三個組件:
- Kong Server :基于nginx的服務(wù)器娜睛,用來接收 API 請求髓霞。
- Apache Cassandra/PostgreSQL:用來存儲操作數(shù)據(jù)。
- Kong dashboard:官方推薦 UI 管理工具畦戒,當(dāng)然方库,也可以使用 restfull 方式管理 admin api。
Kong 采用插件機(jī)制進(jìn)行功能定制障斋,插件集(可以是 0 或 N 個)在 API 請求響應(yīng)循環(huán)的生命周期中被執(zhí)行纵潦。插件使用 Lua 編寫徐鹤,基礎(chǔ)功能包括:HTTP 基本認(rèn)證、密鑰認(rèn)證邀层、CORS(Cross-Origin Resource Sharing返敬,跨域資源共享)、TCP被济、UDP救赐、文件日志、API 請求限流只磷、請求轉(zhuǎn)發(fā)以及 Nginx 監(jiān)控等经磅。
Kong 網(wǎng)關(guān)具有以下的特性:
- 可擴(kuò)展性: 通過簡單地添加更多的服務(wù)器,可以輕松地進(jìn)行橫向擴(kuò)展钮追,這意味著您的平臺可以在一個較低負(fù)載的情況下處理任何請求预厌;
- 模塊化: 可以通過添加新的插件進(jìn)行擴(kuò)展,這些插件可以通過RESTful Admin API輕松配置元媚;
- 在任何基礎(chǔ)架構(gòu)上運行: Kong 網(wǎng)關(guān)可以在任何地方都能運行轧叽。可以在云或內(nèi)部網(wǎng)絡(luò)環(huán)境中部署 Kong刊棕,包括單個或多個數(shù)據(jù)中心設(shè)置炭晒,以及 public,private 或 invite-only APIs甥角。
動態(tài)負(fù)載均衡网严、基于散列的負(fù)載均衡、斷路器嗤无、健康檢查震束、Websockets、OAuth2.0当犯、日志記錄垢村、安全性、Syslog嚎卫、監(jiān)控嘉栓、轉(zhuǎn)發(fā)代理、認(rèn)證拓诸、速率限制胸懈、故障檢測和恢復(fù)
小結(jié)
筆者在上面小節(jié)簡要介紹了 Nginx、Zuul 和 Kong 這三種 API 網(wǎng)關(guān)組件的功能和特性恰响,并制作了如下的對比表格:
組件/指標(biāo) | Nginx | Zuul(1.x) | Kong 社區(qū)版 |
---|---|---|---|
API 注冊/動態(tài)路由 | 在Nginx中配置 | 動態(tài)路由 | 通過 Admin API 管理 |
支持協(xié)議 | RESTful API | RESTful API | RESTful API |
插件機(jī)制 | Lua 插件機(jī)制 | 可以基于源碼定制開發(fā),基于 Servlet/Filter | Lua 插件機(jī)制 |
安全認(rèn)證 & 鑒權(quán) | 插件支持 | 支持 OAuth涌献、JWT 等 | 支持OAuth2.0胚宦、黑白名單、ACL、JWT枢劝、SSL 等 |
限流 | 插件 | 插件 | 支持Rate Limiting |
高可用集群 | 配合硬件負(fù)載均衡 | 可以通過部署多個 Zuul 做負(fù)載均衡 | 支持集群 |
可管理性 | 無 | 沒有 GUI 管理臺 | 提供 Rest API 交互 |
性能 | 高 | 一般 | 高 |
日志記錄 | Nginx 可靈活記日志 | 可自行配置 | 日志可以記錄到磁盤井联,或者HTTP、TCP您旁、UDP發(fā)出去 |
總得來說烙常,Zuul 復(fù)雜度較低,上手簡單鹤盒,可以自定義開發(fā)蚕脏,但是高并發(fā)場景下的性能相對較差;Nginx 性能經(jīng)受得住考驗侦锯,配合 Lua 可以引入各種插件驼鞭,但是功能性相對較弱,需要開發(fā)者自身去完善很多功能尺碰;Kong 基于 Nginx挣棕、OpenResty 和 Lua,對性能要求高亲桥,需要對外開放洛心,建議考慮使用 Kong。下面我們將重點介紹题篷。
更多內(nèi)容词身,歡迎訂閱。