目标:把“鉴权/配额/限速/审计”前置到网关,服务只关注业务逻辑。
🎯 文章目标
- 定义 API 网关在 LLM 应用中的职责边界
- 提供鉴权/配额/限速/审计的最小实现与规则样例
- 输出治理指标看板维度
📚 背景/前置
- 鉴权:API Key/JWT/MTLS;多租户按组织、用户、应用区分
- 配额:按日/周/月额度,统计 tokens/QPS/费用
- 限速:令牌桶/漏桶;按 key、IP、路径细分
- 审计:结构化日志 + 留痕(请求/响应/错误)
🔧 核心内容
1) 职责边界
- 网关:鉴权/配额/限速/审计/路由/熔断
- 服务:提示/检索/工具链/业务规则
2) 鉴权与配额
- 鉴权顺序:签名→权限→配额→限速
- 额度模型:tokens_in/tokens_out/请求数/费用;支持按模型价目换算
3) 限速规则
- 维度:user_id、org_id、api_key、path
- 策略:突发与持续速率组合;白名单/黑名单
💡 实战示例:Nginx 规则(示意)
nginx
limit_req_zone $http_x_api_key zone=api_key:10m rate=10r/s;
map $http_x_api_key $org_bucket { default "$http_x_api_key"; }
server {
location /v1/ {
limit_req zone=api_key burst=20 nodelay;
proxy_set_header X-Org $org_bucket;
proxy_pass http://llm-upstream;
}
}
💡 实战示例:Node.js 中间件(配额/审计)
javascript
app.use(async (req,res,next)=>{
const key = req.get('x-api-key');
if (!await auth(key)) return res.status(401).end();
const quotaOk = await checkAndConsumeQuota(key, estimateTokens(req.body));
if (!quotaOk) return res.status(429).json({ code:'QUOTA_EXCEEDED' });
const t0 = Date.now();
res.on('finish', ()=> logJSON({ key, path:req.path, ms:Date.now()-t0, status:res.statusCode }));
next();
});
📊 指标看板(速查)
- 鉴权失败率、配额命中率、限速拒绝数(按维度切片)
- 请求量/延迟 P95/P99、tokens(in/out)、费用估算
- 错误分布(4xx/5xx)、最慢 5% 请求
🧪 踩坑与经验
- 鉴权与限速顺序错置:会浪费资源
- 只按 IP 限速:多租户隔离不足
- 不记录 tokens/费用:成本失控
📎 参考与延伸
- Nginx/Envoy 限速、API Gateway 设计
- OpenAI 兼容接口与价目换算
💭 总结
- 以“网关前置 + 统一鉴权/配额/限速/审计”为基座,服务专注业务,整体更可控