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 头重复。
  • 三个生产关键:可观测(日志/指标/链路)、韧性(限流/熔断/重试)、配置治理(版本化/灰度/回滚)。
相关推荐
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
yyuuuzz5 小时前
独立站的技术基础与常见运维问题
大数据·运维·服务器·网络·数据库·aws
来杯@Java6 小时前
图书管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·mybatis·课程设计
卷毛的技术笔记7 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
键盘上的猫头鹰8 小时前
【MySQL 教程(八)】索引、事务、用户管理、导入导出与分页查询
数据库·python·mysql
Royzst8 小时前
数据库知识点
数据库
雪的季节9 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt
宋浮檀s9 小时前
应急响应——Web漏洞:命令执行+SSRF+弱口令
运维·数据库·sql·网络安全·oracle·应急响应
云烟成雨TD11 小时前
Spring AI 1.x 系列【33】RAG Advisor 组件与四大分层架构
java·人工智能·spring
yurenpai(27届找实习中)11 小时前
redis_点评(21.好友关注——关注、取关功能实现;共同关注功能实现)
数据库·redis·缓存