
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
1.一個(路由) 只能有一個設定,但可以透過 route prefix 繞開