在微服务架构中,API网关作为流量入口承担着至关重要的角色。我们原有的架构采用Nginx作为反向代理,将请求转发到HZero Gateway(基于Spring Cloud Gateway),再由内部网关路由到具体服务。这种架构在初期运行良好,但随着业务量增长,暴露出几个明显问题:
引入Kong网关后,架构演变为三层结构:
code复制用户 → Nginx → Kong (8000/8443) → HZero Gateway (8080) → 内部服务
这种设计带来三个核心优势:
实际部署中发现一个关键细节:Docker的iptables配置会影响容器间通信。如果未启用iptables,Kong容器将无法访问外部HZero Gateway的8080端口,这会导致所有请求失败。建议在部署前执行
sudo modprobe ip_tables确保网络功能正常。
Kong的限流插件(rate-limiting)基于令牌桶算法实现,其核心参数包括:
second:每秒生成的令牌数(突发流量控制)minute:每分钟生成的令牌数(持续流量控制)policy:计数存储策略,支持local和redis两种模式令牌桶的工作机制类似于地铁进站口:
这种设计既能防止突发流量压垮系统,又能保证持续流量的平稳处理。
bash复制curl -X POST http://localhost:8001/plugins/ \
-H "Content-Type: application/json" \
-d '{
"name": "rate-limiting",
"config": {
"minute": 60,
"second": 1,
"policy": "local",
"hide_client_headers": false
}
}'
这种配置适合中小型系统,特点包括:
bash复制curl -X POST http://localhost:8001/plugins/ \
-H "Content-Type: application/json" \
-d '{
"name": "rate-limiting",
"config": {
"minute": 60,
"second": 1,
"policy": "redis",
"redis_host": "192.168.0.95",
"redis_port": 6379,
"redis_database": 2,
"hide_client_headers": false
},
"consumer": false
}'
这种方案的进阶特性:
在压力测试中发现,当QPS超过500时,local策略会导致Kong内存占用飙升,而redis策略内存增长平稳。建议生产环境务必使用redis策略。
在HZero体系中,以下三类接口必须排除限流:
bash复制# 创建专属路由
curl -X POST http://localhost:8001/services/hzero-gateway/routes/ \
-H "Content-Type: application/json" \
-d '{
"name": "hzero-oauth-no-limit",
"paths": ["/oauth"],
"strip_path": false,
"preserve_host": true,
"regex_priority": 10 # 更高优先级确保优先匹配
}'
# 设置超高限流阈值(等效无限制)
curl -X POST http://localhost:8001/plugins/ \
-H "Content-Type: application/json" \
-d '{
"name": "rate-limiting",
"route": {"name": "hzero-oauth-no-limit"},
"config": {
"minute": 999999,
"hour": 9999999,
"day": 99999999,
"policy": "local"
}
}'
关键配置技巧:
regex_priority设为较高值(如10),确保优先匹配特殊路由bash复制# 创建指向HZero Gateway的服务
curl -X POST http://localhost:8001/services/ \
-H "Content-Type: application/json" \
-d '{
"name": "hzero-backend",
"url": "http://192.168.0.128:8080",
"read_timeout": 60000, # 超时时间设为60秒
"write_timeout": 60000,
"connect_timeout": 60000
}'
# 创建全路径路由
curl -X POST http://localhost:8001/services/hzero-backend/routes/ \
-H "Content-Type: application/json" \
-d '{
"name": "hzero-api",
"paths": ["/"],
"strip_path": false,
"preserve_host": true
}'
bash复制curl -X POST http://localhost:8001/plugins/ \
-H "Content-Type: application/json" \
-d '{
"name": "rate-limiting",
"service": {"name": "hzero-backend"},
"config": {
"minute": 60,
"second": 1,
"hour": 1000, # 增加小时级控制
"policy": "redis",
"redis_host": "192.168.0.95",
"redis_port": 6379,
"redis_timeout": 2000, # 增加Redis超时设置
"redis_database": 2,
"fault_tolerant": true, # Redis故障时仍允许请求
"hide_client_headers": false
}
}'
bash复制curl -X POST http://localhost:8001/plugins/ \
-H "Content-Type: application/json" \
-d '{
"name": "cors",
"config": {
"origins": ["https://example.com"], # 建议替换为实际域名
"methods": ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
"headers": ["Authorization", "Content-Type", "Accept"],
"exposed_headers": ["X-Total-Count", "X-Page-Number"],
"credentials": true,
"max_age": 3600
}
}'
| 参数 | 开发环境值 | 生产环境建议值 | 说明 |
|---|---|---|---|
| second | 1 | 5-10 | 根据业务峰值调整 |
| minute | 60 | 300-600 | 建议不低于用户数的5倍 |
| redis_timeout | 2000 | 500 | 降低超时时间提高响应速度 |
| fault_tolerant | true | false | 生产环境应严格限流 |
| redis_database | 2 | 专用DB | 避免与其他业务共用DB |
建议通过Prometheus监控以下指标:
kong_http_status:按状态码统计请求量kong_latency_bucket:请求延迟分布redis_connected_clients:Redis连接数关键告警规则:
bash复制curl http://localhost:8001/services/hzero-backend/plugins
bash复制docker exec -it kong redis-cli -h 192.168.0.95 -p 6379 -n 2 ping
bash复制curl http://localhost:8001/routes | jq '.data[].priority'
现象:高并发时Kong CPU使用率高
解决方案:
yaml复制# kong.conf
cluster_listen = 0.0.0.0:7946
yaml复制nginx_worker_processes = auto
yaml复制db_cache_ttl = 3600
db_cache_warmup_entities = services,routes
对于不同规模系统的部署建议:
| 考量维度 | Docker Compose | Kubernetes |
|---|---|---|
| 适用规模 | <10节点 | >10节点 |
| 配置管理 | 文件挂载 | ConfigMap |
| 高可用 | 需手动实现 | 原生支持 |
| 典型配置示例 | 如下 | 需配合Ingress Controller |
yaml复制version: '3.8'
services:
kong:
image: kong:3.4
environment:
KONG_DATABASE: "off"
KONG_DECLARATIVE_CONFIG: /usr/local/kong/kong.yml
KONG_PROXY_LISTEN: 0.0.0.0:8000
KONG_ADMIN_LISTEN: 0.0.0.0:8001
KONG_NGINX_WORKER_PROCESSES: "4" # 根据CPU核心数调整
ports:
- "8000:8000"
- "8001:8001"
volumes:
- ./kong.yml:/usr/local/kong/kong.yml
healthcheck:
test: ["CMD", "kong", "health"]
interval: 10s
timeout: 10s
retries: 3
对于SaaS系统,可以实现租户级限流:
bash复制curl -X POST http://localhost:8001/plugins/ \
-H "Content-Type: application/json" \
-d '{
"name": "rate-limiting",
"config": {
"minute": 60,
"second": 1,
"policy": "redis",
"limit_by": "header", # 根据Header区分租户
"header_name": "X-Tenant-ID"
}
}'
结合Prometheus指标实现自动扩缩容:
bash复制curl -X PATCH http://localhost:8001/plugins/{plugin-id} \
-d "config.minute=600"
经过实际验证,这套方案在日均百万PV的HZero系统中稳定运行,有效拦截了恶意刷接口行为,同时保障了核心业务的流畅运行。建议初次部署时先从宽松的限流策略开始,逐步收紧至最优值。