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/权重控制 + 路由分发 可结合配置中心控制
相关推荐
952364 小时前
MyBatis
后端·spring·mybatis
uzong7 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab7 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
Daybreak10 小时前
Elasticsearch 里的索引和 Mapping,到底是什么关系?
后端
Lee川10 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
李小狼lee10 小时前
深入浅出sse协议,用代码自己实现
后端
SamDeepThinking11 小时前
并发量就算只有2,该上锁还得上呀
java·后端·架构