Spring Cloud Gateway 高级玩法:动态路由、请求日志、限流、灰度发布全方案

1,590 阅读1分钟

一、动态路由(基于配置中心或数据库)

✅ 实现方式

  1. 定义路由实体类
@Data
public class GatewayRouteDefinition {
    private String id;
    private String uri;
    private List<GatewayPredicateDefinition> predicates;
    private List<GatewayFilterDefinition> filters;
}
  1. 自定义 RouteDefinitionLocator
@Component
public class DynamicRouteLocator implements RouteDefinitionLocator {
    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        List<RouteDefinition> definitions = loadFromDBOrNacos(); // 加载数据
        return Flux.fromIterable(definitions);
    }
}
  1. 监听配置变更并刷新路由
@Autowired
private ApplicationEventPublisher publisher;

public void refreshRoutes() {
    publisher.publishEvent(new RefreshRoutesEvent(this));
}

二、请求日志记录(全链路日志 + 请求响应日志)

✅ 实现方式

  1. 定义全局过滤器 GlobalFilter
@Component
public class LoggingGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String traceId = UUID.randomUUID().toString();
        log.info("Incoming request: {}, traceId={}", exchange.getRequest().getURI(), traceId);

        return chain.filter(exchange).then(Mono.fromRunnable(() ->
            log.info("Response completed: traceId={}", traceId)
        ));
    }

    @Override
    public int getOrder() {
        return -1;
    }
}
  1. 日志采集整合链路追踪系统(如 Sleuth + Zipkin)
spring:
  sleuth:
    sampler:
      probability: 1.0

三、限流(基于 Redis + Token Bucket)

✅ Redis 限流实现方式

使用 RequestRateLimiterGatewayFilterFactory

spring:
  cloud:
    gateway:
      routes:
        - id: limited_route
          uri: http://example.org
          predicates:
            - Path=/api/hello
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

✅ 自定义限流策略(IP维度)

@Component
public class IpKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest()
            .getRemoteAddress().getAddress().getHostAddress());
    }
}

四、灰度发布(Header 路由/版本控制)

✅ 基于请求 Header 的灰度路由

spring:
  cloud:
    gateway:
      routes:
        - id: gray_route
          uri: http://gray-service
          predicates:
            - Header=version, v2

✅ 动态实现(版本匹配 + 权重控制)

@Component
public class GrayReleaseFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String version = exchange.getRequest().getHeaders().getFirst("version");
        if ("v2".equals(version)) {
            // 重定向到新版服务
        }
        return chain.filter(exchange);
    }
}

📌 总结

功能模块核心技术点建议方式
动态路由RouteDefinitionLocator + 配置中心推荐数据库 + 热刷新
请求日志全局过滤器 + 链路追踪推荐集成 Sleuth
限流Redis 限流 + IP KeyResolver推荐统一限流组件
灰度发布Header/权重控制 + 路由分发可结合配置中心控制