以下是使用 Cloudflare Worker 实现多域名负载均衡并利用本地缓存的方案:
一、实现思路
- 多域名负载均衡:使用轮询策略分发请求到多个后端域名。
- 本地缓存:利用 Worker 的 Cache API 缓存响应,减少重复请求。
二、代码示例
const backends = [
"https://backend1.example.com",
"https://backend2.example.com",
"https://backend3.example.com"
];
// 生成请求的缓存键(不包含查询参数)
function createCacheKey(request) {
const url = new URL(request.url);
return new Request(url.origin + url.pathname, request);
}
async function handleRequest(request) {
// 仅缓存 GET 请求
if (request.method !== 'GET') {
return fetch(request);
}
const cache = caches.default;
const cacheKey = createCacheKey(request);
let response = await cache.match(cacheKey);
// 缓存命中
if (response) {
return response;
}
// 负载均衡:随机选择后端
const backend = backends[Math.floor(Math.random() * backends.length)];
const backendUrl = new URL(request.url);
backendUrl.hostname = new URL(backend).hostname;
try {
response = await fetch(backendUrl.toString(), {
...request,
headers: { ...request.headers }
});
// 仅缓存成功响应
if (response.ok) {
const cloned = response.clone();
const ttl = 60 * 5; // 5分钟缓存
const cacheResponse = new Response(cloned.body, {
...cloned,
headers: {
...cloned.headers,
'Cache-Control': `max-age=${ttl}`
}
});
event.waitUntil(cache.put(cacheKey, cacheResponse));
}
return response;
} catch (err) {
// 错误处理:尝试下一个后端
return new Response('Service Unavailable', { status: 503 });
}
}
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
三、关键配置说明
后端列表配置:
const backends = ["https://backend1.example.com", ...];
缓存策略:
- 仅缓存
GET
请求 - 缓存键忽略查询参数(根据需求调整)
- 设置 5 分钟 TTL
- 仅缓存
负载均衡策略:
- 随机选择(可改为轮询或加权算法)
- 错误时返回 503(可扩展重试逻辑)
四、高级优化方向
智能路由:
// 基于延迟的优选策略 async function findFastestBackend() { const latencyTests = await Promise.all( backends.map(async url => { const start = Date.now(); await fetch(url + '/health-check'); return { url, latency: Date.now() - start }; }) ); return latencyTests.sort((a,b) => a.latency - b.latency)[0].url; }
会话保持:
// 基于客户端 IP 的哈希 function getStickyBackend(request) { const ip = request.headers.get('cf-connecting-ip'); const hash = Array.from(ip).reduce((acc, char) => acc + char.charCodeAt(0), 0); return backends[hash % backends.length]; }
缓存版本管理:
// 带版本号的缓存键 const CACHE_VERSION = 'v2'; function createCacheKey(request) { const url = new URL(request.url); return `${CACHE_VERSION}:${url.pathname}`; }
五、注意事项
缓存失效:
- 通过修改
CACHE_VERSION
强制刷新 - 使用 Worker KV 存储动态配置
- 通过修改
请求头处理:
- 建议保留原始请求头
- 敏感头(如
Authorization
)需特殊处理
监控告警:
// 添加监控日志 async function logRequest(request, backend) { const logsUrl = 'https://monitoring.example.com/logs'; await fetch(logsUrl, { method: 'POST', body: JSON.stringify({ path: request.url, backend, timestamp: Date.now() }) }); }
该方案实现了:
- 多域名随机负载均衡
- 本地响应缓存(5分钟TTL)
- 基本错误处理
- 可扩展的优化接口
可根据实际业务需求调整缓存策略、负载算法和错误处理机制。建议通过 Cloudflare 的 Analytics 监控缓存命中率和后端健康状态。