共计 2142 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在企业级应用中直接调用 ChatGPT 官方 API 时,开发者常遇到三类典型问题:

- 并发限制:OpenAI 的免费层 API 每分钟仅允许 3 次请求,即使付费套餐也存在硬性 QPS 限制。当突发流量来临时,服务会直接返回 429 错误
- 响应延迟:从亚洲地区直连美国服务器平均延迟超过 300ms,且流式响应时更易受网络抖动影响
- 密钥泄露:前端直接调用导致 API KEY 暴露,曾发生多起因 GitHub 代码泄露引发的恶意消费事件
架构选型
对比主流开源 API 网关的核心能力:
- Kong:Lua 插件生态丰富,社区版即支持 JWT、限流等关键功能,Nginx 底层保证高性能
- APISIX:动态路由配置更灵活,但 Go 插件开发门槛略高
- Tyk:Dashboard 体验优秀,但集群部署需要 Redis+MDCB 组件
最终选择 Kong 的核心优势:
- 原生支持 OpenResty,可直接复用现有 Nginx 技能栈
- 插件市场有现成的
openid-connect等认证模块 - 声明式配置更适合 GitOps 工作流
核心实现
动态鉴权方案
采用 JWT+Redis 实现双重验证:
-- kong/plugins/jwt-redis-auth/handler.lua
local redis = require "resty.redis"
local red = redis:new()
local ok, err = red:connect("redis-master", 6379)
if not ok then
kong.log.err("Redis 连接失败:", err)
return kong.response.exit(500)
end
local token = kong.request.get_header("Authorization")
if not token then
return kong.response.exit(401, { message = "Missing token"})
end
-- 验证 JWT 签名及过期时间
local jwt = require "resty.jwt"
local jwt_obj = jwt:verify(os.getenv("JWT_SECRET"), token:sub(8))
if not jwt_obj.verified then
return kong.response.exit(403, { message = "Invalid token"})
end
-- 检查 Redis 吊销列表
local is_revoked = red:get("revoked:"..jwt_obj.payload.jti)
if is_revoked == "1" then
return kong.response.exit(403, { message = "Token revoked"})
end
分级限流配置
根据 API 套餐级别设置不同限流策略:
# kong.yml
services:
- name: chatgpt-api
url: https://api.openai.com/v1
routes:
- paths: ['/chat/completions']
plugins:
- name: rate-limiting
config:
policy: redis
minute: 60 # 基础套餐
hour: 1000
日志脱敏处理
使用 Kong 的 file-log 插件配合正则过滤:
log_format filtered '$remote_addr - $jwt_sub [$time_local]'
'"$filtered_request" $status $body_bytes_sent';
set $filtered_request $request;
if ($request ~* '(api_key=)([^&]+)') {set $filtered_request $1***REDACTED***;}
性能测试
使用 Locust 模拟不同并发场景:
| 场景 | 直连 API QPS | 网关代理 QPS | P99 延迟 |
|---|---|---|---|
| 10 并发持续请求 | 42 | 135 | 210ms |
| 100 并发突发流量 | 被限流 | 89 | 320ms |
GC 调优关键参数:
# nginx.conf
lua_shared_dict prometheus_metrics 100m;
lua_max_pending_timers 1024;
lua_socket_pool_size 512;
避坑指南
- 流式响应内存泄漏:
- 必须显式调用
ngx.flush(true)及时释放缓冲区 -
设置
client_body_buffer_size 1k避免大请求体缓存 -
多地域部署路由:
upstreams: - name: us-east targets: - target: api.openai.com:443 weight: 100 - name: eu-west targets: - target: api.eu.openai.com:443 weight: 30 -
防重放攻击:
- 在 JWT 中加入
nonce字段并使用 Redis 原子性校验 - 设置
X-Request-ID头部并强制 5 秒内失效
开放问题
- 如何设计零信任架构下的动态证书下发机制?
- 当 GPT- 4 接口响应延迟突增时,怎样实现自动降级到 GPT-3.5?
- 在多租户场景下,如何通过请求染色实现精细化的成本分摊?
通过这套方案,我们成功将 API 稳定性从 98.5% 提升到 99.95%,同时阻止了多起密钥盗用尝试。建议读者根据自身业务特点调整限流阈值和路由策略。
正文完
发表至: 未分类
近三天内
