簡單聊聊從 nginx 到 kong 的進化

大家好,我是飛哥!

在我們的傳統業務中,Nginx 在七層網關場景中應用得很廣。但是最近幾年由於微服務的盛行。Nginx 上的這套生態鏈也在不斷地進化。

2007 年國人章亦春大神在 Nginx 的基礎上開發出了 OpenResty。2009 年 marco 又在 OpenResty 上開發出了 kong。截止到寫稿時,該項目已經 33 k 的 star 了。

我今天藉助騰訊雲來帶大家學習下 kong 所具備的各種能力。

一、Nginx 是如何進化到 kong 的

在傳統的互聯網服務中,對網關的主要訴求就是反向代理、負載均衡、路由等基礎功能。

一個經典的業務的架構圖一般是採用四層 LVS 做 對外 IP 收斂,在七層採用 Nginx 來負責七層 HTTPS 協議接入,反向代理、負載均衡、路由。

Nginx 的每個 Worker 進程在底層都使用一個 epoll 對象,高效管理海量的 socket 連接上的網絡事件的處理。參見飛哥之前寫的搞懂 Nginx 高性能網絡工作原理!這篇文章。

性能上的問題是解決了,但是現在隨着微服務的發展,服務被拆的非常零散,降低了耦合度的同時也給服務的統一管理增加了難度。

例如服務發現。在 Nginx 中,所有的後端服務都是以靜態配置文件的形式記錄的。每當後端服務的 IP 發生變化的時候,需要重新修改配置文件。

但在微服務時代,後端都是用容器部署的,每次版本發佈都會導致 IP 的變化。而且微服務時代還需要動態的擴縮容,都會導致後端服務 IP 的變化。傳統的修改配置文件才能重新分配流量的方式顯然已經無法滿足需要。

除了服務發現以外,微服務時代對網關還有其他一些新的需求,例如限流、協議轉換、身份驗證、安全防護等功能,都需要在網關中能夠支持。

我們都知道,Nginx 是用 c 語言寫的。如果想在 Nginx 的基礎上開發這些功能,成本還是挺高的。首先 c 語言的門檻就會比其它語言要高一些。其次,每次功能的修改都需要重新編譯發佈 Nginx。

好在國人章亦春大神搞出了 OpenResty,將 Lua JIT 內嵌到了 Nginx 的內部,以支持通過 lua 語言對 Nginx 的能力進行方便地擴展開發。這樣每當有新功能擴展的時候,只需要將 lua 代碼發佈一下,然後將 Nginx reload 一下就 ok 了。

飛哥之前所負責的搜狗瀏覽器在不少的模塊中都是採用這種模式開發的,使用 lua 語言對 Nginx 功能進行擴展。既簡單方便,還基本接近原生 Nginx 的性能。

有了 OpenResty,網關方便地進行功能擴展的技術路徑就算是打通了。後來 Mashape 在 OpenResty 的基礎上迭代發佈了一個新網關 Kong。

我覺得 kong 最優雅的設計就是它的插件機制。該網關基於通過插件化的方式來支持網關功能的擴展,並提供了 60 多種插件。當對網關有特定需求的時候,直接選擇一個或者幾個插件就可以輕鬆在 Nginx 上支持新功能了。

Kong 的插件機制是其高可擴展性的根源,Kong 可以很方便地爲路由和服務提供各種插件,網關所需要的基本特性,Kong 都如數支持。如果現有的插件不能滿足你的,需求,你也可以使用 lua 語言輕鬆自己開發一個滿足自己需求的插件。

二、展示 kong 的功能

kong 的環境配起來還是有一點點小複雜的。它需要 Postgres 或者 Cassandra 等數據庫來管理路由配置,服務配置,upstream 配置等信息。還需要安裝 konga(最好的 kong 的管理程序)。

在騰訊雲上的微服務引擎中,已經集成了 kong 網關,可以一鍵配置,非常的方便。我就以騰訊雲上的 kong 爲例,來給大家展示一下 kong 所具備的功能。

在騰訊雲微服務引擎後臺一鍵就可以創建 kong 網關。

當你選擇好配置並創建 kong 實例後,其內部依賴的數據庫和管理程序 konga 就全都自動一鍵生成好了。

在 konga 管理後臺中,可以通過 service、route 菜單來管理服務以及路由。

接下來幾乎所有的工作都可以通過 konga 界面來可視化地完成。比如你想添加一個證書的話,直接點擊 “CERTIFICATES” 按鈕。填寫 Certificate、Key,並填域名到 Server Name Indications 中,單擊 SUBMIT CERTIFICATES 提交就完事。

服務是需要監控的。在 Google 的網站可靠性工程師小組(SRE)對服務提出了幾個需要監控的黃金指標,例如延遲、流量和錯誤。kong 可以很方便地和 Prometheus 等雲原生組件對接起來,以實現這些黃金指標的監控功能。

在騰訊雲中,不需要額外的配置,這些功能都自動的配置好了,直接在實例的監控頁查看即可。

kong 也可以 ELK 打通,實現日誌的查看與檢索。

如果想將日誌長期存儲的話,直接開啓 CLS 日誌服務的話就可以實現長期保存。

另外在 “PLUGINS” 菜單中,騰訊雲提供了各種內置插件可以直接選用。包含訪問鑑權、安全控制、運維支持、報文轉換、流量控制等五個大類,幾十個插件。

另外在界面上沒有展示的是,騰訊雲的 kong 還支持無損擴容,同城多活等高可用特性。

三、總結

在微服務時代,需要在網關上擴展很多功能。但是在 Nginx 裏這些功能擴展起來並不是很方便,需要開發熟悉 c 語言,而且發佈起來也得重新編譯,很費勁。

OpenResty 支持了 lua JIT,使得可以通過簡單的 lua 語言來擴展網關的功能。kong 網關根據微服務對網關的需求,通過插件機制對網關進行功能擴展。並開發了許多現成的插件,直接拿來即用。

最後我又藉助騰訊雲給大家展示了是如何通過 konga 配置網關,對服務的黃金指標進行監控,並進行日誌檢索的。在部署使用以及運維上,騰訊雲也更方便易用,而且也穩定。

總之,在今天的互聯網中,kong 可能比 nginx 更加適合業務!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/BGzlJh8MIYnqZgDu8kE0Bg