导航菜单

就近路由

场景

多地域部署后,需要智能路由。

现状:
- 所有用户都解析到同一 IP
- 无法自动路由到最近地域
- 跨地域访问延迟高

目标:
- 北京用户 → 北京服务器
- 上海用户 → 上海服务器
- 广州用户 → 广州服务器

解决方案

1. GeoDNS 智能解析

域名:api.kuaiyizhi.cn

地域映射:
- 华北地区 → 北京 IP:1.2.3.4
- 华东地区 → 上海 IP:5.6.7.8
- 华南地区 → 广州 IP:9.10.11.12

实现方式:
1. 使用 DNS 服务商的 GeoDNS 功能
2. 自建 BIND 服务器
3. 使用智能 DNS 服务

2. HTTP 重定向

@app.before_request
def redirect_to_nearest_region():
    """重定向到最近地域"""

    # 跳过 API 请求
    if request.path.startswith('/api/'):
        return None

    # 获取用户地域
    user_region = detect_user_region()

    # 检查当前地域
    current_region = get_current_region()

    # 如果用户不在当前地域,重定向
    if user_region != current_region:
        region_urls = {
            'beijing': 'https://beijing.kuaiyizhi.cn',
            'shanghai': 'https://shanghai.kuaiyizhi.cn',
            'guangzhou': 'https://guangzhou.kuaiyizhi.cn'
        }

        return redirect(region_urls[user_region])

def detect_user_region():
    """检测用户地域"""

    # 方法 1:根据 IP 地址
    client_ip = request.remote_addr
    ip_region = get_ip_region(client_ip)

    if ip_region in ['beijing', 'shanghai', 'guangzhou']:
        return ip_region

    # 方法 2:根据用户偏好
    if 'user_id' in session:
        user = get_user(session['user_id'])
        if user.get('preferred_region'):
            return user['preferred_region']

    # 默认:北京
    return 'beijing'

3. CDN 全球加速

使用 CDN 的全球加速功能:

1. 接入 CDN 服务(Cloudflare, Akamai 等)
2. 配置源站地址
3. 启用智能路由
4. 配置边缘节点

架构:

用户请求

CDN 边缘节点(就近)

    判断是否有缓存
    ├─ 有 → 返回缓存
    └─ 无 → 回源到最近地域

监控和优化

延迟监控

def monitor_region_latency():
    """监控各地域延迟"""

    regions = ['beijing', 'shanghai', 'guangzhou']

    for region in regions:
        try:
            # 检查健康端点
            start = time.time()
            response = requests.get(
                f'https://{region}.kuaiyizhi.cn/health',
                timeout=5
            )
            latency = (time.time() - start) * 1000

            # 记录延迟
            record_latency(region, latency)

            # 告警
            if latency > 500:
                send_alert(f'High latency in {region}: {latency}ms')

        except Exception as e:
            send_alert(f'Failed to check {region}: {e}')

# 定时监控
scheduler.add_job(
    monitor_region_latency,
    'interval',
    seconds=60,
    id='monitor_latency'
)

效果验证

优化前

全国访问北京服务器:
- 北京用户:20ms
- 上海用户:100ms
- 广州用户:150ms
- 平均:90ms

优化后(就近路由)

就近访问:
- 华北用户(北京服务器):20ms
- 华东用户(上海服务器):30ms
- 华南用户(广州服务器):25ms
- 平均:25ms

提升:72%

本节小结

✅ 完成的工作:

  • 配置了 GeoDNS 智能解析
  • 实现了 HTTP 重定向
  • 接入了 CDN 全球加速
  • 添加了延迟监控

✅ 效果:

  • 平均延迟降低 72%
  • 用户体验提升
  • 全球用户访问优化

🎯 完成!我已经学会了多地域部署

搜索