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/权重控制 + 路由分发 可结合配置中心控制
相关推荐
追逐时光者4 小时前
一款使用 C# 编写专为 Windows 11 打造的文件资源管理器增强工具!
后端·.net
风象南5 小时前
普通人用AI加持赚到的第一个100块
人工智能·后端
冰_河6 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
JavaGuide9 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程9 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
格砸10 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
蝎子莱莱爱打怪11 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
哈密瓜的眉毛美11 小时前
零基础学Java|第三篇:DOS 命令、转义字符、注释与代码规范
后端
用户605723748730811 小时前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员