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

相关推荐
乐观的Terry13 小时前
8、发布系统-完整流水线的核心
java·spring boot·spring·spring cloud
野蛮人6号4 天前
黑马天机学堂系列问题之域名无法正常使用
java·spring cloud·天机学堂
爱学习的小可爱卢4 天前
SpringCloud——微服务实战:OpenFeign与Nacos服务调用详解
spring·spring cloud·微服务
野蛮人6号5 天前
黑马天机学堂Day01-08.搭建项目环境-本地开发部署方式——不知道nacos的密码是什么
java·spring cloud·黑马程序员·天机学堂·黑马天机学堂
dyonggan5 天前
IDEA从零搭建SpringCloud Alibaba完整工程
java·spring cloud·intellij-idea
tryxr5 天前
Spring Cloud Gateway
java·开发语言·数据库·网关·spring cloud·gateway
码农学院6 天前
建筑机械行业AI搜索优化技术方案:基于Spring Cloud微服务架构的文件管理与智能化内容推荐系统
人工智能·spring cloud·架构
Devin~Y6 天前
互联网大厂Java面试实战:Spring Boot、MyBatis、Redis、Kafka、JWT、Spring Cloud 与 AI 场景追问
java·spring boot·redis·spring cloud·kafka·mybatis·spring security
_waylau6 天前
Spring Framework HTTP服务客户端详解
java·后端·网络协议·spring·http·spring cloud
tryxr6 天前
Spring Cloud eureka
spring·spring cloud·eureka