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/延迟/错误率)+ 链路起点 |
六、总结
- 职责:南北向统一入口------路由、认证、限流、聚合、观测;东西向调用不过网关。
- 模型 :Route = Predicate(匹配)+ Filter(加工)+ 目标 URI;
lb://结合注册中心负载均衡;断言含 Path/Method/Header/Weight(灰度)。 - 流程:匹配路由 → 前置过滤器 → 转发 → 后置过滤器;基于 WebFlux 非阻塞。
- 能力:StripPrefix/RewritePath/头操作/限流(Redis 令牌桶)/熔断集成;全局过滤器承载统一鉴权。
- 治理:无状态高可用、动态路由外置、安全边界防伪造、非阻塞纪律。
七、常见高频面试题
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/延迟/错误率指标与链路起点必须齐全;⑥ 路由匹配效率------路由数量大时注意匹配开销与缓存。
