Spring Cloud Gateway内部链路与生产面试题
本页只放标准回答、追问和原理跳转。
1. Gateway一次请求怎样走
标准回答: Reactor Netty接收连接,WebFlux创建ServerWebExchange,RoutePredicateHandlerMapping匹配Route,FilteringWebHandler合并并排序Global/Gateway Filter;前置Filter处理鉴权、限流和改写,lb方案选择实例,NettyRoutingFilter借连接转发,下游响应经后置Filter和NettyWriteResponseFilter写回。
原理:完整请求链
2. Gateway为什么不能执行阻塞调用
标准回答: Reactor Netty用少量EventLoop处理大量连接;Filter中JDBC、阻塞HTTP或Thread.sleep会占住事件循环,让其他连接无法读写并抬高全站P99。遗留阻塞调用要隔离到有界线程池,但这只隔离、不增加下游容量。
原理:EventLoop
3. Gateway请求体为什么不能直接读两次
标准回答: WebFlux Body是DataBuffer异步流,通常一次消费;Filter读完不重新包装,下游会拿到空Body。缓存完整Body又可能在上传时OOM,应限制大小、只对白名单小请求缓存,并正确管理DataBuffer生命周期。
原理:请求体
4. SSE和文件下载为什么不能统一包装响应体
标准回答: SSE和下载依赖流式传输,聚合完整响应会失去首字节和背压语义并可能OOM。流式路由通常只记录状态、首字节、总字节和结束信号,不缓存完整Body;Timeout也应区分连接、首字节和空闲心跳。
原理:响应流
5. Gateway连接池等待超时说明什么
标准回答: Pool Acquire超时表示请求可能尚未发送到下游,只是在等待可用连接;它与Connect、TLS、Response Timeout不同。排查要查看Active/Idle/Pending、每目标连接上限和长连接分布。
原理:连接池与超时
6. Gateway返回504是否证明下游失败
标准回答: 不能。下游可能已提交事务,只是响应在Gateway超时后返回或丢失。写请求必须使用幂等键并提供结果查询,不能收到504就换新业务号重做。
原理:超时与取消
7. Gateway可以重试POST吗
标准回答: 只有请求体可重放、业务有稳定幂等键、下游原子去重、故障类型可重试且剩余Deadline足够时才评估;仅因为框架能缓存Body不代表POST安全。Gateway、Feign、Mesh还应指定唯一主要重试层。
原理:重试边界
8. 怎样防止客户端伪造用户和租户Header
标准回答: 网关先删除公网请求中的内部身份Header,验证Token或mTLS后重新写入受信上下文,并限制可信代理链;下游仍做资源级授权。不能直接信任客户端传入的X-User-Id、X-Tenant-Id和X-Forwarded-For。
原理:可信Header
9. Gateway扩容后为什么新实例或下游Pod流量少
标准回答: L4、Keep-Alive和HTTP2/gRPC长连接通常在建连接时选后端,旧连接不会因Endpoint更新自动重选。要检查连接数/Stream、最大连接年龄、Resolver、连接排空和慢启动,不只看实例数量。
10. 动态路由怎样安全刷新
标准回答: 从配置源构建带版本的完整候选Route快照,校验Predicate/Filter后原子发布;新请求用新快照,旧请求继续完成。删除路由不等于断开已有WebSocket,仍需停止新建和连接排空。
10.1 为什么动态路由不能每次请求查数据库
标准回答: 动态路由是控制面能力,路由中心负责保存、审批、发布、通知和回滚;Gateway数据面应在本地已加载的路由快照上快速匹配。每次请求同步查数据库或配置中心,会让控制面承受业务QPS,增加RT,并在配置中心抖动时拖垮入口流量。
原理:动态路由控制面
10.2 路由匹配顺序为什么会导致串路由
标准回答: 多条Route可能同时匹配一个请求,先命中的路由会决定后续Filter和目标服务。若 /api/** 这类宽泛路由排在 /api/admin/** 前面,管理接口可能被转到普通服务。生产应精确路由优先、宽泛路由靠后,并用路径、方法、Host、Header和灰度标签做自动化路由回归测试。
原理:路由匹配顺序
10.3 Gateway灰度为什么推荐稳定Hash
标准回答: 随机权重会让同一用户多次请求在v1/v2之间来回跳,遇到Session、缓存、Feature Flag或响应结构差异时很难排查。稳定Hash基于用户、租户、设备或医院编码把同一主体固定到同一版本,再由Gateway生成可信灰度标签并让LoadBalancer按metadata选实例。
11. Gateway怎样优雅停机
标准回答: 先Readiness摘流并等待传播,再停止新连接/请求,排空普通HTTP和可控长连接,最后关闭连接池和EventLoop。WebSocket/SSE要有客户端重连和终止通知,终止宽限期必须覆盖摘流与排空。
原理:优雅停机
12. Gateway线上P99突然升高怎样排查
标准回答: 按routeId和阶段拆分Route匹配、Filter、Pool Acquire、Connect/TLS、下游响应和写回;检查EventLoop阻塞、连接池Pending、Body聚合、实例分布、多层重试和下游事实,不能只看网关总耗时。
13. Gateway怎么做统一认证
标准回答: Gateway作为统一入口可以校验Access Token、处理登录回调、清洗外部Header、写入Trace和受控用户上下文,并做路由级粗授权。认证失败返回401,权限不足返回403。但Gateway不能替代业务服务授权;下游服务仍应作为Resource Server校验Token,并在Service层做租户、组织、资源归属等数据权限。
14. 使用OAuth2/OIDC时Gateway和认证中心怎么配合
标准回答: 认证授权中心负责登录、授权码、Token签发、JWK公钥和密钥轮换;Gateway可以作为Resource Server校验前端携带的Bearer Token,也可以作为OAuth2 Client完成授权码登录并通过TokenRelay把Access Token转给下游。OAuth2主要是授权框架,OIDC在其上补充身份认证。
15. 各个微服务还要不要认证授权
标准回答: 建议要。每个服务都应作为Resource Server校验JWT或Opaque Token,防止绕过Gateway、Header伪造和网关漏配。接口权限可通过URL规则或@PreAuthorize判断scope/权限码,数据权限必须在Service层结合租户、医院、科室和资源归属校验。
16. 服务间调用怎样传递身份
标准回答: 如果服务调用代表当前用户,例如订单服务调用库存服务,应通过Feign拦截器透传用户Access Token,下游按用户权限判断;如果是定时任务、MQ消费者、批处理等系统调用,应使用client_credentials获取服务账号Token,并按最小权限授权,不能伪造管理员用户。
原理:服务间调用授权
17. JWT验签每次都要请求认证中心吗
标准回答: 通常不需要。Gateway和各资源服务会根据issuer-uri发现jwks_uri,下载JWK公钥集合并本地缓存;每次请求根据JWT Header里的kid找对应公钥验签。只有缓存没有该kid或到达刷新条件时才刷新JWK。密钥轮换必须先发布新公钥,再切换新私钥签Token,最后等旧Token过期后移除旧公钥,否则会出现大面积401。
原理:JWK公钥缓存和密钥轮换
18. JWT权限变更后为什么旧权限还可能生效
标准回答: JWT是自包含Token,资源服务器本地验签成功后会读取Token里的scope和声明;如果旧Token未过期,里面的旧权限快照仍可能被接受。生产上要用短Access Token、受控Refresh Token、token_version、黑名单、Opaque Token introspection或关键权限实时查来缩短撤销窗口。高风险接口不能只相信长期JWT里的权限快照。
原理:Token撤销和权限变更
