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

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

✅ 实现方式

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

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

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

✅ 实现方式

  1. 定义全局过滤器 GlobalFilter
java 复制代码
@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)
yaml 复制代码
spring:
  sleuth:
    sampler:
      probability: 1.0

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

✅ Redis 限流实现方式

使用 RequestRateLimiterGatewayFilterFactory

yaml 复制代码
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维度)

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

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

✅ 基于请求 Header 的灰度路由

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: gray_route
          uri: http://gray-service
          predicates:
            - Header=version, v2

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

java 复制代码
@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/权重控制 + 路由分发 可结合配置中心控制
相关推荐
quant_19863 分钟前
BTC 行情预警系统实战教程
开发语言·后端·python·websocket·程序人生·金融
superman超哥27 分钟前
Rust 日志级别与结构化日志:生产级可观测性实践
开发语言·后端·rust·可观测性·rust日志级别·rust结构化日志
每天早点睡27 分钟前
continue语句
后端
每天早点睡28 分钟前
while语句
后端
风象南28 分钟前
Spring Boot 配置 diff 实战
后端
不会写代码的里奇41 分钟前
从零开发基于DeepSeek的端侧离线大模型语音助手:全流程指南
c++·后端·音视频
不能放弃治疗1 小时前
发消息逻辑写在MySQL事务中,导致消费逻辑Bug
后端
Cache技术分享1 小时前
279. Java Stream API - Stream 拼接的两种方式:concat() vs flatMap()
前端·后端
纯粹的热爱1 小时前
Rust 安装加速指南
后端
南昌彭于晏1 小时前
解决springboot静态内部类非空校验无效的问题
java·spring boot·后端