---
title: "更彈性且開源的 API Gateway APISIX：實測與 Kong API Gateway 比較"
description: "用了 Kong 免費版踢到鐵板後，轉戰 APISIX 的實戰心得！從架設到比較，告訴你為什麼這個開源方案讓人驚艷。"
canonical_url: "https://blog.markkulab.net/post/apisix-openresty-gateway"
author: "Mark Ku"
author_url: "https://blog.markkulab.net/author/mark-ku"
site: "Mark Ku's Blog"
date_published: "2025-07-20 06:01:00 +0800"
category: "DevOps"
tags: ["apisix", "kong", "api-gateway", "openresty", "devops", "etcd", "rate-limiting"]
language: "zh-TW"
license: "CC BY 4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
attribution: "轉載或引用請註明作者並附上原文連結"
---

# 更彈性且開源的 API Gateway APISIX：實測與 Kong API Gateway 比較

## 為什麼會想試試 APISIX？

在使用 Kong 免費版的過程中，發現一些限制像Service 跟 Route 必須綁定 Service、不提供Consumer Group 功能受限等等，後來了解到 APISIX 這個開源方案，決定實際測試看看，經過實測後發現 APISIX 確實表現不錯，它是 Apache 基金會維護的項目，社群相當活躍，功能也很彈性，支援 Route Only 模式、Consumer Group、熱更新、多語言套件等等，是很值得考慮使用的 API Gateway 。

## 架設 Docker-compose 及相關設定檔

在架設的過程中，由於官方文件不夠詳細，版本相容性也有些問題，花了一些時間才成功建置環境。相關的設定檔已整理並放在 GitHub 上，有需要的朋友可以參考：

[GitHub repo](https://github.com/markku636/apisix)


## APISIX vs Kong 規格大PK

來看看這兩個到底差在哪裡：

| 項目 | **APISIX** | **Kong (OSS)** |
|----|----|----|
| 開源授權 | Apache 2.0 | Apache 2.0 |
| 核心技術 | NGINX + LuaJIT（OpenResty 底） | NGINX + LuaJIT（OpenResty 底） |
| 設定檔放哪 | etcd | PostgreSQL / DB-less 模式 |
| 怎麼設定 | REST API / etcd / YAML / Dashboard | REST API / YAML / Kong Manager（要錢） |
| 套件系統 | 熱更新，支援 Lua/Go/Java | Lua 套件、也能熱更新 |
| 效能表現 | 性能優秀，動態路由表現良好 | 穩定但比較保守 |
| 熱更新 | ✅ 支援不重啟服務即可加載套件 | ✅ 也支援熱更新，但沒這麼彈性(kong reload)，APISIX 在自動化程度上稍微勝出一些。 |
| 管理介面 | ✅ 開源版本即提供不錯的 Dashboard | 🔶 第三方有 Konga 可以用 |
| K8s 支援 | ✅ 原生 Ingress Controller | ✅ Kong Ingress Controller |
| 多語言套件 | ✅ Lua / Go / Java / Wasm 都行 | ❌ 只能用 Lua |
| Consumer Group | ✅ 內建支援，使用方便 | ❌ 免費版不支援 |
| 套件數量 | 60+ 個，持續增加中 | 50+ 個 |
| 限流機制 | 相當彈性，支援分散式架構 | 基本功能完整，也支援 Redis分散式架構 |
| 安全性套件 | ✅ JWT、key-auth、IP 限制、WAF 等功能完整 | ✅ JWT、ACL 等等 |
| API 文檔自動生成 | ✅ 內建功能 | ❌ 需自行實作 |
| gRPC / WebSocket | ✅ 原生支援，無需額外設定 | 🔶 需安裝 plugin |
| 社群活躍度 | 相當活躍，中國地區更新頻繁 | 穩定，全球用戶多 |
| 商業支持 | API7.ai | Kong Inc |
| 維護複雜度 | 稍微高一點（要顧 etcd） | 比較簡單（用 PostgreSQL） |


## 實測後發現 Kong 的限制
1. 免費版沒有Route only mode。
2. 免費版沒有consumer group 。
3. 免費版的限流功能，只能做到很基礎的限流。
4. 預設不支援動態路由，即便開啟，預設不支援路徑捕獲(得自己寫plugin)。


## Kong vs APISIX 路由設定比較

### 實際情況

假設你想要把 `/wms/api/item/1` 轉到 `http://172.62.1.1:1080/api/item/1`，來看看兩個怎麼做：

#### Kong 的設定方式（超麻煩）

1. 先建 Service：

```bash
POST http://localhost:8001/services
Content-Type: application/json

{
  "name": "wms",
  "url": "http://localhost:1081/"
}
```

2. 再建 Route：

```bash
POST http://localhost:8001/routes
Content-Type: application/json

{
  "name": "wms-api-item-1",
  "paths": ["~/wms/(?<path>api/item/1)$"],
  "strip_path": true,
  "path_handling": "v1",
  "service": {
    "name": "wms"
  },
  "tags": ["wms"]
}
```

3. 最後還要加個套件來改路徑：

```bash
POST http://localhost:8001/plugins
Content-Type: application/json

{
  "name": "request-transformer",
  "service": {
    "name": "wms"
  },
  "tags": ["wms"],
  "config": {
    "replace": {
      "uri": "/api/item/1"
    }
  }
}
```

> Kong 需要 3 次 API 呼叫，而且改路徑還需要額外安裝套件，設定流程較為複雜。

#### APISIX 的設定方式（簡化流程）

APISIX 支援 Route Only 模式，一次 API Call 即可完成設定：

```bash
PUT http://127.0.0.1:9180/apisix/admin/routes/api-0001
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "uri": "/wms/api/item/1",
  "name": "/wms/api/item/1",
  "priority": 10,
  "methods": ["GET", "POST", "PUT", "DELETE"],
  "plugins": {
    "proxy-rewrite": {
      "regex_uri": ["^/wms/(.*)", "/$1"]
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "172.62.1.1:1080": 1
    }
  }
}
```

> APISIX 僅需 1 次 API Call，內建的 proxy-rewrite 功能可直接處理路徑重寫，設定流程相當簡潔。

#### 設定複雜度比較

| 項目             | Kong                | APISIX             |
|------------------|---------------------|--------------------|
| 要先建 Service嗎 | ✅ 一定要            | ❌ 不用，直接建 Route |
| 要建 Route      | ✅                  | ✅                 |
| API Call 次數    | 3 次（較為繁瑣）      | 1 次（相對簡單）     |
| 設定複雜度       | 較為複雜             | 相對簡單           |


## 動態路由條件（彈性分流機制）

APISIX 的優勢之一是支援多種條件來決定路由，不僅是 URI，還可以根據 HTTP Method、Header、Query 參數、Host 等等，實現動態條件分流

### 常見的動態條件

- **HTTP Method**：可以指定 GET、POST、PUT、DELETE 等等
- **Header**：根據自訂的 Header 內容來分流
- **Query 參數**：看 URL 後面的參數來決定
- **Host**：根據請求的 Host 來分流
- **Remote Addr**：根據來源 IP 來分流

### 範例：根據 Header 來路由

```json
PUT http://127.0.0.1:9180/apisix/admin/routes/dynamic-header
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "uri": "/api/v1/resource",
  "methods": ["GET"],
  "name": "dynamic-header-route",
  "priority": 20,
  "vars": [
    ["http_x-user-type", "==", "admin"]
  ],
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "10.0.0.1:8080": 1
    }
  }
}
```
> 這樣設定的話，只有帶著 `X-User-Type: admin` header 的請求，才會被導到指定的 upstream。

### 範例：根據 Query 參數來路由

```json
PUT http://127.0.0.1:9180/apisix/admin/routes/dynamic-query
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "uri": "/api/v1/resource",
  "methods": ["GET"],
  "name": "dynamic-query-route",
  "priority": 10,
  "vars": [
    ["arg_version", "==", "beta"]
  ],
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "10.0.0.2:8080": 1
    }
  }
}
```
> 這個設定會把帶有 `?version=beta` 的請求，導到不同的 upstream。

P.S. APISIX 的路由條件設計相當彈性，可以根據各種請求屬性來做動態分流

## APISIX 的核心功能

實際使用後，推薦以下幾個實用功能：

- **Route Only 模式**：無需先建 Service，直接設定 Route 即可，流程簡化，減少設定步驟
- **Consumer Group**：雖然沒有 UI，但可透過 API 操作，分群管理相當靈活（不過一個 Consumer 只能加入一個 Consumer Group）
- **動態路由**：可根據 Header、Query 參數、IP 等條件動態分流，提供靈活的流量導向
- **限流動態模板 Key**：支援多變數組合限流（IP+Consumer+Header），Kong 付費版才有的功能，APISIX 開源版即提供
- **熱更新套件**：支援不重啟服務即可加載新套件或修改設定，便於維運，確保服務連續性
- **多語言套件**：支援 Lua、Go、Java、Wasm 等多種語言
- **彈性配置**：支援 RESTful API、etcd、YAML 等多種配置方式

### Route Only 實測

還是用剛剛 /wms/api/item/1 轉址的例子：

```bash
PUT http://127.0.0.1:9180/apisix/admin/routes/api-0001
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "uri": "/wms/api/item/1",
  "name": "/wms/api/item/1",
  "priority": 10,
  "methods": ["GET", "POST", "PUT", "DELETE"],
  "plugins": {
    "proxy-rewrite": {
      "regex_uri": ["^/wms/(.*)", "/$1"]
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "172.62.1.1:1080": 1
    }
  }
}
```

---

## Consumer Group 與限流設定

APISIX 的 Consumer Group 功能相當實用，雖然沒有 UI 介面，但透過 API 操作也很方便，可以搭配 Plugin Config 來實現分群限流：

```bash
PUT http://localhost:9180/apisix/admin/consumer_groups/free
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "plugins": {}
}
```

建立限流的 Plugin Config：

```bash
PUT http://localhost:9180/apisix/admin/plugin_configs/free_ratelimit
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "plugins": {
    "key-auth": {},
    "limit-count": {
      "count": 100,
      "time_window": 1,
      "rejected_code": 429,
      "key": "consumer_name",
      "policy": "local",
      "group": "daily"
    }
  }
}
```

建立 Consumer 並套用群組：

```bash
PUT http://localhost:9180/apisix/admin/consumers/mark
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "username": "mark",
  "plugins": {
    "key-auth": {
      "key": "mark-api-key"
    }
  },
  "consumer_group": "standard"
}
```
> 注意喔！一個 consumer 只能加入一個 consumer group

## 限流功能

APISIX 在限流方面表現優秀，支援類似 Kong 付費版才有的「動態模板 key」功能。可以在 key 欄位中使用多個變數（如 IP、consumer、header 等）組合，實現精細的分群限流。

舉例來說：

```bash
PUT /apisix/admin/plugin_configs/pc_free
{
  "plugins": {
    "limit-count": {
      "time_window": 60,
      "count": 100,      
      "rejected_code": 429,            
      "key_type": "var_combination",      
      "key": "standard-1-47|$consumer_name", 
      "policy": "redis",      
      "redis_host": "192.168.0.15",
      "redis_port": 6379,
      "redis_timeout": 1000000,
      "redis_database": 0
    }
  }
}
```
P.S. 這個實測有問題，應該是有bug


> 這個設定會根據來源 IP、consumer 名稱、以及 header `X-User-Group` 的組合，動態計算每個分群的頻次，限流資料儲存在 Redis 中。這種彈性分群限流功能，Kong 需企業版才提供，APISIX 開源版即內建此功能。

---

## Plugin Config 與套件綁定層級

APISIX 支援多個層級的套件綁定，讓你可以很彈性地管理：

| 層級 | 綁定方式 | 說明 |
|----|----|----|
| Global Rule | /apisix/admin/global_rules | 全域規則，優先權最高 |
| Consumer | /apisix/admin/consumers/{username} | 針對特定使用者 |
| Consumer Group | /apisix/admin/consumer_groups/{groupname} | 分群管理 Consumer |
| Route | /apisix/admin/routes/{id} | 針對特定 API 路由 |
| Service | /apisix/admin/services/{id} | 多個 Route 可以共用 |

Plugin Config 可以重複使用，讓 Route/Service 直接引用 plugin_config_id，維運效率大大提升！

---

## API 分組與查詢

APISIX 支援 labels 功能，可以為 Route、Consumer、Service 加上 group 標籤，便於查詢和管理：

```json
{
  "uri": "/wms/api/item/1",
  "labels": {
    "group": "wms"
  },
  "name": "get-wms-item-1"
}
```

想查詢 group 是 wms 的 route，直接這樣打：

```bash
GET /apisix/admin/routes?label=group==wms
```

---

## 全域套件與監控設定

可以用 Global Rule 來套用全域套件，像是 request-id、prometheus、udp-logger 等等：

```bash
PUT http://127.0.0.1:9180/apisix/admin/global_rules/1
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "plugins": {
    "key-auth": {"_meta": {"disable": false}},
    "request-id": {"_meta": {"disable": false}},
    "prometheus": {"_meta": {"disable": false}},
    "udp-logger": {
      "host": "192.168.0.1",
      "port": 5000,
      "custom_fields": {"client_ip": "$remote_addr"}
    }
  }
}
```
> 注意：APISIX 支援多筆 Global rules（有特殊用途），但 Dashboard 只能管理一筆。一般情況下，維持一筆 global_rule（如 /global_rules/1）即可滿足需求，將所有 plugin 配置在同一筆記錄中。

啟用 Prometheus 監控：

```bash
PUT http://localhost:9180/apisix/admin/plugins/prometheus
X-API-KEY: <your-api-key>
Content-Type: application/json

{
  "enabled": true
}
```

---

## APISIX 的限制（還是要知道一下）

雖然 APISIX 很強，但還是有一些限制要注意。不管是用 KONG 還是 APISIX，都各有各的限制，如果需要更複雜的流量分組，可能都需要自己寫 plugin，或是大幅度客製化：

- 一個 consumer 只能加入一個 consumer group
- 一個 route 只能套用一個 plugin config
- Route uri 不能重複
- 一個 Route 對同一種pluing只能套一個 plugin 
- plugin_config 不可以 group 或動態條件切換，但可以透過動態路由條件
- 一個限流設定只能限制單一時間
- [有些套件在某有些版本 bug](https://github.com/apache/apisix/issues/12431)

---

## 心得分享

使用 APISIX 一段時間後，認為這個開源方案確實很不錯。其高彈性、熱更新、多語言套件等優勢，使其成為現代 API Gateway 的優質選擇，雖然有些功能需要透過 API 操作，維運複雜度稍微高一些，但對於需要高彈性、分群限流、動態路由的場景來說，APISIX 提供了完善的解決方案，了解這些限制之後，就能更清楚該提供什麼樣的解決方案。但在特定領域的 API Gateway 需求如果過於複雜，即使使用付費版本，除非需求可以調整，否則最終還是可能需要客製化開發。

---

## 關於本文與作者

本文出自 [Mark Ku's Blog](https://blog.markkulab.net/post/apisix-openresty-gateway)

授權條款： [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — 轉載或引用請註明作者並附上原文連結

### 關於作者

**[Mark Ku](https://blog.markkulab.net/author/mark-ku)** — Software Solution Provider

- 10+ 年資深軟體工程師，現為 AI 應用 Builder
- 專注大型平台架構設計，從北美電商到AI SaaS訂閱收費系統
- 結合 AI Agent 與自動化，打造高效可演進的產品技術基礎

### 作者開發的免費工具

以下工具皆可免費使用：

- [免費 PDF 簽名工具](https://blog.markkulab.net/tools/pdf-sign): 線上 PDF 簽名工具，瀏覽器內完成手繪、打字、上傳簽名，可拖曳放置、縮放、下載。所有處理都在你的裝置完成，檔案不會上傳。
- [VS Code Refactory](https://blog.markkulab.net/tools/refactory): Refactory 是一款 VS Code 重構擴充套件：34 個重構動作、37 條 code smell 檢查、Code Health 儀表板、18 種語言、534 支測試。懂你的專案慣例：介面放哪、DI 註冊寫在哪、'use client' 該不該加；還會用 git 修改頻率 × 複雜度排出「該先修哪個檔案」，並一鍵把壞味道交給你自己電腦上的 Claude Code 修。免費使用，原始碼不離開你的機器。
- [DB-Kit 資料庫管理工具](https://blog.markkulab.net/tools/db-kit): DB-Kit 是一個用 Tauri + Rust + React 打造的輕量跨平台資料庫管理工具，用單一一致的介面同時管理 MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、SQLite、MongoDB、Redis、Kafka、Elasticsearch 與 RabbitMQ 十一種資料來源：連線密碼以 OS keychain 加密、SSH Tunnel、完整 CRUD、視覺化查詢建構器、多結果集同時顯示、跨連線資料傳輸與比對同步、Excel / CSV 匯入匯出、執行計畫視覺化、ER 圖、排程備份、SQL 壓力測試（p50～p99 延遲百分位）、15 條規則的 SQL 審查、Kafka 訊息瀏覽與監控告警；繁中 / 英文雙語介面，內建 AI 助手（自然語言生成 SQL、AI 審查與調校建議）與命令列工具 dbk。免費開源（MIT），提供 Windows / macOS / Linux 安裝檔。
- [VS Code Super Mermaid](https://blog.markkulab.net/tools/super-mermaid): Super Mermaid 是一款 VS Code 擴充套件：開箱即用的漂亮 Mermaid 圖表，自動上色、即時預覽、滑鼠平移縮放、PNG / SVG 高解析匯出，內建 21 種範本與多種主題。免費開源（MIT）。
- [React Super Mermaid](https://blog.markkulab.net/tools/react-super-mermaid): react-super-mermaid 是一個開源 React 元件庫：一行 <MermaidViewer> 即可渲染漂亮的 Mermaid 圖表，內建 colorful / sketch 主題、平移縮放、圖內搜尋、SVG / PNG 高解析匯出。輕量、SSR 安全、完整 TypeScript 型別。免費開源（MIT）。
- [Jira / Confluence Super Mermaid](https://blog.markkulab.net/tools/jira-super-mermaid): Atlassian Forge app：在 Jira issue 與 Confluence 內文直接寫 Mermaid 語法，畫流程圖、時序圖、狀態機與甘特圖。11 種圖表、SVG / PNG 匯出、明暗主題、完整中日韓文字支援。取得 Runs on Atlassian 資格：圖表存在你自己的站台，app 不呼叫任何第三方服務。免費，即將上架 Atlassian Marketplace。
- [Mermaid 線上預覽](https://blog.markkulab.net/tools/mermaid-preview): 在瀏覽器裡寫 Mermaid、即時看圖，整張圖表壓進網址就能分享。免註冊、不上傳伺服器，相容 mermaid.live 的分享連結。
- [React Intl Phone Number](https://blog.markkulab.net/tools/react-intl-phone-number): react-intl-phone-number 是一個開源 React 元件：framework-agnostic、不依賴 antd，提供 E.164 進出、可搜尋國旗 / 國碼下拉、可配置驗證等級（strict / mobile-strict / loose）、可主題化 CSS 與 i18n，電話邏輯由 google-libphonenumber 驅動。輕量、完整 TypeScript 型別。免費開源（MIT）。
- [Uptime Kuma Cluster](https://blog.markkulab.net/tools/uptime-kuma-cluster): 把單機版 Uptime Kuma 改造成高可用叢集：OpenResty + Lua 智慧負載平衡、MariaDB 共享狀態、健康檢查與自動 Failover，附叢集管理 REST API，一行 Docker Compose 啟動。免費開源（MIT）。
- [特教專案](https://blog.markkulab.net/education): 為特殊教育學生製作的學習教材

### 每日 Podcast

- [科技新鮮事](https://blog.markkulab.net/category/tech-news): 每日精選 AI 與科技趨勢，透過語音摘要快速掌握最新技術動態，涵蓋 AI 應用、軟體架構、DevOps 與工程實戰。 — RSS: https://blog.markkulab.net/feed.xml
- [AI股市蝦聊](https://blog.markkulab.net/category/ai-stock-chat): 每個交易日用 AI 分析台股盤勢，以雙人對話聊當天的盤中觀察與隔日預測。 — RSS: https://blog.markkulab.net/ai-stock-chat/feed.xml

### 電子報

[訂閱電子報](https://blog.markkulab.net/subscribe) — 第一時間收到新文章通知，無垃圾信、隨時可取消訂閱。
