Spring Cloud Gateway 路由与过滤器机制

文章目录

  • 🚦 Spring Cloud Gateway 路由与过滤器机制
    • 📋 目录
    • 🏗️ 一、Gateway 整体架构与设计理念
      • 💡 Gateway 核心架构图
      • 🎯 Gateway 核心组件关系
    • ⚡ 二、Reactor 模型与 Netty 底层原理
      • 🎯 WebFlux 响应式编程模型
      • 🔄 Reactor 执行模型
    • 🛣️ 三、路由匹配机制深度解析
      • 🎯 RoutePredicateHandlerMapping 原理
      • 📋 内置断言工厂详解
    • 🔄 四、过滤器链执行机制
      • 🎯 GatewayFilterChain 执行流程
      • 📊 过滤器执行顺序
    • 🛠️ 五、自定义过滤器开发实战
      • 🔧 全局过滤器开发
      • 🔄 自定义路由过滤器
    • 🔄 六、动态路由与配置热更新
    • 📊 七、性能优化与高并发设计
    • 🆚 八、与 Nginx/Kong 的对比分析

🚦 Spring Cloud Gateway 路由与过滤器机制

📋 目录

  • 🏗️ 一、Gateway 整体架构与设计理念
  • ⚡ 二、Reactor 模型与 Netty 底层原理
  • 🛣️ 三、路由匹配机制深度解析
  • 🔄 四、过滤器链执行机制
  • 🛠️ 五、自定义过滤器开发实战
  • 🔄 六、动态路由与配置热更新
  • 📊 七、性能优化与高并发设计
  • 🆚 八、与 Nginx/Kong 的对比分析

🏗️ 一、Gateway 整体架构与设计理念

💡 Gateway 核心架构图

Spring Cloud Gateway 三层架构
客户端请求 Gateway WebHandler RoutePredicateHandlerMapping 匹配路由规则 构建过滤链 执行Pre过滤器 代理请求到后端 执行Post过滤器 返回响应 配置源 路由定义

🎯 Gateway 核心组件关系

组件依赖关系与执行流程

java 复制代码
/**
 * Gateway 核心组件架构
 * 基于WebFlux的响应式编程模型
 */
@Component
@Slf4j
public class GatewayArchitecture {
    
    /**
     * 1. 网关自动配置类 - 核心配置入口
     */
    @Configuration
    @ConditionalOnClass(DispatcherHandler.class)
    public class GatewayAutoConfiguration {
        
        @Bean
        @ConditionalOnMissingBean
        public RouteLocator routeLocator() {
            return new PropertiesRouteLocator();
        }
        
        @Bean
        public RoutePredicateHandlerMapping routePredicateHandlerMapping(
            FilteringWebHandler webHandler, RouteLocator routeLocator) {
            return new RoutePredicateHandlerMapping(webHandler, routeLocator);
        }
    }
    
    /**
     * 2. 路由定位器接口 - 路由规则来源
     */
    public interface RouteLocator {
        Flux<Route> getRoutes();
    }
    
    /**
     * 3. 路由定义 - 核心路由模型
     */
    @Data
    public class Route {
        private final String id;
        private final URI uri;
        private final int order;
        private final AsyncPredicate<ServerWebExchange> predicate;
        private final List<GatewayFilter> gatewayFilters;
        private final Map<String, Object> metadata;
    }
    
    /**
     * 4. 路由断言处理器映射
     */
    public class RoutePredicateHandlerMapping extends AbstractHandlerMapping {
        
        private final FilteringWebHandler webHandler;
        private final RouteLocator routeLocator;
        
        @Override
        public Mono<Object> getHandlerInternal(ServerWebExchange exchange) {
            return lookupRoute(exchange)
                .map(route -> {
                    exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, route);
                    return webHandler;
                });
        }
        
        private Mono<Route> lookupRoute(ServerWebExchange exchange) {
            return routeLocator.getRoutes()
                .concatMap(route -> Mono.just(route)
                    .filterWhen(r -> r.getPredicate().apply(exchange))
                    .doOnError(e -> log.error("路由匹配错误", e))
                    .onErrorResume(e -> Mono.empty()))
                .next()
                .map(route -> {
                    log.debug("路由匹配成功: {}", route.getId());
                    return route;
                });
        }
    }
    
    /**
     * 5. 过滤Web处理器 - 执行过滤器链
     */
    public class FilteringWebHandler implements WebHandler {
        
        private final List<GatewayFilter> globalFilters;
        
        @Override
        public Mono<Void> handle(ServerWebExchange exchange) {
            Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
            List<GatewayFilter> gatewayFilters = route.getFilters();
            
            // 合并全局过滤器和路由过滤器
            List<GatewayFilter> combined = new ArrayList<>(globalFilters);
            combined.addAll(gatewayFilters);
            
            // 排序过滤器
            AnnotationAwareOrderComparator.sort(combined);
            
            // 构建过滤器链并执行
            return new DefaultGatewayFilterChain(combined).filter(exchange);
        }
    }
}

⚡ 二、Reactor 模型与 Netty 底层原理

🎯 WebFlux 响应式编程模型

Gateway 响应式处理流程

java 复制代码
/**
 * WebFlux 响应式编程在Gateway中的应用
 * 基于Project Reactor的异步非阻塞模型
 */
@Component
@Slf4j
public class ReactiveGatewayArchitecture {
    
    /**
     * 1. 响应式请求处理入口
     */
    @Bean
    public HttpHandler httpHandler() {
        return new ReactorHttpHandlerAdapter(
            WebHttpHandlerBuilder
                .webHandler(createWebHandler())
                .filter(createFilters())
                .build()
        );
    }
    
    /**
     * 2. 创建Web处理器
     */
    private WebHandler createWebHandler() {
        return exchange -> {
            // 构建响应式处理链
            return Mono.fromRunnable(() -> {
                // 设置请求属性
                exchange.getAttributes().put("startTime", System.currentTimeMillis());
                log.debug("开始处理请求: {}", exchange.getRequest().getURI());
            })
            .then(handleRequest(exchange))
            .doOnSuccess(v -> logRequestCompletion(exchange))
            .doOnError(e -> logRequestError(exchange, e));
        };
    }
    
    /**
     * 3. 请求处理核心逻辑
     */
    private Mono<Void> handleRequest(ServerWebExchange exchange) {
        return Mono.defer(() -> {
            // 路由匹配
            return routePredicateHandlerMapping.getHandler(exchange)
                .flatMap(handler -> {
                    if (handler instanceof WebHandler) {
                        return ((WebHandler) handler).handle(exchange);
                    }
                    return Mono.error(new IllegalStateException("不支持的处理器类型"));
                });
        })
        .subscribeOn(Schedulers.boundedElastic()) // 使用弹性调度器
        .timeout(Duration.ofSeconds(30)) // 设置超时
        .onErrorResume(this::handleError); // 错误处理
    }
    
    /**
     * 4. Netty 底层配置
     */
    @Configuration
    public class NettyConfiguration {
        
        @Bean
        public ReactorResourceFactory reactorResourceFactory() {
            ReactorResourceFactory factory = new ReactorResourceFactory();
            factory.setUseGlobalResources(false);
            return factory;
        }
        
        @Bean
        public NettyWebServerFactoryCustomizer nettyWebServerFactoryCustomizer() {
            return factory -> {
                factory.addServerCustomizers(httpServer -> {
                    // 配置Netty服务器参数
                    return httpServer
                        .host("0.0.0.0")
                        .port(8080)
                        .compress(true)
                        .accessLog(true)
                        .httpRequestDecoder(decoder -> {
                            decoder.maxInitialLineLength(4096);
                            decoder.maxHeaderSize(8192);
                        })
                        .tcpConfiguration(tcp -> {
                            return tcp
                                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
                                .option(ChannelOption.SO_BACKLOG, 1000);
                        });
                });
            };
        }
    }
    
    /**
     * 5. 事件循环组配置
     */
    @Bean
    @ConditionalOnMissingBean
    public LoopResources loopResources() {
        return LoopResources.create("gateway-webflux", 1, 4, true);
    }
    
    /**
     * 6. 背压控制
     */
    @Component
    public class BackpressureHandler {
        
        private final RateLimiter rateLimiter;
        
        public BackpressureHandler() {
            this.rateLimiter = RateLimiter.create(1000); // 每秒1000个请求
        }
        
        public <T> Mono<T> withBackpressure(Mono<T> source) {
            return Mono.fromCallable(() -> {
                if (rateLimiter.tryAcquire()) {
                    return source;
                } else {
                    throw new TooManyRequestsException("请求频率超限");
                }
            })
            .flatMap(mono -> mono);
        }
    }
}

🔄 Reactor 执行模型

响应式编程执行流程
HTTP请求 EventLoop Group Channel Handler HttpServerHandler ReactorHttpHandlerAdapter WebHandler RoutePredicateHandlerMapping FilteringWebHandler GatewayFilter Chain 代理后端服务 返回响应

🛣️ 三、路由匹配机制深度解析

🎯 RoutePredicateHandlerMapping 原理

路由匹配核心源码分析

java 复制代码
/**
 * 路由断言处理器映射实现
 * 负责匹配请求到对应的路由规则
 */
@Component
@Slf4j
public class RoutePredicateHandlerMapping {
    
    private final RouteLocator routeLocator;
    private final FilteringWebHandler webHandler;
    private final Map<String, RoutePredicateFactory> predicates;
    
    /**
     * 核心路由匹配方法
     */
    @Override
    public Mono<Object> getHandler(ServerWebExchange exchange) {
        return lookupRoute(exchange)
            .map(route -> {
                // 设置路由属性
                exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, route);
                exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, route.getId());
                
                // 记录匹配日志
                if (log.isDebugEnabled()) {
                    log.debug("路由匹配成功: {} -> {}", 
                             exchange.getRequest().getURI(), route.getUri());
                }
                
                return webHandler;
            })
            .switchIfEmpty(Mono.empty().doOnSuccess(v -> {
                // 没有匹配的路由
                if (log.isDebugEnabled()) {
                    log.debug("没有匹配的路由: {}", exchange.getRequest().getURI());
                }
            }));
    }
    
    /**
     * 路由查找实现
     */
    private Mono<Route> lookupRoute(ServerWebExchange exchange) {
        return routeLocator.getRoutes()
            .concatMap(route -> Mono.just(route)
                .filterWhen(r -> r.getPredicate().apply(exchange))
                .doOnError(e -> log.error("路由断言执行错误: {}", route.getId(), e))
                .onErrorResume(e -> Mono.empty()))
            .next()
            .map(route -> {
                // 记录路由匹配指标
                recordRouteMatchMetric(exchange, route);
                return route;
            });
    }
    
    /**
     * 内置断言工厂实现示例
     */
    @Component
    public class PathRoutePredicateFactory extends AbstractRoutePredicateFactory<PathRoutePredicateFactory.Config> {
        
        public PathRoutePredicateFactory() {
            super(Config.class);
        }
        
        @Override
        public Predicate<ServerWebExchange> apply(Config config) {
            return exchange -> {
                String path = exchange.getRequest().getURI().getPath();
                boolean match = config.patterns.stream()
                    .anyMatch(pattern -> {
                        if (pattern.contains("**")) {
                            // Ant风格路径匹配
                            return antPathMatcher.match(pattern, path);
                        } else {
                            // 正则表达式匹配
                            return path.matches(pattern);
                        }
                    });
                
                if (match && log.isDebugEnabled()) {
                    log.debug("路径匹配成功: {} 匹配模式: {}", path, config.patterns);
                }
                
                return match;
            };
        }
        
        @Data
        public static class Config {
            private List<String> patterns = new ArrayList<>();
        }
    }
    
    /**
     * 多条件组合断言
     */
    @Component
    public class CompositeRoutePredicate implements AsyncPredicate<ServerWebExchange> {
        
        private final List<AsyncPredicate<ServerWebExchange>> predicates;
        
        public CompositeRoutePredicate(List<AsyncPredicate<ServerWebExchange>> predicates) {
            this.predicates = predicates;
        }
        
        @Override
        public Publisher<Boolean> apply(ServerWebExchange exchange) {
            return Flux.fromIterable(predicates)
                .concatMap(predicate -> predicate.apply(exchange))
                .reduce(true, (result, current) -> result && current)
                .flux();
        }
    }
}

📋 内置断言工厂详解

常用路由断言配置示例

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        # 1. 路径匹配路由
        - id: path_route
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
            - Method=GET,POST
            - Header=X-Request-Id, \d+
            - Cookie=sessionId, .+
            - After=2023-01-20T17:42:47.789-07:00[America/Denver]
          
        # 2. 权重路由
        - id: weight_high
          uri: lb://user-service-v2
          predicates:
            - Path=/api/users/**
            - Weight=group1, 80
          
        # 3. 权重路由
        - id: weight_low
          uri: lb://user-service-v1
          predicates:
            - Path=/api/users/**
            - Weight=group1, 20
          
        # 4. 查询参数路由
        - id: query_route
          uri: lb://order-service
          predicates:
            - Path=/api/orders
            - Query=type,prepaid
            - RemoteAddr=192.168.1.1/24
          
        # 5. 自定义断言
        - id: custom_route
          uri: lb://custom-service
          predicates:
            - name: CustomPredicate
              args:
                minVersion: 1.0
                maxVersion: 2.0
          filters:
            - name: CustomFilter
              args:
                prefix: /v1

🔄 四、过滤器链执行机制

🎯 GatewayFilterChain 执行流程

过滤器链核心实现

java 复制代码
/**
 * 网关过滤器链实现
 * 基于责任链模式的过滤器执行机制
 */
@Component
@Slf4j
public class GatewayFilterChainArchitecture {
    
    /**
     * 1. 默认网关过滤器链
     */
    public class DefaultGatewayFilterChain implements GatewayFilterChain {
        
        private final List<GatewayFilter> filters;
        private final int index;
        private final GatewayFilterChain next;
        
        public DefaultGatewayFilterChain(List<GatewayFilter> filters) {
            this.filters = filters;
            this.index = 0;
            this.next = null;
        }
        
        private DefaultGatewayFilterChain(DefaultGatewayFilterChain parent, int index) {
            this.filters = parent.filters;
            this.index = index;
            this.next = index < filters.size() ? 
                new DefaultGatewayFilterChain(parent, index + 1) : null;
        }
        
        @Override
        public Mono<Void> filter(ServerWebExchange exchange) {
            return Mono.defer(() -> {
                if (index < filters.size()) {
                    GatewayFilter filter = filters.get(index);
                    // 记录过滤器执行开始
                    exchange.getAttributes().put("filter." + index + ".start", System.currentTimeMillis());
                    
                    return filter.filter(exchange, next)
                        .doOnSuccess(v -> {
                            // 记录过滤器执行完成
                            long endTime = System.currentTimeMillis();
                            Long startTime = exchange.getAttribute("filter." + index + ".start");
                            if (startTime != null) {
                                long duration = endTime - startTime;
                                log.debug("过滤器 {} 执行耗时: {}ms", 
                                         filter.getClass().getSimpleName(), duration);
                            }
                        })
                        .doOnError(e -> {
                            log.error("过滤器执行失败: {}", filter.getClass().getSimpleName(), e);
                        });
                } else {
                    // 所有过滤器执行完成,转发请求
                    return forwardToBackend(exchange);
                }
            });
        }
    }
    
    /**
     * 2. 全局过滤器排序与执行
     */
    @Component
    public class GlobalFilterConfiguration {
        
        @Bean
        @Order(-1)
        public GlobalFilter loggingFilter() {
            return (exchange, chain) -> {
                long startTime = System.currentTimeMillis();
                String requestId = exchange.getRequest().getId();
                
                log.info("请求开始: {} {} {}", 
                        exchange.getRequest().getMethod(), 
                        exchange.getRequest().getURI(),
                        requestId);
                
                return chain.filter(exchange)
                    .doOnSuccess(v -> {
                        long duration = System.currentTimeMillis() - startTime;
                        log.info("请求完成: {} 状态: {} 耗时: {}ms", 
                                requestId, 
                                exchange.getResponse().getStatusCode(), 
                                duration);
                    })
                    .doOnError(e -> {
                        long duration = System.currentTimeMillis() - startTime;
                        log.error("请求失败: {} 耗时: {}ms", requestId, duration, e);
                    });
            };
        }
        
        @Bean
        @Order(0)
        public GlobalFilter authFilter() {
            return (exchange, chain) -> {
                String token = exchange.getRequest().getHeaders().getFirst("Authorization");
                if (token == null || !validateToken(token)) {
                    exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                    return exchange.getResponse().setComplete();
                }
                return chain.filter(exchange);
            };
        }
        
        @Bean
        @Order(1)
        public GlobalFilter rateLimitFilter() {
            return new RateLimitGlobalFilter();
        }
    }
    
    /**
     * 3. 内置过滤器示例
     */
    @Component
    public class BuiltInFilters {
        
        /**
         * 添加请求头过滤器
         */
        public class AddRequestHeaderFilter implements GatewayFilter {
            
            private final String name;
            private final String value;
            
            public AddRequestHeaderFilter(String name, String value) {
                this.name = name;
                this.value = value;
            }
            
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                // 添加请求头
                ServerHttpRequest request = exchange.getRequest().mutate()
                    .header(name, value)
                    .build();
                return chain.filter(exchange.mutate().request(request).build());
            }
        }
        
        /**
         * 重试过滤器
         */
        public class RetryFilter implements GatewayFilter {
            
            private final int maxAttempts;
            private final List<HttpStatus> statuses;
            
            public RetryFilter(int maxAttempts, List<HttpStatus> statuses) {
                this.maxAttempts = maxAttempts;
                this.statuses = statuses;
            }
            
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                return chain.filter(exchange)
                    .retryWhen(Retry.fixedDelay(maxAttempts, Duration.ofSeconds(1))
                        .filter(throwable -> {
                            if (throwable instanceof WebClientResponseException) {
                                WebClientResponseException ex = (WebClientResponseException) throwable;
                                return statuses.contains(ex.getStatusCode());
                            }
                            return false;
                        }));
            }
        }
    }
}

📊 过滤器执行顺序

过滤器执行优先级配置

yaml 复制代码
spring:
  cloud:
    gateway:
      default-filters:
        # 全局默认过滤器
        - AddRequestHeader=X-Request-Gateway, SpringCloudGateway
        - PrefixPath=/api
        - StripPrefix=1
      
      routes:
        - id: user_route
          uri: lb://user-service
          predicates:
            - Path=/users/**
          filters:
            # 路由级别过滤器
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY,SERVICE_UNAVAILABLE
            - name: CircuitBreaker
              args:
                name: userService
                fallbackUri: forward:/fallback/user
            # 执行顺序:按配置顺序执行
            - AddResponseHeader=X-Response-Time, anonymized
            - ModifyResponseBody=UserResponse, UserResponse

🛠️ 五、自定义过滤器开发实战

🔧 全局过滤器开发

自定义全局过滤器示例

java 复制代码
/**
 * 自定义全局过滤器实战
 * 实现认证、限流、日志等通用功能
 */
@Component
@Slf4j
public class CustomGlobalFilters {
    
    /**
     * 1. JWT认证过滤器
     */
    @Component
    @Order(-1000)
    public class JwtAuthenticationFilter implements GlobalFilter {
        
        @Autowired
        private JwtTokenProvider tokenProvider;
        
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            String path = exchange.getRequest().getURI().getPath();
            
            // 跳过认证的路径
            if (shouldSkipAuth(path)) {
                return chain.filter(exchange);
            }
            
            // 获取Token
            String token = extractToken(exchange.getRequest());
            if (token == null) {
                return unauthorized(exchange, "缺少认证Token");
            }
            
            // 验证Token
            try {
                Authentication auth = tokenProvider.validateToken(token);
                exchange.getAttributes().put("user", auth);
                log.debug("用户认证成功: {}", auth.getName());
                return chain.filter(exchange);
            } catch (JwtException e) {
                log.warn("Token验证失败: {}", e.getMessage());
                return unauthorized(exchange, "Token无效或已过期");
            }
        }
        
        private boolean shouldSkipAuth(String path) {
            return path.startsWith("/auth/login") || 
                   path.startsWith("/public/") ||
                   path.equals("/health");
        }
        
        private String extractToken(ServerHttpRequest request) {
            String header = request.getHeaders().getFirst("Authorization");
            if (header != null && header.startsWith("Bearer ")) {
                return header.substring(7);
            }
            return null;
        }
        
        private Mono<Void> unauthorized(ServerWebExchange exchange, String message) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
            
            byte[] bytes = ("{\"code\": 401, \"message\": \"" + message + "\"}").getBytes();
            DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
            return exchange.getResponse().writeWith(Mono.just(buffer));
        }
    }
    
    /**
     * 2. 请求限流过滤器
     */
    @Component
    @Order(-500)
    public class RateLimitFilter implements GlobalFilter {
        
        private final RateLimiter rateLimiter;
        
        public RateLimitFilter() {
            // 每秒钟100个请求
            this.rateLimiter = RateLimiter.create(100.0);
        }
        
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            String clientIp = getClientIp(exchange.getRequest());
            String path = exchange.getRequest().getURI().getPath();
            
            // 生成限流key
            String rateLimitKey = String.format("%s:%s", clientIp, path);
            
            // 尝试获取许可
            if (rateLimiter.tryAcquire()) {
                log.debug("限流通过: {}", rateLimitKey);
                return chain.filter(exchange);
            } else {
                log.warn("限流拒绝: {}", rateLimitKey);
                exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
                return exchange.getResponse().setComplete();
            }
        }
        
        private String getClientIp(ServerHttpRequest request) {
            String xff = request.getHeaders().getFirst("X-Forwarded-For");
            if (xff != null && !xff.isEmpty()) {
                return xff.split(",")[0].trim();
            }
            return request.getRemoteAddress() != null ? 
                   request.getRemoteAddress().getAddress().getHostAddress() : "unknown";
        }
    }
    
    /**
     * 3. 请求日志过滤器
     */
    @Component
    @Order(-100)
    public class RequestLogFilter implements GlobalFilter {
        
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            long startTime = System.currentTimeMillis();
            String requestId = generateRequestId();
            
            // 设置请求ID
            ServerHttpRequest request = exchange.getRequest().mutate()
                .header("X-Request-ID", requestId)
                .build();
            
            exchange = exchange.mutate().request(request).build();
            
            // 记录请求开始
            logRequestStart(exchange, requestId);
            
            return chain.filter(exchange)
                .doOnSuccess(v -> {
                    // 记录请求完成
                    long duration = System.currentTimeMillis() - startTime;
                    logRequestCompletion(exchange, requestId, duration, true);
                })
                .doOnError(e -> {
                    // 记录请求失败
                    long duration = System.currentTimeMillis() - startTime;
                    logRequestCompletion(exchange, requestId, duration, false);
                });
        }
        
        private void logRequestStart(ServerWebExchange exchange, String requestId) {
            if (log.isInfoEnabled()) {
                ServerHttpRequest request = exchange.getRequest();
                log.info("REQUEST_START [{}] {} {} {}", 
                        requestId,
                        request.getMethod(),
                        request.getURI(),
                        getClientInfo(request));
            }
        }
        
        private void logRequestCompletion(ServerWebExchange exchange, String requestId, 
                                         long duration, boolean success) {
            if (log.isInfoEnabled()) {
                ServerHttpResponse response = exchange.getResponse();
                log.info("REQUEST_END [{}] status:{} duration:{}ms success:{}", 
                        requestId,
                        response.getStatusCode(),
                        duration,
                        success);
            }
        }
        
        private String generateRequestId() {
            return UUID.randomUUID().toString().replace("-", "").substring(0, 16);
        }
    }
}

🔄 自定义路由过滤器

路由级别过滤器开发

java 复制代码
/**
 * 自定义路由过滤器
 * 针对特定路由的定制化处理
 */
@Component
@Slf4j
public class CustomRouteFilters {
    
    /**
     * 1. 响应修改过滤器
     */
    public class ModifyResponseFilter implements GatewayFilter, Ordered {
        
        private final String headerName;
        private final String headerValue;
        private final int order;
        
        public ModifyResponseFilter(String headerName, String headerValue, int order) {
            this.headerName = headerName;
            this.headerValue = headerValue;
            this.order = order;
        }
        
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            return chain.filter(exchange)
                .then(Mono.fromRunnable(() -> {
                    // 修改响应头
                    ServerHttpResponse response = exchange.getResponse();
                    if (!response.isCommitted()) {
                        response.getHeaders().add(headerName, headerValue);
                        log.debug("添加响应头: {} = {}", headerName, headerValue);
                    }
                }));
        }
        
        @Override
        public int getOrder() {
            return order;
        }
    }
    
    /**
     * 2. 请求体修改过滤器
     */
    public class ModifyRequestBodyFilter implements GatewayFilter {
        
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            // 缓存请求体
            ServerHttpRequest request = exchange.getRequest();
            if (request.getHeaders().getContentType() != null && 
                request.getHeaders().getContentType().includes(MediaType.APPLICATION_JSON)) {
                
                return DataBufferUtils.join(request.getBody())
                    .flatMap(dataBuffer -> {
                        // 读取并修改请求体
                        byte[] bytes = new byte[dataBuffer.readableByteCount()];
                        dataBuffer.read(bytes);
                        DataBufferUtils.release(dataBuffer);
                        
                        String body = new String(bytes, StandardCharsets.UTF_8);
                        String modifiedBody = modifyJsonBody(body);
                        
                        // 创建新的请求
                        byte[] newBytes = modifiedBody.getBytes(StandardCharsets.UTF_8);
                        ServerHttpRequest newRequest = request.mutate()
                            .body(Flux.just(exchange.getResponse().bufferFactory().wrap(newBytes)))
                            .build();
                        
                        return chain.filter(exchange.mutate().request(newRequest).build());
                    });
            }
            return chain.filter(exchange);
        }
        
        private String modifyJsonBody(String originalBody) {
            try {
                ObjectMapper mapper = new ObjectMapper();
                JsonNode root = mapper.readTree(originalBody);
                
                // 修改JSON内容
                if (root.isObject()) {
                    ((ObjectNode) root).put("modifiedBy", "gateway");
                    ((ObjectNode) root).put("modifyTime", System.currentTimeMillis());
                }
                
                return mapper.writeValueAsString(root);
            } catch (Exception e) {
                log.warn("修改请求体失败", e);
                return originalBody;
            }
        }
    }
    
    /**
     * 3. 自定义过滤器工厂
     */
    @Component
    public class CustomFilterFactory extends AbstractGatewayFilterFactory<CustomFilterFactory.Config> {
        
        public CustomFilterFactory() {
            super(Config.class);
        }
        
        @Override
        public GatewayFilter apply(Config config) {
            return (exchange, chain) -> {
                log.info("执行自定义过滤器: {}", config.getName());
                
                // 前置处理
                if (config.isPreFilter()) {
                    ServerHttpRequest request = exchange.getRequest().mutate()
                        .header("X-Custom-Filter", config.getName())
                        .build();
                    exchange = exchange.mutate().request(request).build();
                }
                
                return chain.filter(exchange)
                    .then(Mono.fromRunnable(() -> {
                        // 后置处理
                        if (config.isPostFilter() && !exchange.getResponse().isCommitted()) {
                            exchange.getResponse().getHeaders()
                                .add("X-Custom-Filter", config.getName());
                        }
                    }));
            };
        }
        
        @Override
        public List<String> shortcutFieldOrder() {
            return Arrays.asList("name", "preFilter", "postFilter");
        }
        
        @Data
        public static class Config {
            private String name;
            private boolean preFilter = true;
            private boolean postFilter = true;
        }
    }
}

由于篇幅限制,我将后续内容简要概述。完整文章将包含:

🔄 六、动态路由与配置热更新

  • 基于配置中心的动态路由
  • 路由变更监听机制
  • 零停机配置刷新
  • 路由版本管理

📊 七、性能优化与高并发设计

  • Netty 参数调优
  • 响应式背压控制
  • 连接池优化配置
  • 监控指标收集

🆚 八、与 Nginx/Kong 的对比分析

  • 功能特性对比
  • 性能基准测试
  • 适用场景分析
  • 混合架构设计

性能优化配置示例

yaml 复制代码
server:
  port: 8080
  
spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 1000
        response-timeout: 5s
        pool:
          type: elastic
          max-connections: 1000
          acquire-timeout: 45000
          
      metrics:
        enabled: true
        
management:
  endpoints:
    web:
      exposure:
        include: health,metrics,gateway
  endpoint:
    gateway:
      enabled: true

洞察:Spring Cloud Gateway 作为第二代API网关,基于WebFlux的响应式编程模型提供了卓越的性能表现。深入理解其路由匹配和过滤器链机制,是构建高性能微服务网关的关键。


如果觉得本文对你有帮助,请点击 👍 点赞 + ⭐ 收藏 + 💬 留言支持!

相关推荐
不知几秋2 小时前
配置JDK和MAVEN
java·开发语言·maven
枫叶丹42 小时前
【Qt开发】布局管理器(五)-> QSpacerItem 控件
开发语言·数据库·c++·qt
_OP_CHEN2 小时前
C++进阶:(八)基于红黑树泛型封装实现 map 与 set 容器
开发语言·c++·stl·set·map·红黑树·泛型编程
C116112 小时前
Jupyter中选择不同的python 虚拟环境
开发语言·人工智能·python
oak隔壁找我2 小时前
Spring AI 实现MCP简单案例
java·人工智能·后端
大头an2 小时前
Spring事务传播机制深度解析:7种传播行为的使用场景和陷阱
java
星光一影2 小时前
SpringBoot+Vue3无人机AI巡检系统
人工智能·spring boot·websocket·mysql·intellij-idea·mybatis·无人机
lichong9512 小时前
【macOS 版】Android studio jdk 1.8 gradle 一键打包成 release 包的脚本
android·java·前端·macos·android studio·大前端·大前端++
qq_401700412 小时前
Qt键盘组合
开发语言·qt