Spring Cloud Gateway 的核心概念(Route、Predicate、Filter)是什么?
简化版
Spring Cloud Gateway 有三个核心概念:① Route(路由)——网关的基本单元,包含 id、目标 URI、一组断言和一组过滤器,决定「什么样的请求转发到哪里」;② Predicate(断言)——匹配条件,判断请求是否符合某个路由的规则(如路径匹配 /api/order/**、请求方法是 GET、请求头满足某条件),断言全部通过才走这条路由;③ Filter(过滤器)——对请求/响应做处理的拦截器,分pre(转发前,如鉴权、改请求头、限流)和post(响应后,如改响应、记录日志),实现网关的各种功能。简明区分:Predicate 决定「匹不匹配」,Route 决定「转发到哪」,Filter 决定「怎么加工」。
详细版
三大核心概念:
| 概念 | 作用 |
|---|---|
| Route(路由) | 路由的基本单元 = id + 目标 URI + Predicates + Filters |
| Predicate(断言) | 匹配条件,决定请求是否走这条路由(路径/方法/请求头/时间等) |
| Filter(过滤器) | 对请求/响应加工(鉴权、限流、改写、日志),分 pre/post |
配置示例:
spring:
cloud:
gateway:
routes:
- id: order-route # 路由 id
uri: lb://order-service # 目标(lb= 负载均衡到 order-service)
predicates: # 断言:满足才走这条路由
- Path=/api/order/** # 路径匹配
- Method=GET,POST # 方法匹配
filters: # 过滤器:加工请求
- StripPrefix=1 # 去掉路径前缀
- name: RequestRateLimiter # 限流
内置断言:Path、Method、Header、Query、Host、After/Before/Between(时间)、Cookie 等。 内置过滤器:AddRequestHeader、StripPrefix、RewritePath、RequestRateLimiter、Retry、CircuitBreaker 等。
完整版教学
一、Spring Cloud Gateway 概览
Spring Cloud Gateway 是 Spring 官方的 API 网关,基于 Spring WebFlux(响应式、Netty) 构建,性能好、与 Spring 生态无缝。它的工作模型可以用三个核心概念概括——Route、Predicate、Filter,理解了这三个就理解了 Gateway 的工作方式。一个请求进来,Gateway 会用 Predicate 找到匹配的 Route,经过 Route 上的 Filter 链加工,最后转发到 Route 指定的目标服务。
二、Route(路由):路由的基本单元
Route(路由) 是 Gateway 的基本构建块,代表一条完整的路由规则。一个 Route 包含:
- id:路由的唯一标识。
- uri:目标地址——请求匹配这条路由后转发到哪里(可以是具体地址
http://...,也可以是lb://service-name表示负载均衡到某个注册的服务)。 - predicates(断言集合):匹配条件——什么样的请求走这条路由。
- filters(过滤器集合):对请求/响应的加工逻辑。
一个网关可以配置很多 Route,每个 Route 定义「满足什么条件(Predicates)的请求,经过什么加工(Filters),转发到哪个目标(uri)」。
三、Predicate(断言):匹配条件
Predicate(断言) 是一个返回 true/false 的匹配条件,用来判断一个请求是否符合某条路由的规则。一条路由可以配多个断言,所有断言都通过(AND 关系),请求才走这条路由。
Gateway 内置了丰富的断言工厂:
- Path:按路径匹配,如
Path=/api/order/**(最常用)。 - Method:按 HTTP 方法匹配,如
Method=GET,POST。 - Header:按请求头匹配。
- Query:按请求参数匹配。
- Host:按域名匹配。
- After / Before / Between:按时间匹配(如某时间后才生效)。
- Cookie、RemoteAddr 等。
请求进入网关,Gateway 会用各条路由的断言去匹配,找到第一条所有断言都满足的路由,就用它。断言决定了「这个请求匹不匹配这条路由」。
四、Filter(过滤器):请求/响应的加工
Filter(过滤器) 是对请求和响应进行拦截和加工的组件,是网关各种功能的实现载体(鉴权、限流、改写、日志都靠 Filter)。
Filter 分两个阶段(类似 AOP 的前置/后置):
- pre(前置,转发前):请求转发到后端之前执行——如鉴权校验、修改请求头/路径、参数校验、限流。
- post(后置,响应后):后端返回响应之后执行——如修改响应头、记录日志、统计耗时。
Gateway 的 Filter 分两类:
- GatewayFilter(局部过滤器):作用于指定的路由(在某条 route 的 filters 里配置)。内置如
StripPrefix(去路径前缀)、AddRequestHeader(加请求头)、RewritePath(重写路径)、RequestRateLimiter(限流)、Retry(重试)、CircuitBreaker(熔断)。 - GlobalFilter(全局过滤器):作用于所有路由,无需在每条路由单独配置。常用于全局鉴权、全局日志等。可自定义实现。
多个 Filter 组成一条过滤器链,请求依次经过各 Filter 的 pre 逻辑 → 转发到后端 → 响应依次经过各 Filter 的 post 逻辑。
五、三者如何协作:一次请求的流转
把三个概念串起来,一次请求在 Gateway 里的流转:
- 请求进入网关。
- Gateway 遍历所有 Route,用每条路由的 Predicate 匹配请求,找到匹配的路由。
- 请求进入这条路由的 Filter 链:依次执行各 Filter 的 pre 逻辑(鉴权、限流、改写请求…)。
- 转发请求到路由指定的 uri(目标服务,经负载均衡)。
- 后端返回响应,依次执行各 Filter 的 post 逻辑(改响应、记日志…)。
- 返回响应给客户端。
简明区分::Predicate 判断「匹不匹配这条路由」→ Route 决定「转发到哪个目标」→ Filter 决定「请求/响应怎么加工」。
六、常见误区与追问
这道题面试时最容易丢分的地方,是把「Spring Cloud Gateway 核心概念」答成一段泛泛的组件介绍。更稳的答法是先给结论,再沿着 统一流量入口链路 拆清楚流程,最后补上异常场景、数字边界和选型取舍。
| 回答层次 | 要讲清的内容 | 容易漏掉的边界 |
|---|---|---|
| 核心定义 | Spring Cloud Gateway 的核心是 Route、Predicate、Filter,基于 WebFlux/Reactor Netty 处理请求 | 不要停在名词解释 |
| 流程机制 | 请求进入 Gateway Handler Mapping -> Predicate 判断是否匹配 Route -> 构造 Gateway Filter Chain -> 执行 Pre Filter -> 转发到目标服务 -> 执行 Post Filter | 说明谁触发、谁存储、谁通知、谁兜底 |
| 工程取舍 | 一条路由通常包含 id、uri、predicates 和 filters;Predicate 命中后 Filter 链执行再转发 | 网关适合收口横切能力,但不能把业务逻辑堆到网关,否则会形成新的复杂单体 |
Spring Cloud Gateway 核心概念 面试拆解:
1. 请求进入 Gateway Handler Mapping
2. Predicate 判断是否匹配 Route
3. 构造 Gateway Filter Chain
4. 执行 Pre Filter
5. 转发到目标服务
6. 执行 Post Filter
记忆钩子:先拆路由、过滤器、鉴权、限流、熔断、灰度,再说明网关和业务服务的边界;回答时一定要落到题目中的「Spring Cloud Gateway 核心概念」,不要把相邻中间件的能力混着讲。
- 误区:Predicate 和 Filter 是一回事。 Predicate 负责判断是否匹配路由,Filter 负责修改请求响应或执行横切逻辑。
- 误区:Gateway 基于 Servlet 阻塞模型。 Spring Cloud Gateway 基于 WebFlux 和 Reactor Netty,区别于 Zuul 1 的阻塞模型。
- 误区:Filter 只有全局一种。 它有 GlobalFilter 和 GatewayFilter,作用范围不同。
- 追问:Route 由哪些部分组成? 路由 ID、目标 URI、断言 Predicate、过滤器 Filter 和顺序等。
- 追问:Pre 和 Post Filter 区别是什么? Pre 在转发前执行,Post 在后端响应返回后执行。
- 追问:为什么 Gateway 适合高并发网关? 非阻塞事件模型能减少线程阻塞,适合 I/O 密集转发。
七、加强记忆
Spring Cloud Gateway(基于 WebFlux/Netty 响应式)三大核心概念:① Route(路由)——基本单元 = id + 目标 uri(lb://服务名 负载均衡)+ Predicates + Filters,定义「什么请求经什么加工转发到哪」;② Predicate(断言)——匹配条件(Path/Method/Header/Query/Host/时间等,多个 AND),决定请求走不走这条路由;③ Filter(过滤器)——对请求/响应加工(鉴权/限流/改写/日志),分 pre(转发前)/post(响应后),有局部 GatewayFilter(指定路由)和全局 GlobalFilter(所有路由)。协作流程:Predicate 匹配路由 → 走 Filter 链 pre → 转发到 uri → Filter 链 post → 返回。口诀:Predicate 管匹配、Route 管去向、Filter 管加工。