香港服务器搭建API网关:Kong Gateway + 限流 + JWT认证 + 多后端路由完整配置
当业务系统拆分为多个微服务后,如何统一管理 API 的认证、限流、路由、日志?Kong Gateway 是目前最流行的开源 API 网关,通过插件体系可以在不修改业务代码的情况下为所有 API 添加认证、限流、监控等能力。本文在香港服务器上完成 Kong 的完整部署和配置。
一、Kong 架构
<code">
客户端请求
│ HTTPS :443
▼
Kong Gateway(API 网关层)
├── 认证插件(JWT / Key-Auth / OAuth2)
├── 限流插件(Rate Limiting)
├── 日志插件(HTTP Log / File Log)
└── 路由规则
├──→ 用户服务 :8001
├──→ 商品服务 :8002
└──→ 订单服务 :8003
Kong Admin API :8444(管理接口,内网访问)
Konga(Web 管理控制台)
二、Docker Compose 部署 Kong
<code"># /opt/kong/docker-compose.yml
version: '3.8'
services:
kong-db:
image: postgres:15-alpine
container_name: kong-db
restart: unless-stopped
environment:
POSTGRES_USER: kong
POSTGRES_PASSWORD: kong_db_pass
POSTGRES_DB: kong
volumes:
- kong_db_data:/var/lib/postgresql/data
kong-migration:
image: kong:3.6
command: kong migrations bootstrap
depends_on:
- kong-db
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-db
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong_db_pass
KONG_PG_DATABASE: kong
kong:
image: kong:3.6
container_name: kong
restart: unless-stopped
depends_on:
- kong-db
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-db
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong_db_pass
KONG_PG_DATABASE: kong
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_ADMIN_LISTEN: "127.0.0.1:8001, 127.0.0.1:8444 ssl"
KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 ssl"
ports:
- "80:8000"
- "443:8443"
- "127.0.0.1:8001:8001"
- "127.0.0.1:8444:8444"
volumes:
- kong_data:/usr/local/kong
konga:
image: pantsel/konga:latest
container_name: konga
restart: unless-stopped
environment:
NODE_ENV: production
DB_ADAPTER: postgres
DB_HOST: kong-db
DB_USER: kong
DB_PASSWORD: kong_db_pass
DB_DATABASE: konga
ports:
- "127.0.0.1:1337:1337"
depends_on:
- kong-db
volumes:
kong_db_data:
kong_data:<code"># 初始化并启动 cd /opt/kong docker compose up -d kong-db kong-migration sleep 10 # 等待数据库迁移完成 docker compose up -d kong konga # 验证 Kong 启动 curl http://localhost:8001/ # 返回 Kong 版本信息
三、创建 Service 和 Route
<code"># 通过 Kong Admin API 配置(或在 Konga 界面操作) # 1. 创建上游服务(用户服务) curl -X POST http://localhost:8001/services \ -d name=user-service \ -d url=http://user-backend:8001 # 2. 为该服务创建路由 curl -X POST http://localhost:8001/services/user-service/routes \ -d "paths[]=/api/v1/users" \ -d "methods[]=GET" \ -d "methods[]=POST" \ -d strip_path=false # 3. 创建商品服务和路由 curl -X POST http://localhost:8001/services \ -d name=product-service \ -d url=http://product-backend:8002 curl -X POST http://localhost:8001/services/product-service/routes \ -d "paths[]=/api/v1/products" \ -d "methods[]=GET" \ -d "methods[]=POST" \ -d "methods[]=PUT" \ -d "methods[]=DELETE"
四、JWT 认证插件
<code"># 为用户服务启用 JWT 认证 curl -X POST http://localhost:8001/services/user-service/plugins \ -d name=jwt \ -d "config.claims_to_verify[]=exp" \ -d "config.key_claim_name=iss" # 创建 JWT Consumer 和密钥 curl -X POST http://localhost:8001/consumers \ -d username=api-client-1 curl -X POST http://localhost:8001/consumers/api-client-1/jwt \ -d algorithm=HS256 \ -d key=my-jwt-issuer \ -d secret=my-jwt-secret-key
<code"># Python 生成 JWT Token(客户端使用)
import jwt, time
payload = {
'iss': 'my-jwt-issuer', # 必须与 Kong 配置的 key 一致
'exp': int(time.time()) + 3600, # 1小时过期
'sub': 'user-123',
'roles': ['admin']
}
token = jwt.encode(payload, 'my-jwt-secret-key', algorithm='HS256')
print(f"Authorization: Bearer {token}")
# 使用 Token 调用 API
import requests
headers = {'Authorization': f'Bearer {token}'}
r = requests.get('https://yourdomain.com/api/v1/users', headers=headers)
print(r.json())五、限流插件(Rate Limiting)
<code"># 全局限流(对所有 API 生效) curl -X POST http://localhost:8001/plugins \ -d name=rate-limiting \ -d "config.minute=100" \ # 每分钟最多100次 -d "config.hour=1000" \ # 每小时最多1000次 -d "config.policy=redis" \ # 使用 Redis 存储计数(支持多实例) -d "config.redis_host=redis" \ -d "config.redis_port=6379" # 针对特定 Consumer 设置更高限额(VIP 用户) curl -X POST http://localhost:8001/consumers/vip-client/plugins \ -d name=rate-limiting \ -d "config.minute=1000" \ -d "config.hour=10000" \ -d "config.policy=redis" \ -d "config.redis_host=redis"
六、日志插件配置
<code"># HTTP Log 插件(将请求日志发送到日志收集服务) curl -X POST http://localhost:8001/plugins \ -d name=http-log \ -d "config.http_endpoint=http://你的日志收集服务:9000/kong-logs" \ -d "config.method=POST" \ -d "config.timeout=10000" \ -d "config.keepalive=60000" # File Log 插件(写入本地文件) curl -X POST http://localhost:8001/plugins \ -d name=file-log \ -d "config.path=/var/log/kong/access.log"
七、总结
Kong Gateway 为微服务架构提供了统一的 API 管理层,将认证、限流、日志等横切关注点从业务代码中抽离,显著降低了各服务的开发复杂度。香港服务器的稳定性确保了 API 网关这一关键基础设施的高可用,建议搭配第二阶段文章5的 Prometheus 监控方案对 Kong 的 QPS、延迟和错误率进行实时监控。