一、Gateway 在微服务中的角色(必须理解)
🧠 本质
Gateway =
👉微服务统一入口 + 安全控制中心 + 流量调度中心
📌 架构位置
客户端 ↓ Nginx(静态 + 反向代理) ↓ Spring Cloud Gateway(核心安全层) ↓ 微服务(Feign调用) ↓ 数据库 / Redis / MQ🚨 Gateway做什么(企业真实职责)
- 鉴权(登录验证)
- 风控(防刷 / 防攻击)
- 限流(QPS控制)
- 路由转发
- 黑名单
- 日志审计
- 灰度发布
🔐 二、Gateway 鉴权(JWT体系)
1️⃣ 登录流程(核心)
用户登录 ↓ 后端生成 JWT ↓ 返回 token ↓ 前端保存 ↓ 每次请求携带 token2️⃣ JWT结构
header.payload.signaturepayload 示例:
{ "userId": 1, "role": "user", "exp": 1710000000 }3️⃣ Gateway鉴权流程(重点)
请求进入 Gateway 1️⃣ 判断是否登录接口(放行) 2️⃣ 获取 token 3️⃣ 解析 JWT 4️⃣ 校验合法性 5️⃣ 写入请求头 userId 6️⃣ 转发到微服务4️⃣ Gateway鉴权代码(真实生产版)
@Component public class AuthGlobalFilter implements GlobalFilter { private static final List<String> WHITE_LIST = Arrays.asList( "/auth/login", "/auth/register" ); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); // 1️⃣ 白名单放行 if (WHITE_LIST.contains(path)) { return chain.filter(exchange); } // 2️⃣ 获取token String token = exchange.getRequest() .getHeaders() .getFirst("Authorization"); if (token == null) { return unauthorized(exchange); } // 3️⃣ 校验JWT try { Claims claims = JwtUtil.parse(token); String userId = claims.get("userId").toString(); // 4️⃣ 传递用户信息到下游服务 ServerHttpRequest request = exchange.getRequest() .mutate() .header("userId", userId) .build(); return chain.filter(exchange.mutate().request(request).build()); } catch (Exception e) { return unauthorized(exchange); } } private Mono<Void> unauthorized(ServerWebExchange exchange) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } }🧠 三、风控体系(企业核心重点)
风控 =
👉 防攻击 + 防刷 + 防盗 + 防爬虫
🚨 四、风控四大维度(企业标准)
1️⃣ IP维度风控(防攻击)
场景:
同一个IP疯狂请求接口规则:
1分钟最多 100 次请求Redis实现:
String key = "ip:limit:" + ip; Long count = redis.incr(key); if (count == 1) { redis.expire(key, 60, TimeUnit.SECONDS); } if (count > 100) { throw new RuntimeException("IP被限流"); }2️⃣ 用户维度风控(防刷)
userId + API示例:
String key = "user:limit:" + userId + ":" + path;👉 防止:
- 刷单
- 刷接口
- 恶意请求
3️⃣ 设备维度风控(高级)
deviceId / fingerprint用途:
- 防机器人
- 防脚本攻击
4️⃣ 行为风控(高级)
点击频率 / 下单频率 / 请求间隔例子:
1秒内点击10次 → 判定异常⚠️ 五、防刷系统(核心设计)
1️⃣ 防重复提交(必须)
String key = "order:submit:" + userId; Boolean lock = redis.setIfAbsent(key, "1", 5, TimeUnit.SECONDS); if (!lock) { throw new RuntimeException("重复提交"); }2️⃣ 防重放攻击(非常重要)
攻击方式:
抓包 → 重放请求 → 重复下单解决方案:
✔ timestamp + nonce
timestamp + 随机数Redis存nonce:
String key = "nonce:" + nonce; if (redis.hasKey(key)) { throw new RuntimeException("重复请求"); } redis.set(key, 1, 10, TimeUnit.MINUTES);3️⃣ 签名机制(防参数篡改)
请求:
userId=1&money=100&sign=xxx服务端验证:
String data = userId + money + secret; String sign = MD5(data); if (!sign.equals(requestSign)) { throw new RuntimeException("签名错误"); }🔥 六、Gateway + 风控完整链路(重点)
请求进入 1️⃣ Gateway ↓ 2️⃣ JWT鉴权 ↓ 3️⃣ IP限流 ↓ 4️⃣ 用户限流 ↓ 5️⃣ 黑名单校验 ↓ 6️⃣ 防重放检查 ↓ 7️⃣ 请求头注入 userId ↓ 8️⃣ 转发微服务⛔ 七、黑名单机制(企业常用)
IP / userId → 黑名单示例:
if (redis.hasKey("black:" + ip)) { throw new RuntimeException("禁止访问"); }🚀 八、企业真实架构(重点)
用户 ↓ Nginx ↓ Gateway(鉴权 + 风控 + 限流) ↓ Sentinel(服务级限流) ↓ Feign调用 ↓ 微服务 ↓ Redis / DB / MQ🧠 九、面试标准回答(直接背)
❓ Gateway作用?
👉 答:
Gateway 是微服务统一入口,负责路由转发、鉴权、限流、风控等功能,是系统安全和流量控制的第一道防线。
❓ 如何做鉴权?
通过 JWT 方式,在 Gateway 中解析 token,校验合法性,并将用户信息透传到下游服务。
❓ 如何做防刷?
企业级防刷通常采用多维度风控:
- IP限流
- 用户限流
- 设备指纹
- 防重放(nonce)
- 签名校验
- Redis计数器限流
🔥 十、你这个阶段最重要理解
你要记住一句话:
Gateway = 第一道安全防线
Sentinel = 服务保护
Redis = 风控核心存储