★ Spring Cloud Gateway 的职责是什么?路由、过滤器、限流如何实现?
结论先行:Gateway 是微服务统一入口,基于 WebFlux + Reactor Netty 的响应式网关(非 Servlet 模型)。核心模型为 路由(Route)= ID + 断言(Predicate) + 过滤器(Filter) + URI:断言决定“请求匹配哪条路由”,过滤器链做改写/鉴权/限流等横切逻辑,最后转发到下游。职责可概括为“路由转发 + 横切治理 + 流量防护”。
一、核心概念与配置
spring:
cloud:
gateway:
routes:
- id: order-route
uri: lb://order-service # 负载均衡到服务
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1 # 去掉 /api
- name: RequestRateLimiter # 限流
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@userKeyResolver}"
| 概念 | 作用 |
|---|---|
| Route | 一条转发规则(id + predicates + filters + uri) |
| Predicate | 匹配条件:Path、Method、Header、Host、Query 等 |
| GatewayFilter | 单路由过滤器,如 StripPrefix、AddRequestHeader |
| GlobalFilter | 全局过滤器,所有路由生效,可自定义鉴权/日志 |
| Filter 顺序 | order 值越小越先执行 |
二、过滤器链如何工作
- 请求进入 WebHandler → 按路由把 GlobalFilter 与 GatewayFilter 排成链;
- 先执行前置逻辑(鉴权、改写头、限流判定)→ 转发下游(NettyRoutingFilter)→ 返回时执行后置逻辑(记录耗时、聚合响应);
- 内置常用过滤器:StripPrefix、RewritePath、AddRequestHeader、SetStatus、RequestRateLimiter、CircuitBreaker(熔断到 fallback)、Retry;
- 自定义鉴权:实现 GlobalFilter + Ordered,在路由转发前校验 JWT/签名并放行或返回 401。
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 校验 token,非法则 exchange.getResponse().setStatusCode(401) 并返回
return chain.filter(exchange);
}
@Override public int getOrder() { return -100; } // 尽量靠前
}
三、限流实现要点
- 官方限流基于 Redis 令牌桶:replenishRate(每秒补充)、burstCapacity(桶容量);
- KeyResolver 决定按谁限流(IP/用户/接口),Bean 化后由 key-resolver SpEL 引用;
- 被限流默认返回 429;可用自定义异常处理返回统一 JSON。
常见追问 / 记忆点
- 追问:Gateway 与 Spring MVC 项目能共存吗?答:Gateway 是 WebFlux 响应式应用,需独占 web 依赖,不能与 MVC 控制器混在同一应用。
- 追问:网关要不要做业务逻辑?答:只做路由、鉴权、限流、灰度等横切面,业务放服务内,避免网关臃肿成单体。
- 记忆点:断言选路由、过滤器做治理、Redis 令牌桶限流;全局过滤器 order 靠前管鉴权。