Spring Cloud Gateway详解

Spring Cloud Gateway详解

定位:第 04 篇,讲透网关职责、Spring Cloud Gateway 核心模型(路由/断言/过滤器)、请求流程与网关治理

适用版本:Spring Cloud Gateway(Spring Boot 3.x)


目录


一、网关职责

1.1 为什么需要网关

微服务对外不应暴露几十个服务地址,需要统一入口(南北向流量):

职责 说明
统一路由 按路径/头把请求分发到对应服务
认证鉴权 登录校验集中做一次,内部服务信任网关
限流熔断 入口流量控制,保护后端
协议适配/聚合 多接口聚合为一个对外接口、格式转换
统一观测 日志、指标、链路追踪的统一入口

1.2 网关的位置

复制代码
客户端 → 【网关】 → 服务A / 服务B / 服务C(内部互调不再经网关)

网关只管南北向(外部进内部);服务间的东西向调用直连,不过网关。


二、核心模型

2.1 三要素

复制代码
Route(路由)= id + 目标 URI + 若干 Predicate + 若干 Filter
要素 作用
Route 基本单元:匹配成功后转发到哪个 URI
Predicate(断言) 匹配条件:什么样的请求走这条路由
Filter(过滤器) 对请求/响应的加工(改写、加头、限流)

2.2 配置示例

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: order-service
          uri: lb://order-service          # lb 前缀:结合注册中心负载均衡
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1                # 去掉第一段路径再转发
            - AddRequestHeader=X-Source, gateway
复制代码
匹配:/api/orders/123
转发:/orders/123 → order-service 的某个实例

2.3 断言类型

断言 匹配
Path 路径模式
Method HTTP 方法
Header / Query 请求头/参数
After/Before 时间
Weight 按权重分流(灰度)

Weight 断言做灰度:两条路由同路径不同权重(90/10),实现按比例分流到新旧服务。

2.4 过滤器两级

级别 范围
GatewayFilter 路由级,配置在单条路由
GlobalFilter 全局,所有请求都经过(如统一鉴权、日志)

自定义过滤器实现对应接口,可按 order 排序组成链。


三、请求处理流程

复制代码
① 请求到达网关
② 遍历路由,按 Predicate 匹配(多条命中按 order)
③ 命中路由 → 执行过滤器链的前置逻辑(认证、限流、改写)
④ 转发:解析目标(lb:// 经负载均衡选实例)发起请求
⑤ 响应返回 → 过滤器链的后置逻辑(包装、加头)→ 返回客户端

底层:Gateway 基于 WebFlux(Netty)非阻塞 ------高吞吐转发;代价是过滤器里不能做阻塞操作(同 WB-07 铁律)。


四、常用能力

4.1 内置过滤器(高频)

过滤器 用途
StripPrefix=1 转发前去路径前缀
RewritePath 路径重写
AddRequestHeader / RemoveRequestHeader 头操作(如注入内部标识、去除外部伪造头)
RequestRateLimiter 限流(Redis + 令牌桶)
CircuitBreaker 熔断集成

4.2 限流示例

复制代码
RequestRateLimiter + Redis:
   key-resolver 按 IP/用户维度限流
   令牌桶参数:replenishRate(速率)、burstCapacity(突发)

4.3 认证统一

复制代码
GlobalFilter 统一鉴权:
   校验 Token → 解析用户 → 把用户信息写入请求头传给下游
   → 内部服务信任网关注入的身份头(防伪造:外部直连要拦掉)

五、网关治理

要点 说明
高可用 网关无状态,多实例 + 前置负载均衡(LB/Ingress)
动态路由 路由规则外置到配置中心(Nacos),监听变更不重启
安全边界 网关统一认证;内部服务不直接暴露公网;身份头防伪造
性能纪律 非阻塞栈,过滤器禁阻塞操作;缓存热点路由决策
可观测 入口指标(QPS/延迟/错误率)+ 链路起点

六、总结

  1. 职责:南北向统一入口------路由、认证、限流、聚合、观测;东西向调用不过网关。
  2. 模型 :Route = Predicate(匹配)+ Filter(加工)+ 目标 URI;lb:// 结合注册中心负载均衡;断言含 Path/Method/Header/Weight(灰度)。
  3. 流程:匹配路由 → 前置过滤器 → 转发 → 后置过滤器;基于 WebFlux 非阻塞。
  4. 能力:StripPrefix/RewritePath/头操作/限流(Redis 令牌桶)/熔断集成;全局过滤器承载统一鉴权。
  5. 治理:无状态高可用、动态路由外置、安全边界防伪造、非阻塞纪律。

七、常见高频面试题

1. 为什么微服务架构需要网关?

要点:统一南北向入口,解决多服务直接暴露的问题:① 统一路由------客户端只记一个入口,按规则分发到后端服务;② 认证鉴权集中------登录校验一次,内部服务信任网关,不重复实现;③ 流量治理------入口限流熔断保护后端;④ 协议适配与聚合------对外聚合多个内部接口;⑤ 统一观测点。同时内部服务不暴露公网,收敛攻击面。服务间东西向调用不经网关。

2. Spring Cloud Gateway 的核心概念有哪些?

要点:三要素组成路由。Route:基本单元,含 id、目标 URI、断言集与过滤器集;Predicate(断言):匹配条件,如 Path(路径)、Method、Header、Query、Weight(权重分流);Filter(过滤器):对请求/响应加工,分路由级 GatewayFilter 与全局 GlobalFilter。请求按断言匹配路由后,经过滤器链处理转发到目标。目标可用 lb:// 前缀结合注册中心负载均衡。

3. 描述一次请求经过 Gateway 的流程。

要点:① 请求到达网关;② 遍历路由定义,用 Predicate 匹配(多条命中按 order 排序);③ 命中路由后执行过滤器链前置逻辑(认证校验、限流、路径改写等);④ 转发------目标若为 lb://服务名,经负载均衡选实例发起请求;⑤ 响应返回时执行过滤器链后置逻辑(包装响应、加头)后返回客户端。底层基于 WebFlux 非阻塞执行。

4. lb:// 前缀是什么意思?

要点:表示目标地址通过负载均衡解析------网关从注册中心客户端获取该服务名的实例列表,经 LoadBalancer 选一个实例,替换为实际地址转发。相比写死实例地址:实例动态上下线自动感知、流量在多实例间分配。这是网关与注册发现协同的关键配置;不加 lb 就是固定地址直连。

5. 网关如何统一处理认证?

要点:用 GlobalFilter 实现统一鉴权:提取请求中的凭证(Token)校验;成功后解析用户身份,写入请求头传给下游(如 X-User-Id);失败返回 401。内部服务信任网关注入的身份头,不再各自验登录。安全关键:① 防止外部绕过网关直连内部服务伪造身份头------内部服务不暴露公网,或校验来源;② 网关去除外部请求中伪造的同名头后再注入。

6. 如何用网关实现灰度发布?

要点:两种方式。① Weight 断言:同一路径配两条路由按权重分流(如新版本 10%),按比例灰度;② 按请求特征:断言匹配携带灰度标记的头/参数,定向路由到灰度实例(配合实例元数据或灰度服务集群)。灰度标记由前端/入口注入。相比改代码分流,网关灰度对业务无侵入,回滚只需调整路由配置。

7. Gateway 的限流是怎么实现的?

要点:内置 RequestRateLimiter 过滤器,基于 Redis + 令牌桶算法:配置令牌填充速率(replenishRate,每秒令牌数)与桶容量(burstCapacity,允许突发);key-resolver 决定限流维度(按 IP、用户、接口------实现类返回限流键)。请求到来取令牌,无令牌则拒绝(429)。生产配置:限流参数按后端容量压测得出;也可集成 Sentinel 做更丰富的规则。

8. Spring Cloud Gateway 和 Zuul 的区别?

要点:执行模型不同。Zuul 1.x 基于 Servlet 同步阻塞(每请求一线程),性能与并发受限;Spring Cloud Gateway 基于 WebFlux + Netty 异步非阻塞,吞吐更高,且与 Spring 生态深度集成(动态路由、断言过滤器模型、负载均衡/熔断集成)。Zuul 2.x 虽改异步但未进入 Spring Cloud 主线。新项目一律选 Gateway;约束是过滤器中不能做阻塞操作。

9. 动态路由怎么实现?

要点:默认路由在配置文件里,变更要重启。动态化:路由定义存配置中心(如 Nacos),网关监听配置变更事件,重建路由表(RouteDefinitionRepository 的实现配合事件发布)。效果:新增/修改路由、灰度权重调整即时生效不重启。工程上:路由变更要有审核与灰度(先小流量验证),避免配置错误打挂入口。

10. 网关的性能与稳定性要注意什么?

要点:① 非阻塞纪律------基于 WebFlux,过滤器禁阻塞操作(调阻塞客户端/DB 会拖垮转发线程);② 高可用------网关无状态多实例部署,前置负载均衡,任何单点故障都是全站入口故障;③ 超时与熔断------对后端的转发配超时,集成熔断防后端故障传导;④ 限流保护------入口限流防洪峰;⑤ 观测------网关是全局流量入口,QPS/延迟/错误率指标与链路起点必须齐全;⑥ 路由匹配效率------路由数量大时注意匹配开销与缓存。

相关推荐
lexiangqicheng1 小时前
前端高阶面试核心通关指南:深入解析Vue3与React18底层原理及性能优化
前端·面试·性能优化
怕浪猫1 小时前
前端对接聊天 API:我用 React 做了一个比 ChatGPT 还好看的界面
前端·后端·面试
程序员小孔.1 小时前
基于 Spring Cloud + Vue 的 JEEWMS 开源仓储管理平台设计与实现
前端·javascript·vue.js·spring boot·spring cloud·开源
程序员梅雨2 小时前
Hive面试总结
hive·hadoop·面试
ShineWinsu12 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
1m5555555515 小时前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
CoderYanger15 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
白露与泡影16 小时前
后端 Java 面试核心八股汇总|高频面试题 + 解析,覆盖基础到进阶
java·开发语言·面试
SL_staff17 小时前
JVS-APS 实践:用双向反馈闭环打破制造计划孤岛
java·spring cloud·全栈