
https://docs.konghq.com/gateway/latest/
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 | 用途 | 協定 | 描述 |
---|---|---|---|
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 | 連線數最少優先 | ❌(需企業版) |
補充:
進階補充:
- 健康檢查:Kong 內建健康檢查機制,能自動偵測後端服務狀態,異常時自動排除,恢復後自動加入。
- 動態目標發現:支援 DNS 動態解析,後端服務 IP 變動時無需重啟 Kong。
- 多目標(Targets)管理:可針對同一服務設定多個目標,並動態調整權重。
透過 Consumer 與 Key Auth 搭配 Rate Limiting 插件,可根據用戶等級設定頻率。
等級 | 限制 |
---|---|
基礎會員 | 每分鐘 5 次 |
銅級 | 每秒 5 次 |
銀級 | 每秒 10 次 |
金級 | 每秒 30 次 |
白金級/專案 | 每秒 50 次 |
基本流程:
範例:
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)。
┌──────────────┐ │ LoadBalancer │ └─────┬────────┘ ┌────┴───────┐ ┌────▼────┐ ┌────▼────┐ │ Kong #1 │...│ Kong #N │ └────┬────┘ └────┬────┘ └────┬────┬───┘ │ │ ┌─────────────┐ │ PostgreSQL │ └─────────────┘
進階補充:
- 資料庫高可用:PostgreSQL 建議採用主從複寫或叢集方案,避免單點故障。
- 多 Kong 節點:可橫向擴展 Kong 節點,配合 Load Balancer 實現高可用與彈性擴充。
- 設定同步:Kong 節點間設定自動同步,確保 API 管理一致性。
安裝:
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