一、Gateway 在微服务中的角色(必须理解)
🧠 本质
Gateway =
👉 微服务统一入口 + 安全控制中心 + 流量调度中心
📌 架构位置
客户端
↓
Nginx(静态 + 反向代理)
↓
Spring Cloud Gateway(核心安全层)
↓
微服务(Feign调用)
↓
数据库 / Redis / MQ
🚨 Gateway做什么(企业真实职责)
- 鉴权(登录验证)
- 风控(防刷 / 防攻击)
- 限流(QPS控制)
- 路由转发
- 黑名单
- 日志审计
- 灰度发布
🔐 二、Gateway 鉴权(JWT体系)
1️⃣ 登录流程(核心)
用户登录
↓
后端生成 JWT
↓
返回 token
↓
前端保存
↓
每次请求携带 token
2️⃣ JWT结构
header.payload.signature
payload 示例:
{
"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 = 风控核心存储