【技术交流】基于 Cloudflare Workers 的轻量级 API 网关实践分享
最近在折腾 Cloudflare Workers 做边缘计算相关的东西,顺便把自己踩过的坑和一些实践经验简单整理一下,希望对有兴趣的同学有帮助。如果有更好的优化方案也欢迎一起讨论。📌 1. 背景
为了降低业务延迟、减少服务器压力,同时让 API 更好地分发到全球节点,我尝试用 Cloudflare Workers + KV 的方式做一个轻量级 API 网关。目标主要包括:
请求分流
接口鉴权(基于 JWT)
简单限流
基础日志记录
边缘缓存静态资源
⚙️ 2. 架构说明
整体架构相当简单:
Client → Cloudflare Edge → Worker → 后端服务(可选)
Worker 负责做:
Token 校验
IP 过滤
速率限制(基于 Durable Objects 或 R2)
返回 JSON 或 HTML
如果是简单接口,也可以完全在边缘处理,不走后端。
🔐 3. 鉴权设计
我使用了 JWT 做鉴权,Workers 原生就能跑 crypto,这点很方便。
const token = request.headers.get("Authorization")?.replace("Bearer ", "");
if (!token || !verifyJWT(token, env.JWT_SECRET)) {
return new Response(JSON.stringify({ error: "Unauthorized" }), {
status: 401,
});
}
另外还加了 IP 白名单(支持 cf-connecting-ip):
const ip = request.headers.get('cf-connecting-ip') || '0.0.0.0';
if (!ALLOWED_IPS.includes(ip)) {
return new Response("Forbidden", { status: 403 });
}
🚀 4. 速率限制
如果你不想用 Cloudflare 的 Enterprise 限流,可以自己做一个超轻量版,用 KV 即可。
示例(每 IP 每分钟最多 30 次):
const key = `rate:${ip}:${minute}`;
let count = await env.KV.get(key);
count = count ? parseInt(count) : 0;
if (count > 30) {
return new Response("Too Many Requests", { status: 429 });
}
await env.KV.put(key, count + 1, { expirationTtl: 60 });
对普通场景来说已经够用。
📊 5. 日志系统(可选)
我自己写了一个简单的日志结构,主要记录成功/失败请求、来源 IP、处理时间等,方便后期做分析。
可以写入:
R2
Workers Analytics
甚至是一个简单的 HTTP 日志上报接口
🧪 6. 一些踩坑
Workers dev 本地和线上环境行为 有时不一致,尤其是 Headers、CF properties
KV 读写操作有延迟,不适合做强一致状态
不建议在 Worker 内部做超长逻辑,否则 TTFB 会明显变慢
建议开启 Cache API,尤其是静态 JSON 或 HTML
📘 7. 总结
Cloudflare Workers 非常适合做轻量 API 网关或边缘逻辑处理,可以显著降低后端负载。不过如果你的业务需要强一致性、高持久、复杂事务,Workers 并不能完全替代传统服务端。
如果大家有类似项目,也欢迎一起讨论配置、架构和优化方案。
页:
[1]