★ 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 值越小越先执行

二、过滤器链如何工作

  1. 请求进入 WebHandler → 按路由把 GlobalFilter 与 GatewayFilter 排成链;
  2. 先执行前置逻辑(鉴权、改写头、限流判定)→ 转发下游(NettyRoutingFilter)→ 返回时执行后置逻辑(记录耗时、聚合响应);
  3. 内置常用过滤器:StripPrefix、RewritePath、AddRequestHeader、SetStatus、RequestRateLimiter、CircuitBreaker(熔断到 fallback)、Retry;
  4. 自定义鉴权:实现 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 靠前管鉴权。
笔记加载中…