文章目錄
- 引言:APISIX 概述
- 基于Nginx構建的原因
- 基于etcd構建的原因
- 架構圖示
- 架構分層解析
- 管理層:人機交互與配置入口
- 控制層:配置管理與集群協調
- 數據面:請求處理與流量轉發
- 說明:關于OpenRestry
引言:APISIX 概述
APISIX(Apache APISIX)是一個高性能、可擴展的云原生 API 網關,基于 Nginx 和 etcd 構建。
作為微服務架構的流量入口,它提供了動態路由、負載均衡、服務發現、認證授權、可觀測性等核心能力。
其設計遵循"云原生"和"可擴展"理念,支持熱加載、動態配置和插件化架構,已成為 Apache 頂級項目,被廣泛應用于金融、電商、互聯網等領域的關鍵業務場景。
Apisix 基于 Nginx 和 etcd 構建,主要有以下原因:
基于Nginx構建的原因
- 高性能:Nginx 是一款基于 C 語言開發的高性能服務器軟件,其底層開發經過了深度優化,在處理高并發連接時表現出色,能夠同時處理超過十萬個并發連接的請求,性能達到極致,并且在大規模應用中得到了充分有效的驗證。Apisix 基于 Nginx 的網絡層,可以利用 Nginx 的高性能優勢,輕松應對高流量的 API 請求。
- 事件驅動模型:Nginx 采用事件驅動的異步非阻塞模型,這種模型使得 Nginx 在處理大量并發請求時,能夠避免線程切換帶來的開銷,提高資源利用率和響應速度。Apisix 基于 Nginx 內核的事件驅動模型,單進程即可支持 10 萬+并發連接,能夠高效地處理各種 API 流量。
- 可擴展性:通過 Lua 和 LuaJIT 技術,Apisix 可以在 Nginx 的基礎上進行靈活擴展。Lua 語言具有簡潔高效、易于學習和擴展的特點,開發人員可以方便地編寫 Lua 腳本,實現各種自定義的功能,如流量控制、日志記錄、安全檢測、故障注入等插件,同時支持用戶編寫自定義插件來對數據面進行擴充。
基于etcd構建的原因
- 分布式配置管理:etcd 是一個高可用的分布式鍵值(key - value)存儲系統,內部采用 raft 協議作為一致性算法,能夠保證數據在分布式環境下的一致性和可靠性。Apisix 利用 etcd 來存儲和同步網關的配置數據,管理員通過 admin API 或者 dashboard 對配置進行修改后,etcd 可以在毫秒級別內將配置變更通知到所有的數據面節點,確保整個集群的配置能夠及時、一致地更新。
- 服務發現與注冊:由于 Apisix 使用 etcd 作為配置中心,在與其他組件配合時非常方便,可以直接將 etcd 當作服務注冊發現中心來使用,支持服務的注冊和發現功能。當然,Apisix 同時也支持 Consul、Eureka、Nacos 等其他服務注冊中心,以滿足不同用戶的需求。
- 配置靈活性與動態性:etcd 的 watch 機制允許客戶端監控特定 key 的變化。在 Apisix 中,通過 etcd 的 watch 功能,各個節點可以實時感知配置的變化,并及時更新自身的配置,實現動態路由、動態插件配置等功能,無需手動重啟或重新加載配置,大大提高了網關的靈活性和可管理性。
架構圖示
架構分層解析
管理層:人機交互與配置入口
-
Dashboard(可視化界面)
- 提供圖形化操作面板,支持路由、服務、插件的可視化配置
- 集成監控看板,展示流量指標、錯誤率、插件運行狀態等數據
- 支持多租戶權限管理和操作審計
-
Admin API(管理接口)
- 基于RESTful設計的API接口,支持配置的增刪改查
- 具備灰度發布能力,可按版本、權重控制配置發布范圍
- 支持Webhook回調,可與CI/CD流程集成實現自動化部署
控制層:配置管理與集群協調
- etcd集群(分布式配置中心)
- 采用Raft共識算法保證配置強一致性,支持多節點高可用
- 存儲三類核心數據:
- 路由規則(URI匹配規則、負載均衡策略)
- 插件配置(限流策略、認證方式、日志格式)
- 服務節點信息(上游服務IP:Port、健康檢查狀態)
- 通過Watch機制實現配置變更的毫秒級推送,無需重啟節點
數據面:請求處理與流量轉發
-
APISIX Core(請求處理引擎)
- 基于OpenResty構建,采用多worker進程模型(每個worker獨立處理請求)
- 核心流程:
- 接收客戶端請求并解析URI
- 根據etcd配置執行路由匹配
- 按順序調用插件鏈處理請求
- 轉發請求到上游服務并處理響應
- 性能優勢:單節點可支撐10萬+并發連接,CPU多核利用率達90%以上
-
Plugin System(插件系統)
- 模塊化設計,100+官方插件覆蓋三大場景:
- 流量治理(限流、熔斷、重試、負載均衡)
- 安全防護(JWT認證、IP黑白名單、SQL注入防護)
- 可觀測性(Prometheus監控、Skywalking追蹤、Access Log記錄)
- 支持自定義插件開發,通過Lua腳本擴展功能,無需修改核心代碼
- 模塊化設計,100+官方插件覆蓋三大場景:
說明:關于OpenRestry
(1)基于 Nginx 的事件驅動模型
- 多進程架構:
- Master-Worker 模型:
- Master 進程:負責讀取配置、管理 Worker 進程(如啟動、重啟、優雅退出)。
- Worker 進程:處理實際請求,多個 Worker 進程通過共享內存實現數據交換。
- 異步非阻塞 I/O:
- 每個 Worker 進程采用 epoll/kqueue 等事件驅動機制,單進程可處理數萬并發連接。
- 請求處理過程中不阻塞線程,而是通過回調函數處理響應。
- Master-Worker 模型:
(2)請求處理階段:
Nginx 將請求處理分為多個階段(Phase),OpenResty 可在這些階段中插入 Lua 代碼:
- post-read:讀取請求頭后
- server-rewrite:服務器級別重寫
- find-config:查找匹配的 location
- rewrite:location 級別重寫
- access:訪問控制(如權限驗證)
- content:內容生成(核心處理階段)
- log:日志記錄
(3)LuaJIT 與 Nginx 的深度集成
-
LuaJIT 引擎:
- 即時編譯(JIT):將 Lua 代碼編譯為機器碼,性能接近 C 語言。
- 協程支持:Lua 協程(coroutine)實現輕量級線程,避免阻塞 Worker 進程。
-
ngx_lua 模塊:
OpenResty 通過 ngx_lua 模塊將 Lua 環境嵌入 Nginx,提供以下核心功能:- 請求上下文:通過
ngx
全局對象訪問請求信息(如ngx.var
、ngx.req
)。 - 非阻塞 I/O:支持異步訪問數據庫、緩存(如 Redis、MySQL)。
- 共享內存:通過
ngx.shared.DICT
實現 Worker 間數據共享。 - 定時器:支持異步定時任務(如
ngx.timer.at
)。
- 請求上下文:通過