以下是使用 Cloudflare Worker 实现多域名负载均衡并利用本地缓存的方案:

一、实现思路

  1. 多域名负载均衡:使用轮询策略分发请求到多个后端域名。
  2. 本地缓存:利用 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));
});

三、关键配置说明

  1. 后端列表配置

    const backends = ["https://backend1.example.com", ...];
    
  2. 缓存策略

    • 仅缓存 GET 请求
    • 缓存键忽略查询参数(根据需求调整)
    • 设置 5 分钟 TTL
  3. 负载均衡策略

    • 随机选择(可改为轮询或加权算法)
    • 错误时返回 503(可扩展重试逻辑)

四、高级优化方向

  1. 智能路由

    // 基于延迟的优选策略
    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;
    }
    
  2. 会话保持

    // 基于客户端 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];
    }
    
  3. 缓存版本管理

    // 带版本号的缓存键
    const CACHE_VERSION = 'v2';
    function createCacheKey(request) {
      const url = new URL(request.url);
      return `${CACHE_VERSION}:${url.pathname}`;
    }
    

五、注意事项

  1. 缓存失效

    • 通过修改 CACHE_VERSION 强制刷新
    • 使用 Worker KV 存储动态配置
  2. 请求头处理

    • 建议保留原始请求头
    • 敏感头(如 Authorization)需特殊处理
  3. 监控告警

    // 添加监控日志
    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 监控缓存命中率和后端健康状态。 以下是使用 Cloudflare Worker 实现多域名负载均衡并利用本地缓存的方案: