Gateway

一、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 = 风控核心存储

相关推荐
Rain的Java大神之路4 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
需要8264 天前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat
需要8264 天前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
苏渡苇5 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
叶总没有会5 天前
Nacos—注册中心
spring cloud·微服务
苏渡苇6 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
叶总没有会6 天前
微服务--分布式基础
java·spring·spring cloud·微服务
孙启超7 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
行百里er8 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
砍材农夫8 天前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud