Cloudflare Workers: 边缘计算平台¶
为什么要学 Cloudflare Workers¶
传统的后端部署模式是:写代码 → 选服务器 → 配置部署 → 管理运维。Cloudflare Workers 把这一切简化为:写代码 → 部署到全球边缘节点 → 自动扩缩。
| 维度 | 传统服务器 | AWS Lambda | Cloudflare Workers |
|---|---|---|---|
| 冷启动 | 无 | 100ms-数秒 | 0ms(无冷启动) |
| 部署节点 | 1-几个区域 | 选择区域 | 300+ 全球节点 |
| 运行时 | 任意 | 容器/VM | V8 Isolate |
| 最小付费单位 | 服务器/小时 | 100ms | 免费 10万次/天 |
| 配套存储 | 自行配置 | DynamoDB/S3 | KV/R2/D1/DO |
| 配置复杂度 | 高 | 中 | 低 |
Workers 跑在 V8 引擎(Chrome 的 JavaScript 引擎)上,不是 Node.js,但支持标准 Web API(fetch, Request, Response 等)。这意味着: - 没有冷启动(V8 Isolate 而非容器) - 代码跑在离用户最近的边缘节点 - 每个请求在隔离环境中执行
核心概念¶
白话解释¶
把 Cloudflare Workers 想象成"全球分布的函数"——你写一个处理 HTTP 请求的函数,Cloudflare 把它部署到全世界 300 多个数据中心。用户访问时,请求由最近的节点处理,延迟极低。
核心概念表¶
| 概念 | 说明 | 类比 |
|---|---|---|
| Worker | 一段处理请求的代码 | Express 路由处理函数 |
| KV | 全球分布的键值存储 | Redis(最终一致) |
| R2 | S3 兼容的对象存储 | AWS S3(无出口费) |
| D1 | 边缘 SQLite 数据库 | PostgreSQL(轻量版) |
| Durable Objects | 有状态的全局单例 | WebSocket 服务器 |
| Pages | 静态网站托管 + Workers 集成 | Vercel/Netlify |
| Wrangler | CLI 开发和部署工具 | Serverless Framework |
| AI Gateway | AI 模型请求代理和缓存 | API Gateway for LLMs |
| Bindings | Worker 与存储/服务的连接 | 环境变量/依赖注入 |
| Routes | URL 路径与 Worker 的映射 | 路由表 |
Workers 生态全景¶
┌─────────────────────────┐
│ Cloudflare Workers │
│ (V8 Isolate 运行时) │
└───────┬─────────────────┘
┌────────────────┼────────────────────┐
│ │ │
┌───────▼───────┐ ┌──────▼──────┐ ┌──────────▼─────────┐
│ KV Storage │ │ R2 │ │ D1 │
│ 键值存储 │ │ 对象存储 │ │ SQLite 数据库 │
└───────────────┘ └─────────────┘ └────────────────────┘
│ │ │
┌───────▼───────┐ ┌──────▼──────┐ ┌──────────▼─────────┐
│ Durable Obj. │ │ AI Gateway │ │ Queues │
│ 有状态对象 │ │ AI 网关 │ │ 消息队列 │
└───────────────┘ └─────────────┘ └────────────────────┘
安装配置¶
安装 Wrangler CLI¶
登录 Cloudflare¶
创建项目¶
# 交互式创建
wrangler init my-worker
# 选择 TypeScript + "Hello World" 模板
# 或者使用模板
npm create cloudflare@latest my-worker
项目结构¶
my-worker/
├── src/
│ └── index.ts # Worker 入口
├── wrangler.toml # Wrangler 配置
├── package.json
└── tsconfig.json
Wrangler 配置¶
# wrangler.toml
name = "my-worker"
main = "src/index.ts"
compatibility_date = "2024-12-01"
# 环境变量
[vars]
API_VERSION = "v1"
ENVIRONMENT = "production"
# 密钥(通过 wrangler secret 设置)
# wrangler secret put API_KEY
# KV 命名空间绑定
[[kv_namespaces]]
binding = "MY_KV"
id = "xxx"
# R2 桶绑定
[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "my-bucket"
# D1 数据库绑定
[[d1_databases]]
binding = "DB"
database_name = "my-database"
database_id = "xxx"
# 自定义域名路由
[routes]
pattern = "api.example.com/*"
zone_name = "example.com"
快速上手¶
Hello World¶
// src/index.ts
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
return new Response('Hello World!');
},
};
路由处理¶
// src/index.ts
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
switch (url.pathname) {
case '/':
return new Response('Home');
case '/api/hello':
return Response.json({ message: 'Hello!' });
case '/api/users':
if (request.method === 'GET') {
return handleGetUsers(env);
} else if (request.method === 'POST') {
return handleCreateUser(request, env);
}
return new Response('Method not allowed', { status: 405 });
default:
return new Response('Not Found', { status: 404 });
}
},
};
async function handleGetUsers(env: Env): Promise<Response> {
// 从 KV 获取数据
const users = await env.MY_KV.get('users', 'json');
return Response.json(users || []);
}
async function handleCreateUser(request: Request, env: Env): Promise<Response> {
const body = await request.json();
// 存储到 KV
await env.MY_KV.put('users', JSON.stringify(body));
return Response.json(body, { status: 201 });
}
使用 Hono 框架¶
原生路由适合简单场景,复杂 API 推荐使用 Hono(轻量 Web 框架):
// src/index.ts
import { Hono } from 'hono';
import { cors } from 'hono/cors';
type Bindings = {
MY_KV: KVNamespace;
DB: D1Database;
API_KEY: string;
};
const app = new Hono<{ Bindings: Bindings }>();
app.use('*', cors());
app.get('/', (c) => c.text('Hello Hono!'));
app.get('/api/users', async (c) => {
const { results } = await c.env.DB.prepare(
'SELECT * FROM users LIMIT 100'
).all();
return c.json(results);
});
app.post('/api/users', async (c) => {
const { name, email } = await c.req.json();
await c.env.DB.prepare(
'INSERT INTO users (name, email) VALUES (?, ?)'
).bind(name, email).run();
return c.json({ success: true }, 201);
});
export default app;
进阶用法¶
KV 存储¶
// 写入
await env.MY_KV.put('key', 'value');
await env.MY_KV.put('user:123', JSON.stringify({ name: 'Alice' }));
await env.MY_KV.put('session:abc', 'data', { expirationTtl: 3600 }); // 1小时过期
// 读取
const value = await env.MY_KV.get('key');
const user = await env.MY_KV.get('user:123', 'json');
// 列出键
const keys = await env.MY_KV.list({ prefix: 'user:' });
// 删除
await env.MY_KV.delete('key');
D1 数据库¶
# 创建数据库
wrangler d1 create my-database
# 创建表(通过迁移)
wrangler d1 execute my-database --command "CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP)"
// 查询
const { results } = await env.DB.prepare(
'SELECT * FROM users WHERE email = ?'
).bind(email).all();
// 插入
const info = await env.DB.prepare(
'INSERT INTO users (name, email) VALUES (?, ?)'
).bind(name, email).run();
// 批量操作
const batch = await env.DB.batch([
env.DB.prepare('INSERT INTO users (name) VALUES (?)').bind('Alice'),
env.DB.prepare('INSERT INTO users (name) VALUES (?)').bind('Bob'),
]);
R2 对象存储¶
// 上传文件
app.post('/upload', async (c) => {
const formData = await c.req.formData();
const file = formData.get('file') as File;
await c.env.MY_BUCKET.put(file.name, file.stream(), {
httpMetadata: { contentType: file.type },
});
return c.json({ key: file.name });
});
// 下载文件
app.get('/files/:key', async (c) => {
const object = await c.env.MY_BUCKET.get(c.req.param('key'));
if (!object) return c.text('Not Found', 404);
return new Response(object.body, {
headers: { 'Content-Type': object.httpMetadata?.contentType || '' },
});
});
// 列出文件
app.get('/files', async (c) => {
const objects = await c.env.MY_BUCKET.list();
return c.json(objects.objects.map(o => ({ key: o.key, size: o.size })));
});
AI Gateway¶
// 通过 Workers AI 调用模型
app.post('/ai/chat', async (c) => {
const { message } = await c.req.json();
const response = await c.env.AI.run('@cf/meta/llama-3-8b-instruct', {
messages: [{ role: 'user', content: message }],
});
return c.json(response);
});
// 或代理到外部 AI API(通过 AI Gateway 获得缓存和监控)
app.post('/ai/proxy', async (c) => {
const response = await fetch(
'https://gateway.ai.cloudflare.com/v1/ACCOUNT_ID/GATEWAY_NAME/openai/chat/completions',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${c.env.OPENAI_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(await c.req.json()),
}
);
return new Response(response.body, response);
});
定时任务(Cron Triggers)¶
export default {
async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext) {
// 定时任务逻辑
console.log(`Cron trigger: ${event.cron}`);
// 清理过期数据、发送报告等
const keys = await env.MY_KV.list({ prefix: 'temp:' });
for (const key of keys.keys) {
await env.MY_KV.delete(key.name);
}
},
async fetch(request: Request, env: Env): Promise<Response> {
return new Response('OK');
},
};
常见问题¶
Q1: Workers 的限制是什么?¶
| 限制 | 免费版 | 付费版 ($5/月起) |
|---|---|---|
| 请求数/天 | 100,000 | 1000万+ |
| CPU 时间/请求 | 10ms | 30s |
| Worker 大小 | 1MB | 10MB |
| KV 读取/天 | 100,000 | 无限 |
| R2 存储 | 10GB | 按需 |
| D1 存储 | 5GB | 按需 |
Q2: Workers 不是 Node.js,有什么影响?¶
Workers 运行在 V8 Isolate 上,支持: - Web 标准 API(fetch, Request, Response, URL, crypto 等) - ES Modules - 大部分 npm 包(纯 JavaScript 逻辑的)
不支持: - Node.js 原生模块(fs, path, net 等) - 一些需要 Node.js API 的 npm 包
可以通过 node_compat = true 开启 Node.js 兼容层。
Q3: 本地开发如何调试?¶
# wrangler dev 支持本地开发
wrangler dev --local
# 支持断点调试
wrangler dev --inspect
# 打开 chrome://inspect 进行调试
Q4: 如何处理 CORS?¶
使用 Hono 的 cors 中间件,或手动添加 Header:
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE',
'Access-Control-Allow-Headers': 'Content-Type',
};
Q5: Workers 适合什么场景?¶
适合:API 网关、边缘缓存、URL 重写、A/B 测试、认证代理、轻量 API 不太适合:长时间运行的任务、重计算、需要完整 Node.js 生态的应用
参考资源¶
| 资源 | 链接 |
|---|---|
| 官方文档 | https://developers.cloudflare.com/workers |
| Wrangler CLI | https://developers.cloudflare.com/workers/wrangler |
| D1 文档 | https://developers.cloudflare.com/d1 |
| R2 文档 | https://developers.cloudflare.com/r2 |
| KV 文档 | https://developers.cloudflare.com/kv |
| Workers AI | https://developers.cloudflare.com/workers-ai |
| Hono 框架 | https://hono.dev |
| 示例项目 | https://developers.cloudflare.com/workers/examples |
总结:Cloudflare Workers 是部署 API 和边缘逻辑最快的方式之一。免费额度足够个人项目和小型应用,配套的 KV/D1/R2 构成了一个完整的 Serverless 技术栈。如果你的应用需要全球低延迟、免运维、按量付费,Workers 是一个值得认真考虑的平台。