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/权重控制 + 路由分发 可结合配置中心控制
相关推荐
非优秀程序员7 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员7 小时前
第06章 浙江帮的内战|《互联网产品恩仇录》
后端
非优秀程序员7 小时前
第08章 马云的反击|《互联网产品恩仇录》
后端
非优秀程序员7 小时前
题记|《互联网产品恩仇录》
后端·程序员·创业
Gopher_HBo11 小时前
Go CPU 剖析的"地基":信号、CAS、写屏障、无锁环形缓冲
后端
panbook11 小时前
从0到1实现一个分布式时序数据库(二):写入成功之后,如何用 WAL 找回数据
后端
Swot11 小时前
上传一张 4MB 图片,我先后撞上了三层请求体限制
后端
IT_陈寒11 小时前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端
OLRainM12 小时前
实习复盘:大模型网关渠道质量评分实战(二)—— 报错了到底算谁的锅?流式归因与 Token 补账踩过的 8 个真坑
后端
梦想恒远12 小时前
Spring Boot + LangChain4j 统计 token 成本:ChatModelListener 实测与单价口径
spring boot·后端