Serverless(无服务器)架构是一种云计算执行模型,云服务商动态管理机器资源的分配。开发者只需关注代码编写,无需关心底层服务器运维、扩缩容、高可用等问题。
Serverless 核心概念
事件驱动:代码由事件(如 HTTP 请求、消息队列、定时任务)触发执行
按需计费:只在代码运行时收费,空闲时不产生费用
自动扩缩容:根据负载自动从 0 扩展到 N 个实例
无状态:函数实例每次执行都是独立的,持久化数据需存外部服务
在 Cloudflare 实现 Serverless
Cloudflare 通过 Workers 和 Workers KV 提供全球边缘网络的无服务器能力。
1. 核心服务
Cloudflare Workers:基于 V8 隔离的轻量级 JavaScript/WebAssembly 运行时,在全球 300+ 边缘节点运行
Workers KV:全球分布式键值存储,为 Worker 提供低延迟数据持久化
Durable Objects:提供强一致性的状态存储,适用于实时协作、会话等场景
R2 Storage:兼容 S3 的对象存储,无出口流量费用
2. 快速开始示例
创建简单的 HTTP Worker
// 基础 HTTP 响应 Worker
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// 根据路径返回不同响应
if (url.pathname === '/api/hello') {
return new Response(JSON.stringify({
message: 'Hello from Cloudflare Worker!',
timestamp: new Date().toISOString(),
region: request.cf?.region || 'unknown'
}), {
headers: { 'Content-Type': 'application/json' }
});
}
// 默认返回
return new Response('Welcome to Cloudflare Workers!', {
headers: { 'Content-Type': 'text/plain' }
});
}
};
使用 Workers KV 存储数据
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname === '/api/visits') {
// 从 KV 读取访问次数
const visits = await env.MY_KV_NAMESPACE.get('visits') || 0;
const newVisits = parseInt(visits) + 1;
// 存储新值
await env.MY_KV_NAMESPACE.put('visits', newVisits.toString());
return new Response(`This page has been visited ${newVisits} times!`);
}
return new Response('Not Found', { status: 404 });
}
};
3. 部署配置
wrangler.toml 配置文件
name = "my-serverless-app"
compatibility_date = "2024-01-18"
# KV 命名空间绑定
[[kv_namespaces]]
binding = "MY_KV_NAMESPACE"
id = "your-kv-namespace-id"
# 环境变量
[vars]
API_KEY = "your-secret-key"
# 生产环境配置
[env.production]
name = "my-app-production"
4. 高级功能示例
使用 Durable Objects 实现计数器
// durable-object.js
export class Counter {
constructor(state, env) {
this.state = state;
// 从持久化存储初始化
this.state.blockConcurrencyWhile(async () => {
this.value = (await this.state.storage.get('value')) || 0;
});
}
async fetch(request) {
const url = new URL(request.url);
if (url.pathname === '/increment') {
this.value++;
await this.state.storage.put('value', this.value);
}
return new Response(this.value.toString());
}
}
// worker.js
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname === '/counter') {
// 获取或创建 Durable Object
const id = env.COUNTER.idFromName('global-counter');
const counter = env.COUNTER.get(id);
return counter.fetch(request);
}
return new Response('Not Found', { status: 404 });
}
};
5. 完整项目结构
my-worker-project/
├── src/
│ ├── index.js # 主 Worker 文件
│ └── utils.js # 工具函数
├── wrangler.toml # 配置文件
├── package.json
└── README.md
6. 开发与部署命令
# 安装 Wrangler CLI
npm install -g wrangler
# 登录 Cloudflare
wrangler login
# 本地开发
wrangler dev
# 部署到生产环境
wrangler deploy
# 查看日志
wrangler tail
7. 优势与适用场景
Cloudflare Workers 优势:
⚡ 极低延迟:代码在全球边缘节点运行,靠近用户
💰 成本效益:免费套餐慷慨,按请求次数计费
🌍 全球分布:自动路由到最近节点
🔒 安全性:默认 HTTPS,内置 DDoS 防护
典型应用场景:
API 网关和路由
A/B 测试和特征开关
图片处理和优化
JAMstack 网站后端
实时数据处理
Bot 防护和验证
8. 注意事项
冷启动时间:通常 <5ms,但复杂应用可能更长
执行时长限制:免费版 10ms CPU 时间,付费版 30ms
内存限制:128MB RAM
全局变量:避免在全局作用域存储状态
Cloudflare 的 Serverless 方案特别适合需要低延迟、全球分发的应用场景。相比传统云函数,边缘计算架构能提供更好的用户体验。