1. 概述
API網關作為統一的請求入口,對請求進行路由、負載均衡、協議轉換(http-->rpc)、安全防護、限流熔斷等,把與業務無關的邏輯提煉出來,與業務邏輯完全分離。
常見的API網關主要提供以下的功能:
- 反向代理和路由:大多數項目采用網關的解決方案的最主要的原因。給出了訪問后端 API 的所有客戶端的單一入口,并隱藏內部服務部署的細節。
- 負載均衡:網關可以將單個傳入的請求路由到多個后端目的地。
- 身份驗證和授權:網關應該能夠成功進行身份驗證并僅允許可信客戶端訪問 API,并且還能夠使用類似 RBAC 等方式來授權。
- IP 列表白名單/黑名單:允許或阻止某些 IP 地址通過。
- 性能分析:提供一種記錄與 API 調用相關的使用和其他有用度量的方法。
- 限速和流控:控制 API 調用的能力。
- 請求變形:在進一步轉發之前,能夠在轉發之前轉換請求和響應(包括 Header 和 Body)。
- 版本控制:同時使用不同版本的 API 選項或可能以金絲雀發布或藍/綠部署的形式提供慢速推出 API。
- 斷路器:微服務架構模式有用,以避免使用中斷。
- 多協議支持:WebSocket/GRPC。
- 緩存:減少網絡帶寬和往返時間消耗,如果可以緩存頻繁要求的數據,則可以提高性能和響應時間
- API 文檔:如果計劃將 API 暴露給組織以外的開發人員,那么必須考慮使用 API 文檔,例如 Swagger 或 OpenAPI。
2. 開源API網關對比
2.1. ingress(目前)
功能:
- 作用于 OSI 模型的第七層(應用層),主要管理基于域名或路徑的路由
- 主要負責流量的入口管理,對于出口和服務間通信不提供直接支持
- 適合基本的HTTP路由需求,它集成了負載均衡和SSL終端
- 部署簡單,易于設置和維護,適合小型或中等規模的應用。
缺點:
- 不支持復雜的業務場景,無法定制。
- 沒有管理的 UI 和管理 API,大部分的工作都需要手工配置 config 文件的方式來進行
2.2. istio
功能:
- 提供了一種方式來控制、管理和監視在多個微服務之間的網絡通信。服務網格是在應用程序之上,但在網絡層之下的一個基礎設施層。
- 提供了負載均衡、服務到服務的認證、流量轉移規則、故障注入、金絲雀發布、分布式蹤等功能,無需更改服務代碼
- 流量控制:Envoy通過HTTP,gRPC,WebSocket和TCP流量的豐富路由規則啟用細粒度的流量控制應用;支持請求路由和流量轉移,支持彈性功能,包括熔斷、超時、重試。
- 網絡彈性:Envoy包括對自動重試,斷路和故障注入的開箱即用支持;
- 安全性:Envoy還可以實施安全策略,并對基礎服務之間的通信應用訪問控制和速率限制;
缺點:
- 提供更為復雜和全面的功能集合,對于大型分布式應用是非常有用的,學習成本高。
- 接管所有服務到服務的通信,增加額外的通信開銷。
- 部署比較復雜
2.3. apisix
功能:
- 主要是第七層(應用層),但可以支持四層的 TCP/UDP 流量管理。
- 管理和優化路由,實現請求的負載均衡和故障轉移。
- 支持限流限速(可以基于速率、請求數、并發等維度限制)、熔斷、重試機制等,保護后端服務不被過載。
- 支持多種認證機制,例如 Key Auth、JWT、OAuth等,保障API的安全性。
- 提供高度可觀測性,集成如 Prometheus 和 Grafana 等工具來監控和分析API使用情況
- 可擴展性強,擁有靈活的插件機制
- 內置控制臺
缺點:
- 額外維護一套高可用的 etcd 集群
- 開源后有非常多的功能,但是缺少落地案例,沒有相關的文檔指引大家如何使用。
2.4. kong
功能:
- Kong通過在 openresty 各個階段加入了lua代碼來實現插件的注入和執行
- Authentication 身份認證插件:Kong 提供了 Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication 等等實現。
- Security 安全控制插件:ACL(訪問控制)、CORS(跨域資源共享)、動態SSL、IP 限制、爬蟲檢測等等實現。
- Traffic Control 流量控制插件:請求限流(基于請求計數限流)、上游響應限流(根據 upstream 響應計數限流)、請求大小限制等等實現。限流支持本地、Redis 和集群三種限流模式。
- Analytics & Monitoring 分析監控插件:對接 Datadog、Prometheus、Zipkin 等等監控系統的實現。
- Transformations 協議轉換插件:請求轉換(在轉發到 upstream 之前修改請求)、響應轉換(在 upstream 響應返回給客戶端之前修改響應)。
- Logging 日志應用插件:支持 TCP、UDP、HTTP、File、Syslog、StatsD、Loggly 等等方式傳輸日志。
缺點:
- 免費版不提供官方控制臺,但是有開源社區版本Konga控制臺
- 性能不如apisix,路由使用的是遍歷查找,當網關內有超過上千個路由時,它的性能就會出現比較急劇的下降。
- 需要依賴于PostgreSQL或Cassandra數據庫,這使Kong的整個架構非常臃腫,會帶來高可用的問題。如果數據庫故障了,那么整個API網關都會出現故障。
3. 總結
Nginx:Nginx 基于 C 開發的高性能 API 網關,擁有眾多的插件,如果API 管理的需求比較簡單,接受手工配置路由,Nginx 是個不錯的選擇。Kong:Kong 是基于 Nginx 的 API 網關,使用 OpenResty 和 Lua 擴展,后臺使用 PostgreSQL,功能眾多,社區的熱度很高,但是性能上看比起 Nginx 有相當的損失。如果功能和擴展性有要求,可以考慮 Kong。APISIX:APISIX 和 Kong 的架構類似,但是采用了云原生的設計,使用 ETCD 作為后臺,性能上比起 Kong 有相當的優勢,適合對性能要求高的云原生部署的場景。- 從性能,可維護性和高可用各方面綜合考慮,建議采用Apisix方案。