Skip to content

目标:把“鉴权/配额/限速/审计”前置到网关,服务只关注业务逻辑。

🎯 文章目标

  • 定义 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 兼容接口与价目换算

💭 总结

  • 以“网关前置 + 统一鉴权/配额/限速/审计”为基座,服务专注业务,整体更可控