云原生架構(gòu)下的 API 網(wǎng)關(guān)實踐:Kong (一)

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 是可以同時處理成千上萬個請求的国夜。

image

還可以將 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ò)請求。

image

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)容词身,歡迎訂閱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悼凑,一起剝皮案震驚了整個濱河市偿枕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌户辫,老刑警劉巖渐夸,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渔欢,居然都是意外死亡墓塌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門奥额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苫幢,“玉大人,你說我怎么就攤上這事垫挨『危” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵九榔,是天一觀的道長哀峻。 經(jīng)常有香客問我涡相,道長,這世上最難降的妖魔是什么剩蟀? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任催蝗,我火速辦了婚禮,結(jié)果婚禮上育特,老公的妹妹穿的比我還像新娘丙号。我一直安慰自己,他們只是感情好缰冤,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布犬缨。 她就那樣靜靜地躺著,像睡著了一般锋谐。 火紅的嫁衣襯著肌膚如雪遍尺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天涮拗,我揣著相機(jī)與錄音乾戏,去河邊找鬼。 笑死三热,一個胖子當(dāng)著我的面吹牛鼓择,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播就漾,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼呐能,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抑堡?” 一聲冷哼從身側(cè)響起摆出,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎首妖,沒想到半個月后偎漫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡有缆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年象踊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚壁。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡杯矩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袖外,到底是詐尸還是另有隱情史隆,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布曼验,位于F島的核電站泌射,受9級特大地震影響头镊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魄幕,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颖杏。 院中可真熱鬧纯陨,春花似錦、人聲如沸留储。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽获讳。三九已至阴颖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丐膝,已是汗流浹背量愧。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留帅矗,地道東北人偎肃。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像浑此,于是被迫代替她去往敵國和親累颂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容