文章目錄
- apisix 快速入門
- 什么是apisix
- 有了 NGINX 和 Kong,為什么還需要 Apache APISIX?
- 軟件架構
- 基于 Nginx 開源版本,而 Nginx 并不支持動態配置,為什么 Apache APISIX 聲稱自己可以實現動態配置?
- 安裝
- 配置 APISIX
- 配置路由
- 配置負載均衡
- 密鑰驗證
- Key Authentication 是什么#
- 限速
apisix 快速入門
什么是apisix
官網:https://apisix.apache.org/zh/
官方文檔:https://apisix.apache.org/zh/docs/apisix/getting-started/README/
Apache APISIX 是 Apache 軟件基金會下的頂級項目,它是一個具有動態、實時、高性能等特點的云原生 API 網關。
你可以使用 APISIX 網關作為所有業務的流量入口,它提供了動態路由、動態上游、動態證書、A/B 測試、灰度發布(金絲雀發布)、藍綠部署、限速、防攻擊、收集指標、監控報警、可觀測、服務治理等功能。
APISIX 和其他的 API 網關有什么不同之處?#
Apache APISIX 在以下方面有所不同:
— 它使用 etcd 來保存和同步配置,而不是使用如 PostgreSQL 或 MySQL 這類的關系數據庫。etcd 中的實時事件通知系統比這些替代方案更容易擴展。這允許 APISIX 實時同步配置,使代碼簡潔,并避免單點故障。
- 完全動態
- 支持熱加載插件。
有了 NGINX 和 Kong,為什么還需要 Apache APISIX?
原文鏈接:https://xie.infoq.cn/article/04ec5ead0571ca4b4b1806ad0
總結
NGINX:雖然 NGINX 是一個穩定且廣泛使用的解決方案,但其社區活躍度低、動態配置能力不足,且對 gRPC 的支持有限。
Kong:Kong 在云原生架構方面有所優勢,但其控制面并不完全符合云原生標準,且對 PostgreSQL 的依賴限制了其彈性擴展能力。
活躍的開源社區:APISIX 是全球最活躍的開源 API 網關項目之一,擁有超過 200 位貢獻者,社區活躍度高于 NGINX 和 Kong。這種活躍度意味著更快的更新和更豐富的功能擴展。
支持多語言:APISIX 正在逐步支持多種編程語言(如 Java、Golang、Rust 和 NodeJS),使得開發者可以使用自己熟悉的技術棧進行開發。
軟件架構
官方文檔:https://apisix.apache.org/zh/docs/apisix/architecture-design/apisix/
Apache APISIX 是一個動態、實時、高性能的云原生 API 網關。它構建于 NGINX + ngx_lua 的技術基礎之上,充分利用了 LuaJIT 所提供的強大性能。
APISIX 在其核心中,提供了路由匹配、負載均衡、服務發現、API 管理等重要功能,以及配置管理等基礎性模塊。除此之外,APISIX 插件運行時也包含其中,提供原生 Lua 插件的運行框架和多語言插件的運行框架,以及實驗性的 Wasm 插件運行時等。APISIX 多語言插件運行時提供多種開發語言的支持,比如 Golang、Java、Python、JS 等。
APISIX 目前也內置了各類插件,覆蓋了 API 網關的各種領域,如認證鑒權、安全、可觀測性、流量管理、多協議接入等。當前 APISIX 內置的插件使用原生 Lua 實現,關于各個插件的介紹與使用方式,可以查看相關插件文檔。
基于 Nginx 開源版本,而 Nginx 并不支持動態配置,為什么 Apache APISIX 聲稱自己可以實現動態配置?
原文鏈接:https://apisix.apache.org/zh/blog/2021/08/25/why-apache-apisix-chose-nginx-and-lua/
Nginx 的路由需要在配置文件里面進行配置,每次更改路由,都需要 reload 之后才能生效。這是因為 Nginx 的路由分發只支持靜態配置,不能動態增減路由。
為了實現路由動態配置,Apache APISIX 做了兩件事:
- 在 Nginx 配置文件里面配置單個 server,這個 server 里面只有一個 location。我們把這個 location 作為主入口,這樣所有的請求都會走到這個地方上來。
- 我們用 Lua 完成路由分發的工作。Apache APISIX 的路由分發模塊,支持在運行時增減路由,這樣就能動態配置路由了。
你可能會問,在 Lua 里面做路由分發,會比 Nginx 的實現慢嗎?
就像前面提到過的一樣,凡是對性能要求比較高的,我們會把核心代碼用 C 改寫。我們的路由分發模塊就是這么干的。路由分發模塊在匹配路由時,會采用一個前綴樹來匹配。而這個前綴樹是用 C 實現的。感興趣的讀者可以看下代碼:https://github.com/api7/lua-resty-radixtree/ 。
采用 Lua 代碼來做路由還有一個好處:它減低了二次開發的門檻。
如果在路由過程中需要有特殊的邏輯,用戶可以實現成自定義的變量和運算符,比如通過 IP 庫匹配到的地理位置來決定采用哪條路由。用戶只需要寫一些 Lua 代碼,這要比修改 Nginx C module 的難度小多了。
在 Apache APISIX 里面,不僅僅路由是動態的,我們的 TLS 服務端證書和上游節點配置都是動態的,而且無需修改 Nginx —— 上述功能可以跑在官方的 Nginx + Lua 技術棧上。
總結: 動態性好一點,不用重reload nginx。
安裝
如果你在安裝 APISIX 時選擇了 Docker 或 Helm 安裝,那么 etcd 將會自動安裝;如果你選擇其他方法或者需要手動安裝 APISIX,請參考以下步驟安裝 etcd:
這里就是以docker安裝為主。
快速啟動腳本需要以下條件:
已安裝 Docker,用于部署 etcd 和 APISIX。
已安裝 curl,用于驗證 APISIX 是否安裝成功。
APISIX 可以借助 quickstart 腳本快速安裝并啟動:
curl -sL https://run.api7.ai/apisix/quickstart | sh
該命令啟動 apisix-quickstart 和 etcd 兩個容器,APISIX 使用 etcd 保存和同步配置。APISIX 和 etcd 容器使用 Docker 的 host 網絡模式,因此可以從本地直接訪問。
配置 APISIX
請不要手動修改 APISIX 安裝目錄下的 ./conf/nginx.conf 文件。當 APISIX 啟動時,會根據 config.yaml 的配置自動生成新的 nginx.conf 并自動啟動服務。
通過修改本地 ./conf/config.yaml 文件,或者在啟動 APISIX 時使用 -c 或 --config 添加文件路徑參數 apisix start -c
比如指定 APISIX 默認監聽端口為 8000,并且設置 etcd 地址為 http://foo:2379,其他配置保持默認。在 ./conf/config.yaml 中只需這樣配置:
apisix:node_listen: 8000 # APISIX listening portdeployment:role: traditionalrole_traditional:config_provider: etcdetcd:host:- "http://foo:2379"
更新 Admin API key
deployment:admin:admin_key-name: "admin"key: newsupersecurekey # 請修改 key 的值role: admin
建議修改 Admin API 的 key,保護 APISIX 的安全。
更新完成后,你可以使用新的 key 訪問 Admin API:
curl http://127.0.0.1:9180/apisix/admin/routes?api_key=newsupersecurekey -i
配置路由
在 APISIX 中,路由配置通常是動態管理的,而不是靜態寫在 config.yaml 文件中。
APISIX 的路由配置是動態管理的,主要通過 API 或控制面工具(如 APISIX Dashboard)進行配置,并存儲在 Etcd 中。config.yaml 文件主要用于配置 APISIX 的基本運行參數和與外部系統的集成設置。
Route 是什么#
Route(也稱之為路由)是訪問上游目標的路徑,在 Apache APISIX 中,Route 首先通過預定的規則來匹配客戶端請求,然后加載和執行相應的插件,最后將請求轉發至特定的 Upstream。
在 APISIX 中,一個最簡單的 Route 僅由匹配路徑和 Upstream 地址兩個信息組成。
Upstream 是什么#
Upstream(也稱之為上游)是一組具備相同功能的節點集合,它是對虛擬主機的抽象。Upstream 可以通過預先配置的規則對多個服務節點進行負載均衡。
創建路由#
你可以創建一個路由,將客戶端的請求轉發至 httpbin.org(這個網站能測試 HTTP 請求和響應的各種信息)。
通過下面的命令,你將創建一個路由,把請求http://127.0.0.1:9080/ip 轉發至 httpbin.org/ip:
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{"id": "getting-started-ip","uri": "/ip","upstream": {"type": "roundrobin","nodes": {"httpbin.org:80": 1}}
}'
如果配置成功,將會返回 HTTP/1.1 201 Created。
驗證#
curl "http://127.0.0.1:9080/ip"
你將會得到類似下面的返回:
{"origin": "183.94.122.205"
}
配置負載均衡
創建一個具有兩個上游服務的路由,訪問 /headers 將被轉發到 httpbin.org 和 mock.api7.ai 這兩個上游服務,并且會返回請求頭。
創建一個具有兩個上游服務的路由,訪問 /headers 將被轉發到 httpbin.org 和 mock.api7.ai 這兩個上游服務,并且會返回請求頭。
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{"id": "getting-started-headers","uri": "/headers","upstream" : {"type": "roundrobin","nodes": {"httpbin.org:443": 1,"mock.api7.ai:443": 1},"pass_host": "node","scheme": "https"}
}'
如果路由創建成功,你將會收到返回 HTTP/1.1 201 Created。
info
將 pass_host 字段設置為 node,將傳遞請求頭給上游。
將 scheme 字段設置為 https,向上游發送請求時將啟用 TLS。
密鑰驗證
APISIX 擁有靈活的插件擴展系統,目前有很多可用于用戶身份驗證和授權的插件。例如:
- Key Authentication
- Basic Authentication
- JSON Web Token (JWT) Authentication
- Keycloak
- Casdoor
- Wolf RBAC
- OpenID Connect
- Central Authentication Service (CAS)
- HMAC
- Casbin
- LDAP
- Open Policy Agent (OPA)
- Forward Authentication
- Multiple Authentications
本教程中,你將創建一個帶有 Key Authentication 插件的 消費者,并學習如何啟用和停用身份驗證插件。
Consumer 是什么#
Consumer(也稱之為消費者)是指使用 API 的應用或開發人員。
在 APISIX 中,消費者需要一個全局唯一的 名稱,并從上面的列表中選擇一個身份驗證 插件。
Key Authentication 是什么#
**Key Authentication(也稱之為密鑰驗證)**是一個相對比較簡單但是應用廣泛的身份驗證方法,它的設計思路如下:
管理員為路由添加一個身份驗證密鑰(API 密鑰)。
API 消費者在發送請求時,在查詢字符串或者請求頭中添加密鑰。
創建消費者#
創建一個名為 tom 的消費者,并啟用 key-auth 插件,密鑰設置為 secret-key。所有攜帶密鑰 secret-key 的請求都會被識別為消費者 tom。
caution
生產環境請使用復雜的密鑰。
curl -i "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d '
{"username": "tom","plugins": {"key-auth": {"key": "secret-key"}}
}'
如果消費者創建成功,你將得到返回 HTTP/1.1 201 Created。
啟用 Authentication#
在教程配置路由中,我們已經創建了路由 getting-started-ip,我們通過 PATCH 方法為該路由增加 key-auth 插件:
curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{"plugins": {"key-auth": {}}
}'
如果增加插件成功,你將得到返回 HTTP/1.1 201 Created。
禁用 Authentication#
將參數設置 _meta.disable 為 true,即可禁用密鑰驗證插件。
curl "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{"plugins": {"key-auth": {"_meta": {"disable": true}}}
}'
限速
APISIX 是一個統一的控制中心,它管理 API 和微服務的進出流量。除了客戶端發來的合理的請求,還可能存在網絡爬蟲產生的不必要的流量,此外,網絡攻擊(比如 DDos)也可能產生非法請求。
APISIX 提供限速功能,通過限制在規定時間內發送到上游服務的請求數量來保護 APIs 和微服務。請求的計數在內存中完成,具有低延遲和高性能的特點。
在教程配置路由中,我們已經創建了路由 getting-started-ip,我們通過 PATCH 方法為該路由增加 limit-count 插件:
curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{"plugins": {"limit-count": {"count": 2,"time_window": 10,"rejected_code": 503}}
}'
上述配置將傳入流量的速率限制為每 10 秒最多 2 個請求。
禁用 Rate Limiting#
將參數設置 _meta.disable 為 true,即可禁用限速插件。
curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{"plugins": {"limit-count": {"_meta": {"disable": true}}}
}'