# ============================================================
# Nginx 负载均衡 - 一致性哈希配置示例
# ============================================================
#
# 功能说明:
# - 基于请求特征哈希分配服务器
# - 服务器变更时最小化影响范围
# - 支持虚拟节点实现更均匀分布
#
# Lolly 对应配置:
# server:
#   proxy:
#     - path: "/api"
#       targets:
#         - url: "http://backend1:8080"
#         - url: "http://backend2:8080"
#         - url: "http://backend3:8080"
#       load_balance: "consistent_hash"
#       hash_key: "ip"  # 可选值: ip, uri, "header:X-Custom"
#       virtual_nodes: 150  # 默认值
# ============================================================

# 基于 URI 的哈希（缓存场景）
upstream cache_backend {
    # 一致性哈希
    # Lolly 对应: load_balance: "consistent_hash"
    hash $request_uri consistent;

    server backend1:8080;
    server backend2:8080;
    server3:8080;
}

# 基于 IP 的哈希（会话保持）
upstream session_backend {
    hash $remote_addr consistent;

    server backend1:8080;
    server backend2:8080;
    server backend3:8080;
}

# 基于 Header 的哈希
upstream user_backend {
    # 根据用户 ID Header 分配
    # Lolly 对应: hash_key: "header:X-User-ID"
    hash $http_x_user_id consistent;

    server backend1:8080;
    server backend2:8080;
    server backend3:8080;
}

server {
    listen 80;
    server_name consistent.example.com;

    # 缓存场景 - 基于 URI
    location /cache {
        proxy_pass http://cache_backend;
        proxy_set_header Host $host;
    }

    # 会话场景 - 基于 IP
    location /session {
        proxy_pass http://session_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 用户场景 - 基于 Header
    location /user {
        proxy_pass http://user_backend;
        proxy_set_header Host $host;
        proxy_set_header X-User-ID $http_x_user_id;
    }
}

# 一致性哈希算法说明:
#
# 1. 工作原理:
#    - 将服务器映射到哈希环上（0 ~ 2^32-1）
#    - 请求特征哈希后查找最近的服务器
#    - 虚拟节点使分布更均匀
#
# 2. 虚拟节点:
#    - 每个服务器对应多个虚拟节点
#    - Lolly 默认 150 个虚拟节点
#    - 解决服务器数量少时分布不均匀问题
#
# 3. 优势 vs IP 哈希:
#    - 服务器增减仅影响部分请求（约 1/N）
#    - 支持动态伸缩
#    - 可选择哈希键（IP、URI、Header）
#
# 4. 适用场景:
#    - 缓存服务（相同 URI 路由到相同服务器）
#    - 会话保持（相同用户到相同服务器）
#    - 分片存储（数据按特征分布）
#
# 5. 哈希键选择:
#    - $remote_addr: 客户端 IP（会话保持）
#    - $request_uri: 请求 URI（缓存）
#    - $http_header_name: 自定义 Header（用户分片）
#
# 6. Lolly 配置对照:
#    hash_key 参数:
#    - "ip" -> hash $remote_addr
#    - "uri" -> hash $request_uri
#    - "header:X-User-ID" -> hash $http_x_user_id