在微服务架构中,API网关就像城市中的十字路口交警:既要确保流量畅通(路由转发),又要拦截可疑车辆(过滤器处理),还能在高峰期实施管制(限流熔断)。Spring Cloud Gateway正是这样一位"数字化交警",今天我们就通过实战来解锁它的三大核心能力。


一、基础建设:构建网关环境

(技术栈:Spring Cloud 2021.0.3 + Java 11)

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

二、路由转发:给请求发放通行证

2.1 基于YAML的路由配置
spring:
  cloud:
    gateway:
      routes:
        - id: user_service_route
          uri: lb://user-service  # 服务发现动态路由
          predicates: 
            - Path=/api/users/**
          filters:
            - StripPrefix=2      # 移除前两级路径
        - id: fallback_route
          uri: http://localhost:8080/fallback
          predicates:
            - Header=X-Request-Type, backup
2.2 Java DSL动态路由(适用于灰度发布)
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("payment_route", r -> r.path("/pay/**")
            .filters(f -> f.addRequestHeader("X-Routing-Type", "priority"))
            .uri("lb://payment-service"))
        .route("legacy_route", r -> r.host("old.company.com")
            .uri("http://legacy.server:8080"))
        .build();
}

三、过滤器链:打造智能检查站

3.1 内置过滤器实战
filters:
  - AddRequestHeader=X-Client-ID, 12345
  - RewritePath=/v1/(?<segment>.*), /$\{segment}
  - ModifyRequestBody=User, User  # 使用JSON转换过滤器
3.2 自定义过滤器(实现IP白名单)
@Component
public class IPWhitelistFilter implements GlobalFilter {
    
    private Set<String> whitelist = Set.of("192.168.1.0/24");

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        if(!isAllowed(ip)) {
            exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    private boolean isAllowed(String ip) {
        // 实现CIDR校验逻辑
    }
}

四、防御体系:熔断限流黄金组合

4.1 令牌桶限流(基于Redis)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

spring:
  redis:
    host: localhost

  cloud:
    gateway:
      routes:
        - id: rate_limit_route
          uri: lb://order-service
          predicates:
            - Path=/orders/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 50  # 每秒补充令牌数
                redis-rate-limiter.burstCapacity: 100 # 突发容量
                key-resolver: "#{@userKeyResolver}"

@Bean
KeyResolver userKeyResolver() {
    return exchange -> Mono.just(
        exchange.getRequest().getHeaders().getFirst("X-User-Id"));
}
4.2 熔断配置(集成Resilience4j)
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>

filters:
  - name: CircuitBreaker
    args:
      name: inventoryCircuit
      fallbackUri: forward:/fallback/inventory
      statusCodes: 
        - 500
        - 504

五、实践指南:你不知道的魔鬼细节

5.1 路由匹配优先级陷阱

路由配置的顺序直接影响匹配结果,采用"最长路径优先"原则。建议使用路由权重进行精确控制:

routes:
  - id: specific_route
    uri: lb://v2-service
    predicates:
      - Path=/api/v2/**
      - Weight=group1, 90
  - id: generic_route  
    uri: lb://v1-service
    predicates:
      - Path=/api/**
      - Weight=group1, 10
5.2 过滤器执行顺序调试

通过Actuator端点查看过滤器链:

GET /actuator/gateway/globalfilters
GET /actuator/gateway/routefilters

六、技术雷达:核心能力深度剖析

应用场景全景
  • 灰度发布系统:基于Header的路由分流
  • 安全认证中心:JWT校验过滤器集群
  • 流量管控平台:多维度限流策略组
  • 异构系统桥梁:协议转换过滤器
性能优化要点
  1. 配置缓存优化:启用spring.cloud.gateway.redis-rate-limiter.enableRateLimitResponseHeaders=false
  2. Netty线程调优:调整reactor-netty的worker线程数
  3. 响应式编程优化:避免在过滤器中阻塞调用
技术选型对比
维度 Spring Cloud Gateway Zuul 1.x Nginx
吞吐量 高(响应式) 低(阻塞) 极高
配置灵活性 Java DSL + YAML 注解驱动 配置文件
集成复杂度 中等 高(Lua脚本)
可观测性 Actuator + Micrometer 有限 需单独配置

七、经验总结:从战场归来的启示

  1. 路由匹配:当使用多个predicate时,注意逻辑与(AND)的组合效果
  2. 过滤器顺序:修改请求参数的过滤器必须早于需要读取这些参数的过滤器
  3. 限流策略:结合Redis Cluster实现分布式限流场景
  4. 熔断监控:通过Micrometer对接Prometheus实现熔断器状态可视化
  5. 冷启动保护:在网关层实现动态预热权重调整