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

相关推荐
Boop_wu2 小时前
[Spring cloud] Nacos 介绍并配置环境
spring cloud
Boop_wu3 小时前
[Spring Cloud] 快速上手nacos
后端·spring·spring cloud
我登哥MVP4 小时前
SpringCloud Alibaba 核心组件解析:分布式事务(Seata)
java·spring boot·分布式·spring·spring cloud·java-ee·intellij-idea
椰椰椰耶18 小时前
[SpringCloud][14]OpenFeign参数传递方法
后端·spring·spring cloud
Boop_wu1 天前
[Spring cloud]微服务项目搭建(简易)
spring cloud
我登哥MVP1 天前
SpringCloud Alibaba 核心组件解析:服务注册与发现(Nacos)
java·spring boot·后端·spring·spring cloud·java-ee·maven
Boop_wu1 天前
[Spring Cloud] Eureka 配置并使用
spring cloud
山东点狮信息科技有限公司1 天前
点狮HRM-HRM系统安全体系与数据保护方案
后端·安全·spring·spring cloud·微服务·系统安全·资产
我登哥MVP1 天前
SpringCloud 核心组件解析:分布式配置管理
java·spring boot·分布式·spring·spring cloud·java-ee·maven