微服務架構學習與思考(10):微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹
- 2022 年 10 月 20 日
- 筆記
- [04]架構-分佈式-微服務, API Gateway, 微服務, 微服務架構, 架構
微服務架構學習與思考(10):微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹
一、為什麼會有 API Gateway 網關
隨着微服務架構的流行,很多公司把原有的單體架構改造成了微服務架構。
第一步:拆分
微服務架構就是把一個大單體改造成一個一個小的應用。比如把一個電商網站,從單體改造成微服務架構,如下圖:
改造成微服務後,用戶通過 PC 和手機訪問電商應用,都是調用後面的微服務 API,而且各自要調用多個後端 API 服務才能拿到需要的數據。業務量小的時候,這種訪問方式沒有多大問題。用戶多了訪問量大了呢?這種方式就不能持續。
第二步:API 功能逐漸增多
如果後面業務發展較快,用戶需要的功能越來越多,那麼相應的後端微服務的數量也會越來越多,用上面這種方式來訪問,調用的微服務 API 數量越來越多,如果訪問量大服務器壓力就會加大,那能不能縮減下調用 API 的數量,減輕服務器訪問壓力?聚合服務,內部聚合一些 API 服務接口形成一個聚合服務,PC 或手機客戶端訪問這個聚合服務,是不是就減少了訪問次數?提高訪問性能,提升用戶體驗。
為了提高 API 服務的可用性,還會給 API 加上限流控制,超時控制,熔斷降級,API 隔離等功能。
為了提高 API 服務訪問安全性,還會給 API 加上訪問控制,比如進行 JWT 驗證,黑白名單機制。如下圖:
第三步:API 網關
想一想,每一個 API 服務都需要這些功能,那能不能把這些功能集和在一起?後面就不需要給每個 API 添加同樣的功能。減少開發時間。
這些功能都可以集成到 API Gateway 網關中,如下圖:
還有,要上線服務或重構 API 服務時,這種用戶直接訪問的方式,就會造成用戶訪問出現錯誤,對用戶體驗是很大傷害。API 網關屏蔽用戶直接訪問後端服務,它就可以平滑過渡這種發佈需求或重構 API 需求。
它還有負載均衡,後端服務可以進行相應擴展。
二、API 網關功能
通過上面介紹可以看到,API 網關可以統一後端的訪問,也就是用戶訪問後端服務必須通過 API 網關才能夠訪問到。API 網關統一管理了後端的服務接入服務。
它就相當於一尊門神,守護着後端的所有服務。
API 網關的功能:
-
API 管理:API 上線、下線,API 路由轉發
-
服務治理:限流控制,超時控制,熔斷降級
-
安全策略:統一身份認證,黑白名單機制
-
協議轉換:REST、gRPC、Dubbo 不同協議轉換
-
API 發佈策略:灰度發佈,流量染色
-
負載均衡:服務擴展,服務伸縮
其他一些功能:監控報警、鏈路追蹤、日誌收集審查等。
三、常見開源 API 網關介紹
在前面寫的關於微服務文章:微服務架構學習與思考(04):微服務技術體系 一文中又提到過一些開源網關軟件。這次再來詳細介紹下開源 API 網關軟件。
3.1 以 Nginx 為基礎的網關
以 Nginx 為基礎,在加上 Lua 語言來進行擴展編程的網關。
3.1.1 OpenResty
介紹:OpenResty® 是一個基於 Nginx 與 Lua 的高性能 Web 平台,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用於方便地搭建能夠處理超高並發、擴展性極高的動態 Web 應用、Web 服務和動態網關。
OpenResty 官網:官網地址
github:OpenResty github
看這個介紹,OpenResty 的功能不止於網關功能,還有高性能動態 Web 應用和服務。
它內部集成了大量精良的 Lua 庫,庫地址 。
有很多 Nginx API for lua,你可以自己用 lua 來編寫相關功能。
當然,它還提供一個企業級(收費服務)產品,提供了很多關於 API 網關功能,Web 界面的操作。
沒有找到與開源產品功能對比,只有企業級產品功能介紹。
3.1.2 Kong
Kong 網關介紹
kong 是一個高性能高可用易擴展的 API 網關和 API 服務管理的軟件,它基於 OpenResty(Nginx+Lua)。
它可以在物理機上運行也可以在 kubernetes 上運行。
kong 官網:官網地址
github地址:kong github
kong 也提供了一張使用網關前後的對比圖,可以直觀看到使用 API 網關的變化,API 自身的功能明顯減少,都集成到 kong 裏面:
(來自://github.com/Kong/kong)
一些通用的功能都集成到 kong 里,而後面 API/RPC 只需要編寫業務相關功能就可以了,簡化了 API 開發。
kong 架構
kong 架構圖:
- Admin API:通過 admin api 來管理 kong 的功能
- Plugins:插件,默認插件和用戶自定義插件
- Clustering & Database:存儲 kong 集群節點信息,API 信息,插件信息等。目前提供了 PostgreSQL 和 Cassandra 2 種支持,如果需要高可用建議使用 Cassandra。
- OpenResty:處理插件、運行插件程序
- Nginx:處理底層操作
功能簡介
- 開源產品和企業產品功能對比
kong 也提供了企業級產品,它還給出了 kong 開源產品和 kong 企業級產品功能對比圖,功能詳細對比在這裡 //docs.konghq.com/gateway/latest/#features。
可以看到,企業級產品比開源產品提供了豐富得多的功能,這樣才能給企業提供價值。
對比來看,開源功能相對企業版較少(開源產品功能也挺多),但是開源產品功能已經足夠小公司用,還能自定義插件功能。如果你有預算費用可以使用企業版,這樣更快還有官方諮詢服務。如果沒有預算,那開源也足夠用,也可自己開發插件。
- 開源產品功能
開源產品除了提供一些基礎功能:
包括 HTTP 基本認證、密鑰認證、CORS、監控、文件日誌、API 請求限流、請求轉發、緩存、SSL設置等基本功能,這些功能都是通過插件機制實現。
在 kong 3.0.x 文檔中,還看到了藍綠部署、cluster等功能,更多功能可以看文檔。
還有一些其他重要功能特性:
- 集群
kong 支持單節點集群和多節點集群。
單節點集群:連接到數據庫(Cassandra 或 PostgreSQL)的單個 Kong 節點創建一個節點的 Kong 群集。通過此節點的 Admin API 應用的任何更改都將立即生效。
多節點集群:多節點集群它是通過定期後台作業與其他節點進行數據同步。可以通過配置參數 db_update_frequency(默認 5 秒) 更改頻率,這個頻率更新有點慢。所以 kong 集群數據一致性是最終一致性。
kong 也給用戶提供了自定義插件的功能,如果你有需要,自己可以編寫插件來擴展 kong 的功能。
- 擴展功能-編寫插件
用戶可以編寫插件來對 kong 功能進行擴展,kong 的插件是在 API 請求響應循環的生命周期中被執行的。
kong 插件文檔,默認用 lua 語言來編寫插件,也可以用其它語言。
a. 編寫插件可以使用的語言 lua,Go,python,js
kong 在 2.6.x 支持了其他語言編寫插件,有 Go,python,js,文檔地址://docs.konghq.com/gateway/2.6.x/reference/external-plugins/。更老的版本應該也有支持的,得去看文檔。
它還有一個編寫插件的模板。
b. 插件市場 plugin hub
kong 也有自己的一個插件市場,也就是說你也可以給 kong 貢獻第三方插件,是優質插件可能會被收錄。
- 通過 admin-api 來管理 kong
詳細看文檔地址://docs.konghq.com/gateway/3.0.x/admin-api/
web UI 界面管理
kong 企業版提供了管理 UI,開源版本沒有管理 UI。但是程序員是多麼的勤奮也崇尚開源,所以就有很多開源貢獻的管理 UI,其中比較好用的,介紹 1 個, konga。
konga 看 github 上的更新時間,也是 3 年前了,也算比較老的了。
3.1.3 APISIX 網關
APISIX 介紹
Apache APISIX 是 Apache 軟件基金會下的雲原生 API 網關,它兼具動態、實時、高性能等特點,提供了負載均衡、動態上游、灰度發佈(金絲雀發佈)、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。我們可以使用 Apache APISIX 來處理傳統的南北向流量,也可以處理服務間的東西向流量。同時,它也支持作為 K8s Ingress Controller 來使用。
apisix 也是基於 nginx,openresty 的。
apisix 文檔:apisix doc
apisix github:apisix github
APISIX 架構
整體架構圖:
(from://apisix.apache.org/zh/docs/apisix/getting-started/)
從圖上可以看出,APISIX 底層基座也是基於 Nginx 和 OpenResty。運行在基座之上的是 APISIX 軟件。
-
底層技術基座:Nginx 和 OpenResty
-
APISIX軟件:看上面架構圖,
第一部分:APISIX Core,apisix 核心,包括 Lua 插件、多語言插件運行時(Plugin Runner)、Wasm 插件運行時等
第二部分:各種內置插件,包括可觀測性、安全、流量控制等插件。
APISIX 多語言插件運行時提供多種開發語言的支持,比如 Golang、Java、Python、JS 等。
技術架構圖:
從另外一個角度來看看apisix架構,分為數據面和控制面:
(from://github.com/apache/apisix)
- apisix 使用 etcd 作為配置中心來進行數據信息保存和同步配置。
特性功能
可以到 github 上看它的 Features,列舉了很多功能特性。
- 擴展能力-插件功能
a)apisix 內置了很多插件,可以看文檔 Plugins。
b)它也有一個插件市場,plugin hub。
c)當然你也可以自定義插件。這些看起來與 kong 開源版本擁有擴展功能差不多。
- 高可用集群
- Apache APISIX 的數據平面是無狀態的,可以進行隨意的彈性伸縮,前面加一層負載均衡即可
- Apache APISIX 的控制平面是依賴於 etcd cluster 的高可用實現的,不需要任何關係型數據庫的依賴
與 kong 區別:
這第二點與 Kong 集群有區別,Kong 集群依賴的是 Postgre 和 Cassandra。
Web UI
通過RESTful API 來管理 apisix,通過 Admin API 來管理 apisix 節點。通過 Control API 控制單個 apisix 數據平面行為。
官方還提供了一個 Dashboard,通過 UI 管理 apisix。
與 kong 區別:
kong 開源版本沒有這個 Dashboard 功能,企業版本有。
3.1.4 Orange 網關
這個 orange 也是一 OpenResty 為基礎開發的網關,
orange 官網: orange 地址
github 地址:orange github
orange 的功能相對於前面的 kong 和 apisix,比較少。所以它的架構肯定比他們簡單,可以作為學習之用。
如果你不需要那麼多功能,可以試用下這款 API 網關。
四、API 網關缺點
- 讓系統複雜度變高
在整個系統架構中,多一個了 API 網關,就多了一份維護工作,多了一處發生「危險」的地方。
- API 網關可能成為性能瓶頸
因為所有的流量都要經過 API 網關,可以通過擴展集群來解決。前面在加一組負載均衡設備等方法。
五、參考
- //openresty.org/ openresty 官網
- //github.com/openresty openresty github
- //github.com/openresty/lua-nginx-module lua 模塊
- //openresty.com.cn/cn/edge/ openresty edge 企業級產品
- //github.com/openresty/lua-nginx-module#nginx-api-for-lua nginx api for lua
- //konghq.com/ kong 官網
- //github.com/kong/kong kong github
- //docs.konghq.com/gateway/3.0.x/ Kong 3.0.x 文檔
- //docs.konghq.com/gateway/3.0.x/plugin-development/ kong 插件文檔
- //docs.konghq.com/gateway/3.0.x/production/clustering/ Kong 3.0.x 的集群文檔
- //docs.konghq.com/hub/ kong 插件 hub
- //github.com/Kong/kong-plugin 插件模板
- //github.com/pantsel/konga kong web ui
- //apisix.apache.org/zh/docs/apisix/getting-started/ apisix 文檔
- //apisix.apache.org/zh/docs/apisix/plugins/batch-requests 內置插件
- //apisix.apache.org/zh/plugins/ 插件市場
- //apisix.apache.org/zh/docs/apisix/control-api/
- //orange.sumory.com/docs/ orange 地址