Prompts-MCP 686 skills · ai / design / design-pattern / framework / fundamentals / habit / lang / tech-selection /mcp/sse
framework framework/spring-cloud/gateway-routing.md medium

spring-cloud-gateway-routing

Spring Cloud Gateway 网关 — route/predicate/filter 路由、全局过滤器鉴权、限流、CORS 跨域,禁在网关写业务逻辑。Use when 配网关路由 / 加统一鉴权或限流 / 处理跨域时。

网关路由gateway全局过滤器globalfilter网关鉴权cors 跨域
paths
  • *.java

Spring Cloud · Gateway 网关路由

本条只管「网关层怎么路由 + 统一切面(鉴权/限流/跨域)」。具体业务调用见 openfeign.md;限流规则的精细配置见 circuit-breaker.md

规则

概念 作用 要点
route 一条路由 = id + uri + predicates + filters uri: lb://服务名 走负载均衡,不写死 IP
predicate 匹配条件(Path/Method/Header) Path=/api/order/** 按前缀分发
filter 单路由级处理(改路径/加头) StripPrefix 去前缀最常用
GlobalFilter 全局过滤器,所有请求都过 鉴权、日志、链路 ID 注入放这里
限流 RequestRateLimiter + Redis 令牌桶 按 IP / 用户 / 接口维度限流
CORS 全局统一配 globalcors 跨域只在网关配一处,别每个服务各配

铁律:网关只做转发与横切(鉴权/限流/路由/跨域),禁写任何业务逻辑。 业务下沉到各微服务。

正例

spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://order-service          # ✅ lb:// 走注册中心负载均衡
          predicates:
            - Path=/api/order/**
          filters:
            - StripPrefix=2                 # 去掉 /api/order 前缀
      globalcors:                            # ✅ 跨域统一在网关配一次
        cors-configurations:
          '[/**]':
            allowedOriginPatterns: "https://*.example.com"
            allowedMethods: "*"
// ✅ 全局过滤器做统一鉴权,未通过直接短路返回 401
@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (!valid(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
    @Override public int getOrder() { return -100; }  // 越小越先执行
}

反例

// ❌ 在网关里查库、拼业务结果 —— 业务逻辑越界,网关应只转发
@Component
public class OrderFilter implements GlobalFilter {
    public Mono<Void> filter(ServerWebExchange ex, GatewayFilterChain chain) {
        Order o = orderMapper.selectById(...);   // 业务该在 order-service
        // ...
    }
}

自检

  • [ ] 路由 urilb://服务名,没写死实例 IP?
  • [ ] 鉴权/限流/链路用 GlobalFilter 统一做,没散落到各路由?
  • [ ] CORS 只在网关配一处,没有各服务重复配?
  • [ ] 网关里没有任何查库 / 拼业务结果的逻辑?
  • [ ] 阻塞调用没写进 WebFlux 过滤器(Gateway 基于 Reactor)?

相关