为什么需要API网关?
凌晨1点30分,我看着5个Agent各自调用不同API的日志,突然意识到:没有网关的Agent系统,就像没有物业的小区——谁都能进,谁都能出,乱成一锅粥。
没有网关:
Agent1 → 直接调API1(无认证)
Agent2 → 直接调API2(无监控)
Agent3 → 直接调API1(重复调用)
😫 混乱、无监控、无控制
有网关:
Agent1/2/3 → 🚪 API网关 → 统一认证/限流/监控 → API1/2
😌 有序、可观测、可控制
Agent1 → 直接调API1(无认证)
Agent2 → 直接调API2(无监控)
Agent3 → 直接调API1(重复调用)
😫 混乱、无监控、无控制
有网关:
Agent1/2/3 → 🚪 API网关 → 统一认证/限流/监控 → API1/2
😌 有序、可观测、可控制
🎯 API网关的核心价值:
- 统一认证:一个地方管所有Agent的身份验证
- 流量控制:防止某个Agent把API打爆
- 监控可观测:所有请求都有日志,出了问题能追溯
- 协议转换:Agent说HTTP,后端可能是gRPC/WebSocket
- 缓存加速:相同请求直接返回缓存,省钱省时间
OpenClaw API网关架构
基础网关配置
# openclaw-api-gateway.yaml
name: "openclaw-enterprise-gateway"
version: "1.0"
# 网关监听配置
gateway:
listen: "0.0.0.0:8080"
base_path: "/api/v1"
# 认证配置
auth:
strategy: "jwt"
jwt:
secret: "${JWT_SECRET}"
expiry: "24h"
issuer: "openclaw-gateway"
# API Key备用方案
api_key:
header: "X-API-Key"
keys_store: "/etc/openclaw/gateway/api-keys.json"
# 限流配置
rate_limiting:
default: "100/minute"
per_agent:
"finance-agent": "500/minute" # 财务Agent调用频繁
"data-agent": "50/minute" # 数据Agent限制严格
# 后端服务路由
routes:
- path: "/llm/*"
backend: "openclaw-llm-gateway"
backend_url: "http://localhost:3000"
auth_required: true
rate_limit: "200/minute"
- path: "/tools/*"
backend: "openclaw-tools"
backend_url: "http://localhost:4000"
auth_required: true
caching:
enabled: true
ttl: "5m"
- path: "/agents/*"
backend: "agent-runtime"
backend_url: "http://localhost:5000"
auth_required: true
timeout: "30s"
# 监控配置
monitoring:
metrics:
enabled: true
endpoint: "/metrics"
format: "prometheus"
logging:
level: "info"
format: "json"
output: "/var/log/openclaw/gateway.log"
tracing:
enabled: true
sampler: "0.1" # 10%采样
部署API网关
# 安装API网关Skill
openclaw skill install api-gateway-enterprise
# 初始化网关配置
openclaw gateway init --config openclaw-api-gateway.yaml
# 启动网关(前台,用于调试)
openclaw gateway start --foreground
# 后台运行(生产环境)
openclaw gateway start --daemon
openclaw gateway status
# 测试网关健康检查
curl http://localhost:8080/api/v1/health
# 输出:{"status": "healthy", "version": "1.0", "uptime": "2h 15m"}
# 测试认证
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8080/api/v1/llm/chat
# 成功返回:{"response": "..."}
# 失败返回:{"error": "unauthorized", "code": 401}
四种API网关模式
🛡️ 模式1:认证网关
所有请求先过认证关,没token的统统挡外面。
routes:
- path: "/protected/*"
auth_required: true
auth_strategy: "jwt"
backend: "internal-service"
⏱️ 模式2:限流网关
给每个Agent分配"配额",防止某个Agent把资源吃光。
rate_limiting:
strategy: "token_bucket"
per_agent_quota:
"agent-a": {tokens: 100, refill: "1/minute"}
"agent-b": {tokens: 500, refill: "10/minute"}
📊 模式3:监控网关
采集所有请求的指标:QPS、延迟、错误率、Token消耗。
monitoring:
metrics:
enabled: true
custom_metrics:
- name: "agent_token_usage"
type: "counter"
labels: ["agent_id", "model"]
- name: "request_latency"
type: "histogram"
labels: ["route", "method"]
🔄 模式4:缓存网关
相同请求直接返回缓存,省Token又提速。
caching:
strategy: "semantic" # 语义缓存,相似问题也命中
ttl: "10m"
cache_key:
- "request_body.query"
- "request_headers.X-Agent-ID"
store: "redis://localhost:6379"
实战:多Agent统一网关
# multi-agent-gateway.yaml
gateway:
listen: "0.0.0.0:8443" # HTTPS端口
tls:
enabled: true
cert: "/etc/ssl/certs/gateway.pem"
key: "/etc/ssl/private/gateway.key"
# Agent注册表
agents:
"finance-agent":
api_key: "fk_1234567890abcdef"
scopes: ["/api/v1/finance/*"]
rate_limit: "500/minute"
"hr-agent":
api_key: "hr_abcdef1234567890"
scopes: ["/api/v1/hr/*"]
rate_limit: "200/minute"
"data-agent":
api_key: "da_9876543210fedcba"
scopes: ["/api/v1/data/*", "/api/v1/analytics/*"]
rate_limit: "100/minute"
# 路由规则
routes:
- path: "/api/v1/finance/*"
backend: "finance-service"
backend_url: "http://finance-internal:8080"
allowed_agents: ["finance-agent"]
- path: "/api/v1/hr/*"
backend: "hr-service"
backend_url: "http://hr-internal:8080"
allowed_agents: ["hr-agent"]
- path: "/api/v1/data/*"
backend: "data-lake"
backend_url: "http://data-lake:9000"
allowed_agents: ["data-agent", "finance-agent"] # 财务也能查数据
# 请求/响应转换
transforms:
request:
- type: "add_header"
header: "X-Request-ID"
value: "auto-generate-uuid"
- type: "inject_auth"
source: "agent_api_key"
response:
- type: "add_header"
header: "X-RateLimit-Remaining"
value: "${rate_limit_remaining}"
网关性能优化
| 优化方向 | 方法 | 效果 |
|---|---|---|
| 连接复用 | HTTP/2 + Keep-Alive | 延迟降低40% |
| 响应缓存 | Redis缓存 + 语义相似度 | 成本降低60% |
| 请求合并 | 相同请求合并为一个后端调用 | 后端负载降低50% |
| 异步处理 | 非阻塞I/O + 协程 | 吞吐量提升3倍 |
| 智能路由 | 根据Agent类型路由到最优后端 | 延迟降低25% |
监控Dashboard
网关运行后,可以通过Prometheus + Grafana查看监控指标:
# 访问网关metrics端点
curl http://localhost:8080/metrics
# 输出示例(Prometheus格式)
openclaw_gateway_requests_total{route="/llm/chat",method="POST",status="200"} 1523
openclaw_gateway_request_duration_seconds{route="/llm/chat"} 0.342
openclaw_gateway_rate_limited_total{agent_id="finance-agent"} 12
openclaw_gateway_cache_hits_total{route="/tools/*"} 892
# Grafana Dashboard推荐Panel:
# 1. 请求QPS(按route分组)
# 2. 错误率(按Agent分组)
# 3. P95/P99延迟
# 4. Token消耗速率
# 5. 限流触发次数
⚠️ 避坑指南:
- 网关本身要限流,防止被DDoS打垮
- JWT密钥要定期轮换,别用默认值
- 日志别记敏感信息(密码、token),会被脱敏
- 网关是单点,生产环境要部署多实例+负载均衡
🎯 妙趣金句:
"API网关就像小区大门的保安——认得出业主(认证),拦得住陌生人(限流),还能告诉你谁几点进的(监控)。没它的小区,迟早乱套。"
常见问题
- 网关挂了,Agent还能工作吗? 不能!网关是单点,生产环境必须多实例部署。
- 每个Agent都需要网关吗? 内部Agent可以直连,对外暴露的必须通过网关。
- 网关会增加延迟吗? 会,但通常在5-20ms,相比Agent推理延迟可以忽略。
- 如何做A/B测试? 在路由规则中加权重:
backend_weights: ["v1": 90, "v2": 10]