Kong 是什麼?
Kong 是一套基於 Nginx 和 OpenResty 的高效能 API Gateway,核心以 Lua 編寫,具備反向代理、API 管理與套件管理及擴充的應用,同時也繼承了Nginx 優點及特性,Kong 主要採用的資料是PostgreSQL 來儲存相關設定,也支援無資料庫(DB-less)模式,本身就提供Restful api 管理,非常適合 API 單一入口及API訂閱的場景。
Kong 可以做什麼?
- 負載平衡(反向代理)
- 統一 API 進入點(API Gateway)
- 支援多環境與版本部署
- API 使用統計與計費
- 安全驗證(API Key、JWT、OAuth2 等)
核心特性
- 管理與部署 RESTful API 變得簡單高效
- 支援 API 版本控管與權限驗證
- 可依使用者等級設定請求限制(Rate Limiting)
- 變更設定時,基於 Nginx 架構無須重啟服務
- 強大的插件機制,可擴充功能或自訂開發
官方文件
https://docs.konghq.com/gateway/latest/
類似工具
- Apache APISIX
- Tyk
- NGINX Plus(商用)
佈署 Kong Api Gateway(Docker with db 版)
version: '3.8'
services:
kong-database:
image: postgres:13
container_name: kong-database
environment:
POSTGRES_USER: kong
POSTGRES_DB: kong
POSTGRES_PASSWORD: kong
ports:
- "5432:5432"
kong-migrations:
image: kong:3.6.0
command: kong migrations bootstrap
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kong
depends_on:
- kong-database
kong:
image: kong:3.6.0
container_name: kong
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kong
KONG_ADMIN_LISTEN: 0.0.0.0:8001
KONG_ADMIN_GUI_URL: http://localhost:8002
KONG_ADMIN_GUI_API_URL: http://localhost:8001
ports:
- "8000:8000" # Proxy
- "8443:8443" # Proxy SSL
- "8001:8001" # Admin API
- "8002:8002" # Kong Dashboard
depends_on:
- kong-database
- kong-migrations
啟動指令:
docker-compose up -d
開啟 Dashboard: http://localhost:8002

預設就安裝了很多方便套件,不夠時也能自己做擴充

常用 Port 說明
| Port | 用途 | 協定 | 描述 |
|---|---|---|---|
8000 |
Proxy (HTTP) | HTTP | 外部 API 請求入口 |
8443 |
Proxy (HTTPS) | HTTPS | 加密請求入口 |
8001 |
Admin API | HTTP | 管理路由、服務、插件等 |
8002 |
Kong Dashboard | HTTP | 圖形化管理介面 |
快速測試 - 建立反向代理
建立服務:
POST http://localhost:8001/services
Content-Type: application/json
{
"name": "my-service",
"url": "https://blog.markkulab.net/"
}
建立路由:
POST http://localhost:8001/services/my-service/routes
Content-Type: application/json
{
"paths": ["/blog"]
}
測試結果:
http://localhost:8000/blog -> https://blog.markkulab.net/
負載平衡策略
| 策略名稱 | 說明 | 開源支援 |
|---|---|---|
| Round-robin | 輪詢分配請求 | ✅ |
| Weighted round-robin | 按權重分配請求 | ✅ |
| Least-connections | 連線數最少優先 | ❌(需企業版) |
補充:
- 支援健康檢查,自動排除故障節點
- 支援 DNS 動態發現 target
進階補充:
- 健康檢查:Kong 內建健康檢查機制,能自動偵測後端服務狀態,異常時自動排除,恢復後自動加入。
- 動態目標發現:支援 DNS 動態解析,後端服務 IP 變動時無需重啟 Kong。
- 多目標(Targets)管理:可針對同一服務設定多個目標,並動態調整權重。
請求速率限制(Rate Limiting)
透過 Consumer 與 Key Auth 搭配 Rate Limiting 插件,可根據用戶等級設定頻率。
| 等級 | 限制 |
|---|---|
| 基礎會員 | 每分鐘 5 次 |
| 銅級 | 每秒 5 次 |
| 銀級 | 每秒 10 次 |
| 金級 | 每秒 30 次 |
| 白金級/專案 | 每秒 50 次 |
基本流程:
- 建立 Consumer
- 建立 key-auth 憑證
- 套用 rate-limiting 插件
範例:
curl -i -X POST http://localhost:8001/consumers \
--data "username=gold"
curl -i -X POST http://localhost:8001/consumers/gold/key-auth
POST /consumers/gold/plugins
{
"name": "rate-limiting",
"config": {
"second": 30,
"policy": "local"
}
}
...
API 請求時帶上 key:
GET /your-api
apikey: <your-key>
進階補充:
- 多種策略:支援 local(本地)、cluster(叢集)、redis(外部 Redis)等多種儲存策略,適合不同規模需求。
- 自訂回應:可自訂超出限制時的回應訊息與 HTTP 狀態碼。
- 搭配身份驗證:建議與 key-auth、JWT 等插件搭配,針對不同用戶群組設不同限制。
性能與壓力測試
官方實測:單台 8 vCPU 機器,QPS 可達 10~20 萬,延遲低於 10ms。
詳細報告:Kong Gateway Performance Benchmark
更大流量場景建議考慮硬體設備(如 F5)。
高可用架構(HA)
┌──────────────┐
│ LoadBalancer │
└─────┬────────┘
┌────┴───────┐
┌────▼────┐ ┌────▼────┐
│ Kong #1 │...│ Kong #N │
└────┬────┘ └────┬────┘
└────┬────┬───┘
│ │
┌─────────────┐
│ PostgreSQL │
└─────────────┘
進階補充:
- 資料庫高可用:PostgreSQL 建議採用主從複寫或叢集方案,避免單點故障。
- 多 Kong 節點:可橫向擴展 Kong 節點,配合 Load Balancer 實現高可用與彈性擴充。
- 設定同步:Kong 節點間設定自動同步,確保 API 管理一致性。
壓測工具:K6
安裝:
npm install -g k6
測試腳本:
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
http.get('http://localhost:8000/v1/users');
sleep(1);
}
執行:
k6 run script.js





















留言