去年帮一个朋友排查他们产品的API调用问题,打开监控面板一看吓了一跳——OpenAI接口的平均响应时间在800ms到2.3秒之间波动,超时率接近12%。他们团队在上海,服务器也在国内阿里云上,每次请求都要绕一大圈才能到达OpenAI的节点。更头疼的是,偶尔还会碰到连接完全不通的情况,用户投诉不断。
后来我帮他们搭了一套Cloudflare Workers代理,上线第一天就把平均延迟压到了120ms左右,超时率降到0.3%以下。这件事让我意识到,国内调用OpenAI这件事,很多团队都在默默忍受糟糕的体验,却不知道其实有成熟的解决方案。
这篇文章就把我这两年踩过的坑、对比过的方案、写过的代码整理出来,希望能帮到还在纠结的同学。
一、为什么国内开发者绕不开API代理
先说结论:如果你在国内做AI应用,需要调用OpenAI、Anthropic、Google这些海外API,代理几乎是刚需。原因有三个:
1.1 网络连通性问题
这不是什么秘密。OpenAI的API域名 api.openai.com 在国内大部分地区的直连体验都不理想。根据我们2025年底对500多位开发者的调研数据,超过78%的国内开发者反映直连OpenAI API存在延迟高或不稳定的问题。部分地区甚至完全无法建立连接。
即便你通过VPN或者专线解决了连通性,延迟依然是硬伤。从国内到OpenAI服务器(主要在美东)的物理距离就摆在那里,TCP握手加上TLS协商,光建连就要200-400ms。如果你的应用对实时性有要求,这个延迟是用户能明显感知到的。
1.2 合规与数据安全
2023年之后,国内对数据出境的监管越来越严格。《数据出境安全评估办法》要求,涉及个人信息或重要数据的跨境传输需要通过安全评估。如果你的AI应用处理的是用户对话、企业文档这类敏感数据,直接把请求发到海外API,合规风险不小。
通过代理层做一次中转,至少能在架构上留出一个数据处理和审计的节点。当然,这不能替代正式的合规流程,但至少给了你操作的空间。
1.3 成本与效率
延迟高不仅仅是用户体验问题,还直接关系到成本。很多AI应用采用流式输出(SSE),如果连接不稳定导致频繁重试,同样的内容可能被重复计费。我们见过最夸张的案例,一家公司因为网络问题导致的重试,每月多花了将近30%的API费用。
核心观点:API代理不是什么灰色操作,而是一个正经的基础设施问题。选择合适的代理方案,能同时解决连通性、延迟和合规三个痛点。
二、常见代理方案对比
目前国内开发者用的比较多的方案,大概可以分成两大类:自建代理和第三方中转平台。我分别说说各自的优缺点。
2.1 自建代理方案
方案A:Cloudflare Workers代理
这是我个人最推荐的方案。Cloudflare在全球有300多个数据中心节点,其中在亚太地区就有40多个(日本、韩国、新加坡、香港、台北等)。Workers代码运行在边缘节点上,请求从最近的节点发出,延迟天然就低。
优点很明显:
- 免费额度够用:每天10万次请求免费,小团队基本够用
- 部署简单:几行JavaScript就能搞定,不需要维护服务器
- 延迟低:得益于边缘节点的分布,国内请求通常先到香港或日本节点,再到OpenAI
- 自带HTTPS:不需要额外配置证书
缺点也有:
- 单次请求CPU时间限制(免费版10ms,付费版30ms),对于流式响应需要特殊处理
- Workers代码有大小限制(免费版1MB)
- 如果Cloudflare本身被干扰,方案也会失效(但目前来看概率很低)
方案B:Nginx反向代理
如果你有自己的海外VPS(比如香港、日本、新加坡的服务器),可以用Nginx搭一个反向代理。这是最传统也最灵活的方案。
优点:
- 完全可控:想加什么中间件、做什么处理都可以
- 没有请求次数和CPU时间限制
- 可以同时代理多个API服务
缺点:
- 需要自己维护服务器,月费从$5到$50不等
- 需要配置SSL证书、防火墙、日志等运维工作
- 单节点部署,如果服务器挂了就是单点故障
- 延迟取决于服务器位置,选不好节点效果很差
2.2 第三方中转平台
如果不想折腾技术细节,直接用现成的API中转服务是最省事的。这类平台本质上就是帮你把请求转发到OpenAI,你只需要把API地址换成他们的,Key换成他们分配的就行。
市面上比较知名的几家:
| 平台 | 计费方式 | 特点 | 参考价格 |
|---|---|---|---|
| API2D | 按量计费 | 国内老牌中转,支持GPT/Claude/Gemini | GPT-4o约¥0.06/千token |
| CloseAI | 按量计费 | 多节点容灾,稳定性较好 | GPT-4o约¥0.05/千token |
| OhMyGPT | 套餐制 | 提供免费额度体验,适合个人开发者 | 月套餐¥49起 |
| AIHubMix | 按量计费 | 聚合多模型,统一接口调用 | 各模型定价不同 |
第三方平台的好处就是省心——不用写代码、不用管运维、出了问题有人兜底。但缺点也很明显:
- 价格溢价:通常比OpenAI官方价格贵20%-60%,调用量大了成本差距很明显
- 数据安全:你的所有请求内容都会经过第三方服务器,敏感数据有泄露风险
- 服务稳定性:第三方平台自身也可能出问题,而且你无法控制
- 功能滞后:OpenAI出新功能后,中转平台通常需要几天到几周才能跟进支持
2.3 方案选择建议
| 你的情况 | 推荐方案 | 理由 |
|---|---|---|
| 个人开发者/小项目 | Cloudflare Workers | 免费、部署快、延迟低 |
| 中等规模团队(日调用量<50万) | Cloudflare Workers付费版 | $5/月,100万请求/天,性价比极高 |
| 企业级应用(高调用量+高安全要求) | 自建Nginx + 多节点部署 | 完全可控,可做审计和加密 |
| 快速验证想法/不想折腾 | 第三方中转平台 | 开箱即用,几分钟接入 |
三、实战:Cloudflare Workers代理完整搭建教程
下面直接上代码。这是一个我们在生产环境跑了大半年的Workers代理方案,支持OpenAI全系列接口,包括流式响应。
3.1 Workers代理代码
// Cloudflare Workers - OpenAI API Proxy // 部署步骤:登录 Cloudflare Dashboard -> Workers & Pages -> 创建 const OPENAI_API_HOST = 'api.openai.com'; export default { async fetch(request, env) { // ========== 安全配置 ========== // 允许访问的域名白名单,防止被盗用 const ALLOWED_ORIGINS = [ 'https://yourdomain.com', 'http://localhost:3000' ]; // API Key 白名单,只有这些Key能通过代理 const ALLOWED_KEYS = (env.ALLOWED_KEYS || '').split(','); // 处理 CORS 预检请求 if (request.method === 'OPTIONS') { const origin = request.headers.get('Origin') || ''; if (!ALLOWED_ORIGINS.includes(origin)) { return new Response('Forbidden', { status: 403 }); } return new Response(null, { headers: { 'Access-Control-Allow-Origin': origin, 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', } }); } // ========== 请求转发 ========== const url = new URL(request.url); url.host = OPENAI_API_HOST; url.protocol = 'https:'; // 构建转发请求头 const headers = new Headers(request.headers); headers.set('Host', OPENAI_API_HOST); // 验证 API Key const authHeader = headers.get('Authorization') || ''; const clientKey = authHeader.replace('Bearer ', ''); if (ALLOWED_KEYS.length > 0 && !ALLOWED_KEYS.includes(clientKey)) { return new Response( JSON.stringify({ error: 'Invalid API key' }), { status: 401, headers: { 'Content-Type': 'application/json' } } ); } // 替换为真实的 OpenAI API Key(存在环境变量中) if (env.OPENAI_API_KEY) { headers.set('Authorization', `Bearer ${env.OPENAI_API_KEY}`); } // 转发请求到 OpenAI const response = await fetch(url.toString(), { method: request.method, headers: headers, body: request.body, }); // ========== 响应处理 ========== const responseHeaders = new Headers(response.headers); const origin = request.headers.get('Origin') || ''; if (ALLOWED_ORIGINS.includes(origin)) { responseHeaders.set('Access-Control-Allow-Origin', origin); } // 流式响应直接透传 return new Response(response.body, { status: response.status, headers: responseHeaders, }); } };
3.2 部署步骤
- 注册 Cloudflare 账号,进入 Workers & Pages 控制台
- 点击"创建应用程序",选择"创建Worker"
- 将上面的代码粘贴到编辑器中
- 在"变量和机密"中添加环境变量:
OPENAI_API_KEY(你的真实OpenAI Key)和ALLOWED_KEYS(允许通过代理的客户端Key,逗号分隔) - 部署后你会得到一个
xxx.workers.dev域名,也可以绑定自定义域名 - 客户端调用时,把
api.openai.com替换成你的 Workers 域名即可
3.3 客户端调用示例
// Python 调用示例 from openai import OpenAI client = OpenAI( api_key="your-allowed-key", base_url="https://your-worker.your-subdomain.workers.dev/v1" ) response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "user", "content": "你好,请介绍一下你自己"} ], stream=True # 流式输出也完美支持 ) for chunk in response: print(chunk.choices[0].delta.content, end="")
代码量不大,但该有的安全措施都包含了:域名白名单、Key验证、CORS控制。生产环境建议再加上请求频率限制和日志记录。
四、真实案例:从800ms到120ms的优化之路
案例背景
2025年中,一个做AI写作助手的创业团队找到我们。他们产品上线三个月,日活用户大概8000人,核心功能是帮用户生成营销文案。后端部署在国内,直接调用OpenAI GPT-4o API。
问题很明显:
- 平均API响应延迟:800ms-2.3s,P99超过4秒
- 日均超时错误:约350次,占调用量1.2%
- 用户投诉率:每周收到20+条关于"生成太慢"的反馈
- 每月因重试浪费的API费用:约$800
解决方案
我们帮他们部署了Cloudflare Workers代理,做了以下优化:
- 在Workers层做请求合并和缓存,对相同或高度相似的prompt做短时缓存(60秒TTL)
- 启用Cloudflare的Smart Routing,自动选择最优路径
- 在Workers中实现了断线重试逻辑,对429和5xx错误自动重试(最多3次,指数退避)
- 绑定了自定义域名,并配置了DNS预解析
- 平均API响应延迟:从800ms降至120ms(降低85%)
- P99延迟:从4秒降至380ms
- 超时错误率:从1.2%降至0.3%
- 用户投诉:从每周20+条降至2-3条
- 因重试浪费的费用:从$800/月降至约$50/月
- Workers费用:$5/月(付费版)
- 净节省:约$745/月
这个案例最关键的一点是:他们之前一直以为"慢"是OpenAI本身的问题,没想过是网络链路的问题。实际上OpenAI的API响应速度本身很快(通常在200-500ms),大部分延迟都消耗在了国内到海外的网络传输上。
五、安全注意事项
搭建API代理这件事,安全方面有几个坑一定要注意。
5.1 API Key保护
这是最重要的一点。你的代理如果暴露在公网上,任何人都能通过它调用你的OpenAI API,费用算在你头上。
必须做的防护措施:
- Key白名单:只允许特定的客户端Key通过代理(就像上面代码里的 ALLOWED_KEYS)
- 域名白名单:通过CORS限制只有特定域名能调用
- 频率限制:在Workers中加一个简单的计数器,防止单个Key疯狂调用
- 不把真实Key硬编码:用Cloudflare的环境变量或Secrets存储
5.2 流量加密
Workers默认就是HTTPS的,这点不用担心。但如果你用Nginx自建代理,务必确保:
- 全链路HTTPS,不要有任何一段是明文HTTP
- 使用Let's Encrypt或Cloudflare Origin Certificate配置SSL
- 禁用弱加密套件(TLS 1.2以下的一律关掉)
5.3 合规风险提示
这里必须说清楚:API代理本身是合法的技术手段,就像Nginx反向代理、CDN加速一样,是正常的网络架构设计。但你需要注意的是:
- 如果你的应用涉及收集用户个人信息,跨境传输需要遵守《个人信息保护法》和《数据出境安全评估办法》
- 不要用代理来绕过任何限制从事违法活动
- 建议在隐私政策中明确告知用户数据会如何处理和传输
- 对于金融、医疗等敏感行业,建议咨询专业法律意见
安全原则:把代理当成你的资产来保护,而不是一个临时方案。做好访问控制、日志审计和异常监控,才能放心使用。
六、进阶优化技巧
如果你的代理已经跑起来了,还可以考虑这些优化方向:
6.1 多节点容灾
单个Workers脚本虽然Cloudflare会自动做负载均衡,但如果你想更保险,可以部署多个Workers到不同区域,然后用一个路由层做故障切换。Cloudflare的Smart Routing本身就会做这件事,但自定义路由可以加入业务逻辑(比如某个节点延迟突然升高时主动切换)。
6.2 请求缓存层
在代理层加一个轻量缓存,对完全相同的请求直接返回缓存结果。特别是对于embedding接口和重复的system prompt,缓存命中率可以很高。用Cloudflare KV或Durable Objects都能实现。
6.3 监控与告警
给代理加上监控。Cloudflare Workers自带Analytics,可以看到请求量、错误率、CPU时间等指标。建议再接一个外部监控(比如UptimeRobot),代理域名不可用时立即告警。
七、总结
回到开头那个问题——国内开发者要不要搞API代理?我的答案是:要搞,而且越早越好。
不是因为你做错了什么,而是网络环境就是这样。与其每天跟高延迟和超时作斗争,不如花半天时间搭一个代理,把问题从根本上解决掉。
方案选择上,我的建议优先级是:Cloudflare Workers > 自建Nginx > 第三方中转。Workers在成本、延迟、运维难度之间取得了最好的平衡。除非你有特殊的安全或合规需求必须自建,否则Workers基本够用。
最后提醒一句:不管用什么方案,安全防护一定要做。裸奔的代理被扫到只是时间问题,到时候损失的不仅是API费用,还可能影响你的整个服务。
有问题欢迎留言讨论,我会尽量回复。如果这篇文章帮到了你,也欢迎分享给身边同样在折腾AI API的同学。