深入 Spring Cloud Gateway 过滤器

宅哥聊构架 后端 2024-12-06

深入 Spring Cloud Gateway 过滤器

概述

Spring Cloud Gateway 是 Spring Cloud 家族中的新一代微服务网关框架,它为构建 API 网关提供了强大的功能。Spring Cloud Gateway 的核心组件之一就是过滤器,本文将详细介绍 GlobalFilterGatewayFilterAbstractGatewayFilterFactory 三种过滤器的实现方式,并探讨如何在实践中高效地使用它们。

1. 全局过滤器 (GlobalFilter)

全局过滤器 (GlobalFilter) 是一种可以在所有路由请求上执行的过滤器。它可以用于实现一些通用的功能,如日志记录、认证授权等。

实现步骤

  1. 创建全局过滤器:kotlin

    代码解读
    复制代码
    import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class LoggingFilter implements GlobalFilter, Ordered {    @Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {        ServerHttpRequest request = exchange.getRequest();        System.out.println("LoggingFilter: " + request.getMethodValue());        return chain.filter(exchange);   }    @Override    public int getOrder() {        return 0; // 顺序越小,执行越早   } }
  2. 注册全局过滤器: 无需显式注册,因为全局过滤器通过 @Component 注解自动扫描。

特点

  • 简单易用:只需实现 GlobalFilter 接口即可。
  • 全局应用:对所有路由生效。

2. 路由过滤器 (GatewayFilter)

路由过滤器 (GatewayFilter) 可以被指定到特定的路由上,提供了更细粒度的控制能力。

实现步骤

  1. 创建GatewayFilter:typescript

    代码解读
    复制代码
    import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class SignatureVerificationGatewayFilter implements GatewayFilter, Ordered {    @Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {        ServerHttpRequest request = exchange.getRequest();        // 验证签名        if (!validateSignature(request)) {            return Mono.error(new RuntimeException("Invalid signature"));       }        return chain.filter(exchange);   }    private boolean validateSignature(ServerHttpRequest request) {        // 实现签名验证逻辑        return true; // 假设验证成功   }    @Override    public int getOrder() {        return 0; // 顺序越小,执行越早   } }
  2. 配置路由: 请注意,由于 GatewayFilter 通过 @Component 注解自动扫描,无需显式注册。kotlin

    代码解读
    复制代码
    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; @Configuration public class GatewayConfig {    @Bean    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {        return builder.routes()               .route(r -> r.path("/api/signed")                       .filters(f -> f.filter(new SignatureVerificationGatewayFilter()))                       .uri("http://localhost:8080"))               .build();   } }

特点

  • 细粒度控制:可以针对特定路由应用。
  • 自动注册:通过 @Component 注解自动扫描,无需显式注册。
  • Java配置:必须通过Java配置来实现。

3. 自定义过滤器工厂 (AbstractGatewayFilterFactory)

AbstractGatewayFilterFactory自定义过滤器工厂提供了一个更加灵活的方式来创建 GatewayFilter 实例。这种方式允许你定义配置选项,并且可以通过工厂模式来创建多个不同的过滤器实例。与 GatewayFilter 类似,AbstractGatewayFilterFactory 也可以通过 @Component 注解自动扫描。

实现步骤

  1. 创建自定义工厂类:scala

    代码解读
    复制代码
    import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class SignatureVerificationGatewayFilterFactory extends AbstractGatewayFilterFactory<SignatureVerificationGatewayFilterFactory.Config> {    public SignatureVerificationGatewayFilterFactory() {        super(Config.class);   }    @Override    public GatewayFilter apply(Config config) {        return (exchange, chain) -> {            ServerHttpRequest request = exchange.getRequest();            // 验证签名            if (!validateSignature(request)) {                return Mono.error(new RuntimeException("Invalid signature"));           }            return chain.filter(exchange);       };   }    private boolean validateSignature(ServerHttpRequest request) {        // 实现签名验证逻辑        return true; // 假设验证成功   }    public static class Config {} }
  2. 配置路由: AbstractGatewayFilterFactory 可以通过 YAML 文件来配置,这里提供一个 YAML 示例:yaml

    代码解读
    复制代码
    spring: cloud:   gateway:     routes:     - id: signed_route       uri: http://localhost:8080       predicates:         - Path=/api/signed       filters:         - name: SignatureVerificationGatewayFilterFactory           args: {}

特点

  • 高级定制:允许通过配置参数来自定义过滤器的行为。
  • 自动注册:通过 @Component 注解自动扫描,无需显式注册。
  • 工厂模式:适用于需要创建多个具有不同配置的过滤器实例的情况。

4. 关键区别

  • GlobalFilter:适用于全局性的操作,易于实现但缺乏细粒度控制。
  • GatewayFilter:提供细粒度控制,可以针对特定路由应用,通过 @Component 注解自动扫描。
  • AbstractGatewayFilterFactory:提供更高级别的定制性和灵活性,适用于复杂的场景,并且可以通过 YAML 文件来配置,同样通过 @Component 注解自动扫描。

结论

根据你的需求和项目特性,你可以选择最适合的方式。如果需要全局性的操作,GlobalFilter 是一个不错的选择;如果需要更精细的控制,则可以选择 GatewayFilter;而对于高度定制化的场景,AbstractGatewayFilterFactory 则更为合适,并且可以通过 YAML 文件来配置。


以上就是 Spring Cloud Gateway 中 GlobalFilterGatewayFilter 以及 AbstractGatewayFilterFactory 的详细解析与实践指南。希望能够帮助您更好地理解和运用这些过滤器来优化您的网关应用程序。

Spring Cloud

Apipost 私有化火热进行中

评论