Spring-Gateway-理论知识总结/常问面试题

Spring Cloud Gateway 理论知识点总结(实战向)

1. 为什么要用网关

在微服务架构里,网关是流量统一入口,核心价值是把"横切能力"集中治理,而不是分散到每个业务服务。

网关常见职责:

  • 统一路由:按路径、Header、参数等规则转发到不同服务
  • 统一鉴权:JWT/OAuth2、黑白名单、签名校验
  • 统一限流与熔断:保护下游服务,防止雪崩
  • 统一协议处理:CORS、HTTPS、X-Forwarded-*、WebSocket
  • 统一观测:日志、指标、链路追踪、审计

2. Spring Cloud Gateway 的定位

Spring Cloud Gateway(SCG)是基于 Spring WebFlux + Reactor 的响应式网关。

关键特点:

  • 非阻塞 I/O,高并发场景下资源利用率高
  • 通过 Route + Predicate + Filter 构建转发逻辑
  • 与 Spring 生态结合紧密(Spring Security、Spring Cloud LoadBalancer、Micrometer)

适用场景:

  • API 网关、BFF 网关、内部服务入口
  • 需要动态路由、统一鉴权、灰度发布的系统

不适合场景:

  • 团队完全依赖 Servlet 同步编程模型且无响应式经验
  • 极度追求极致性能且已有成熟 Nginx/Lua 或 Envoy 方案

3. 核心模型:Route / Predicate / Filter

3.1 Route(路由)

Route 是"匹配 + 转发 + 处理"的最小单元,通常包含:

  • id:路由唯一标识
  • uri:目标地址(可为 lb://service-name)
  • predicates:匹配条件
  • filters:局部过滤器

3.2 Predicate(断言)

Predicate 用来判断"请求是否命中该路由"。

常用断言:

  • Path:按路径匹配(最常见)
  • Method:按 HTTP 方法匹配
  • Header / Cookie / Query:按请求元数据匹配
  • Host:按域名匹配
  • After / Before / Between:按时间窗口匹配
  • RemoteAddr:按客户端 IP 匹配

匹配要点:

  • 路由按定义顺序尝试匹配,先匹配先处理
  • Path 通配符语义要和后端接口前缀策略保持一致

3.3 Filter(过滤器)

Filter 分两类:

  • GatewayFilter:单路由过滤器(只对某个 Route 生效)
  • GlobalFilter:全局过滤器(对所有请求生效)

执行链路:

  • pre 阶段:转发前(鉴权、限流、日志注入)
  • post 阶段:转发后(响应头处理、审计、统一包装)

4. 常用过滤器理论与实践

4.1 路径改写

  • StripPrefix:按段数去前缀
  • RewritePath:正则重写路径

实践建议:

  • 多服务统一前缀时,优先约定"网关前缀 + 后端真实路径"
  • Swagger/OpenAPI 文档路径通常单独 Rewrite,避免影响业务接口

4.2 Header 处理

  • AddRequestHeader / SetRequestHeader / RemoveRequestHeader
  • DedupeResponseHeader(常用于 CORS 响应头去重)

4.3 安全相关

  • TokenRelay(OAuth2 场景把访问令牌透传下游)
  • 自定义鉴权 Filter(解析 JWT、角色权限校验)

4.4 韧性治理

  • RequestRateLimiter(限流)
  • CircuitBreaker(熔断降级)
  • Retry(重试,需谨慎,避免放大流量)

5. lb:// 与服务发现

uri 使用 lb://service-name 时,SCG 会通过服务发现 + 负载均衡选取实例。

常见组合:

  • Nacos/Eureka/Consul + Spring Cloud LoadBalancer

注意点:

  • 服务名必须与注册中心一致
  • 健康检查异常会导致实例不可达
  • 灰度发布可通过 metadata + 自定义负载策略实现

6. 与 WebFlux 响应式模型的关系

SCG 基于 Reactor:

  • Mono:0~1 个异步结果
  • Flux:0~N 个异步结果

开发过滤器时要注意:

  • 不能写阻塞代码(如阻塞式 JDBC/HTTP 调用)
  • 需通过 Reactor 上下文传递链路信息
  • 错误处理要走响应式链路,避免吞异常

7. 配置优先级与生效顺序

常见优先级理解:

  • 全局过滤器 vs 路由过滤器:按 order 决定先后
  • 多条路由:谁先匹配到谁生效
  • 多条 Rewrite/Strip 规则:按声明顺序生效

实践建议:

  • 把"通用规则"放 global,把"业务差异规则"放 route
  • 在复杂路由中显式设置顺序,减少隐式冲突

8. 网关高频问题排查方法

8.1 404 问题

检查顺序:

  1. 路由是否匹配(Path/Method/Host)
  2. 是否错误 Strip/Rewrite 导致后端路径不存在
  3. 后端服务是否注册成功、健康正常

8.2 401/403 问题

检查顺序:

  1. Token 是否携带且格式正确
  2. 网关鉴权过滤器是否放行了白名单路径
  3. 下游服务是否二次鉴权且权限模型一致

8.3 CORS 问题

检查顺序:

  1. 是否重复写入 Access-Control-Allow-*
  2. OPTIONS 预检请求是否正确放行
  3. 网关和下游是否出现跨域策略冲突

8.4 性能问题

关注指标:

  • 请求总量、P95/P99 延迟
  • 下游调用耗时占比
  • 线程与连接池资源
  • GC 与内存水位

9. 生产实践建议

  • 路由命名规范化:{domain}-{scene}-api
  • 路径前缀统一:/admin-api/*/app-api/*
  • 文档路径单独处理:/v3/api-docs/v2/api-docs
  • 全链路观测必开:traceId、metrics、access log
  • 限流与熔断默认启用,逐步调优阈值
  • 网关配置纳入版本管理,变更走评审

10. 一份推荐的学习路线

  1. 先吃透 Route/Predicate/Filter 三件套
  2. 再掌握路径改写(RewritePath/StripPrefix)与鉴权
  3. 接着理解限流、熔断、重试的边界
  4. 最后补齐响应式编程与性能排障能力

11. 总结

Spring Cloud Gateway 的本质不是"转发器",而是微服务入口治理平台。

用好 SCG 的关键是:

  • 路由设计清晰
  • 路径改写可预期
  • 过滤器职责单一
  • 可观测与韧性能力前置

当你的网关从"能转发"升级到"可治理、可观测、可演进",它才真正成为系统稳定性的核心基础设施。

12. 面试高频问答(Spring Cloud Gateway)

Q1:Spring Cloud Gateway 的核心组件是什么?

A:RoutePredicateFilter。Route 定义转发单元;Predicate 决定是否命中;Filter 负责命中后的前后置处理。

Q2:Gateway 和 Zuul 1 的关键差异是什么?

A:Gateway 基于 WebFlux + Reactor,非阻塞模型;Zuul 1 基于 Servlet 阻塞模型。在高并发下,Gateway 通常有更好的资源利用率。

Q3:StripPrefixRewritePath 如何选?

A:前缀规则简单且固定时优先 StripPrefix;需要精细控制或正则映射时用 RewritePath

Q4:为什么常出现"网关能匹配但后端 404"?

A:多半是路径改写错误。常见问题是网关转发后仍保留业务前缀,导致后端无该接口路径。

Q5:lb://service-name 的底层机制是什么?

A:通过服务注册中心拿实例列表,再由 Spring Cloud LoadBalancer 选择实例并发起转发。

Q6:GlobalFilter 和 GatewayFilter 区别?

A:GlobalFilter 作用全部路由;GatewayFilter 只作用单条路由。通用能力放全局,业务差异放路由级。

Q7:Gateway 里可以写阻塞代码吗?

A:不建议。Gateway 是响应式链路,阻塞调用会拖垮吞吐并放大延迟,应使用非阻塞客户端。

Q8:如何做统一鉴权?

A:通常在 GlobalFilter 中解析 Token、校验权限、写入用户上下文,再将必要信息透传给下游。

Q9:如何避免 CORS 响应头重复?

A:可用 DedupeResponseHeader,并避免网关和下游同时重复写同一组 CORS 头。

Q10:限流常用方案是什么?

A:RequestRateLimiter + Redis(令牌桶)。关键是按用户/IP/接口维度区分 key,并设置降级策略。

Q11:熔断与重试要注意什么?

A:重试会放大流量,不可对非幂等接口盲目重试;熔断应配合 fallback,避免级联故障。

Q12:如何排查 Gateway 性能问题?

A:看 P95/P99、下游耗时、连接池、GC、线程模型;优先确认是否混入阻塞调用。

Q13:路由匹配顺序有何影响?

A:有。通常先定义的路由先匹配,宽泛规则过早声明会"吞掉"更精确路由。

Q14:网关转发后如何保留客户端真实 IP?

A:依赖 X-Forwarded-For / X-Real-IP,并在多层代理场景下明确可信代理边界。

Q15:生产上如何管理网关配置?

A:配置中心 + Git 版本化 + 变更评审 + 灰度发布 + 可观测回放,避免"在线手改不可追溯"。

Q16:Gateway 在系统中的最佳定位?

A:入口治理层,不承载复杂业务编排。网关做"通用横切",业务逻辑放领域服务。

13. 面试速记(30 秒回答模板)

  • 一句话定位:Gateway 是基于 WebFlux 的响应式 API 网关,用于统一路由与入口治理。
  • 三件套:Route 决定去哪,Predicate 决定是否命中,Filter 决定怎么处理。
  • 三个高频坑:路径改写、鉴权链路、CORS 头重复。
  • 三个生产关键:可观测(日志/指标/链路)、韧性(限流/熔断/重试)、配置治理(版本化/灰度/回滚)。
相关推荐
逍遥德2 小时前
postgresql数据库连接问题
数据库·postgresql
此方ls2 小时前
Redis源码研读八——listpack.c 1080-1528行
c语言·数据库·redis
隔壁小邓2 小时前
TIDB分布式数据库
数据库·分布式·tidb
wellc2 小时前
redis连接服务
数据库·redis·bootstrap
隔叶听风2 小时前
RocketMQ 与 Kafka 长轮询详解
数据库·kafka·rocketmq
weixin_704266052 小时前
[特殊字符] Spring IOC/DI 核心知识点 CSDN 风格总结
java·后端·spring
袋鼠云数栈2 小时前
构建金融级数据防线:数栈 DataAPI 的全生命周期管理实践
java·大数据·数据库·人工智能·api
知识分享小能手2 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 数据备份与还原详解 —语法、案例与实战(16)
数据库·学习·postgresql
yc_xym2 小时前
Redis哨兵(Sentinel)机制
数据库·redis·sentinel