在用户维度限流场景中,Nginx通过流量分片(哈希路由)和会话粘性,确保同一用户请求路由到固定网关,提升限流效率(利用Nginx本地内存存储用户状态)。以下是具体实现步骤:
1. 基于用户ID的哈希路由(流量分片)
- 原理:对用户ID(如请求参数
userId
或请求头X-User-Id
)进行哈希计算,将请求映射到固定网关实例,实现同一用户请求集中到同一网关,便于Nginx本地限流内存复用。 - Nginx配置示例:
http { # 定义网关集群(支持多实例,如gateway1、gateway2) upstream gateway_cluster { # 一致性哈希(基于用户ID,增强分片稳定性) consistent_hash $arg_userId; # 从请求参数提取userId,也可从请求头提取(如$http_x_user_id) server 192.168.1.100:8080; # 网关实例1 server 192.168.1.101:8080; # 网关实例2 } server { listen 80; server_name api.example.com; location / { # 路由到网关集群(用户ID哈希分片) proxy_pass http://gateway_cluster; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递用户ID到网关(可选,用于网关层二次校验) proxy_set_header X-User-Id $arg_userId; } } }
- 关键指令:
consistent_hash $arg_userId
:基于用户ID的一致性哈希,确保用户请求稳定路由到同一网关(即使网关集群扩容/缩容,也仅少量用户路由变化)。- 若用户ID在请求头中,可替换为
$http_x_user_id
(需前端或上游服务传递)。
- 关键指令:
2. 结合限流的路由配置(用户维度限流 + 路由)
- Nginx本地限流(用户I