跳转至

Cloudflare Workers: 边缘计算平台

为什么要学 Cloudflare Workers

传统的后端部署模式是:写代码 → 选服务器 → 配置部署 → 管理运维。Cloudflare Workers 把这一切简化为:写代码 → 部署到全球边缘节点 → 自动扩缩

维度传统服务器AWS LambdaCloudflare Workers
冷启动100ms-数秒0ms(无冷启动)
部署节点1-几个区域选择区域300+ 全球节点
运行时任意容器/VMV8 Isolate
最小付费单位服务器/小时100ms免费 10万次/天
配套存储自行配置DynamoDB/S3KV/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(最终一致)
R2S3 兼容的对象存储AWS S3(无出口费)
D1边缘 SQLite 数据库PostgreSQL(轻量版)
Durable Objects有状态的全局单例WebSocket 服务器
Pages静态网站托管 + Workers 集成Vercel/Netlify
WranglerCLI 开发和部署工具Serverless Framework
AI GatewayAI 模型请求代理和缓存API Gateway for LLMs
BindingsWorker 与存储/服务的连接环境变量/依赖注入
RoutesURL 路径与 Worker 的映射路由表

Workers 生态全景

                     ┌─────────────────────────┐
                     │    Cloudflare Workers    │
                     │   (V8 Isolate 运行时)    │
                     └───────┬─────────────────┘
            ┌────────────────┼────────────────────┐
            │                │                    │
    ┌───────▼───────┐ ┌──────▼──────┐ ┌──────────▼─────────┐
    │   KV Storage  │ │     R2      │ │       D1           │
    │   键值存储     │ │  对象存储   │ │   SQLite 数据库     │
    └───────────────┘ └─────────────┘ └────────────────────┘
            │                │                    │
    ┌───────▼───────┐ ┌──────▼──────┐ ┌──────────▼─────────┐
    │ Durable Obj.  │ │  AI Gateway │ │    Queues          │
    │ 有状态对象     │ │  AI 网关    │ │    消息队列         │
    └───────────────┘ └─────────────┘ └────────────────────┘

安装配置

安装 Wrangler CLI

# 使用 npm
npm install -g wrangler

# 使用 pnpm
pnpm add -g wrangler

# 验证
wrangler --version

登录 Cloudflare

wrangler login
# 浏览器打开授权页面,点击允许

创建项目

# 交互式创建
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!');
  },
};
# 本地开发
wrangler dev

# 部署
wrangler deploy

路由处理

// 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 框架):

npm install hono
// 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)

# wrangler.toml
[triggers]
crons = ["0 * * * *"]  # 每小时运行
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,0001000万+
CPU 时间/请求10ms30s
Worker 大小1MB10MB
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 CLIhttps://developers.cloudflare.com/workers/wrangler
D1 文档https://developers.cloudflare.com/d1
R2 文档https://developers.cloudflare.com/r2
KV 文档https://developers.cloudflare.com/kv
Workers AIhttps://developers.cloudflare.com/workers-ai
Hono 框架https://hono.dev
示例项目https://developers.cloudflare.com/workers/examples

总结:Cloudflare Workers 是部署 API 和边缘逻辑最快的方式之一。免费额度足够个人项目和小型应用,配套的 KV/D1/R2 构成了一个完整的 Serverless 技术栈。如果你的应用需要全球低延迟、免运维、按量付费,Workers 是一个值得认真考虑的平台。