网关API(SpringCloudGateway)如何自定义Filter

1.前言

        SpringCloud 虽然给我们提供了很多过滤器,但是这些过滤器功能都是固定的,无法满足用户的各式各样的需求。因此SpringCloud提供了过滤器的扩展功能自定过滤器。

        开发者可以根据自己的业务需求自定义过滤器。

2. 自定义 GatewayFilter(局部过滤器)

  • GatewayFilter 则是局部过滤器,它们可以应用到特定的路由或者路径上。通过将过滤器应用到特定的路由配置中,可以使得这些过滤器只在特定的请求路径下生效。 

通常情况下,GatewayFilter 可以分为两类:

  1. Pre 过滤器:在请求被路由到目标服务之前执行。例如,可以在此类过滤器中进行身份验证、日志记录、请求修改等操作。

  2. Post 过滤器:在请求被路由到目标服务之后执行。通常用于记录响应日志、修改响应、添加响应头等操作。

Spring Cloud Gateway 中的过滤器可以按照顺序链式执行,从而实现复杂的请求处理逻辑。通过自定义和组合不同的过滤器,可以满足各种场景下的需求。

        2.1 代码实现 

1. 编写一个类,继承的抽象类是 AbstractGatewayFilterFactory创建自定义的局部网关过滤器,用于接收过滤器的配置参数。

实现 Ordered 用于自定义过滤器的执行顺序。

/**
 * @Description: 自定义Gateway过滤器
 * @Author: windStop
 * @Date: 2024/6/6 9:58
 */
@Component
@Slf4j
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered {

    //表示过滤器要接收到一个什么类型的参数才能正常运行
    public CustomGatewayFilterFactory() {
        super(CustomConfig.class);
    }


    @Override
    public GatewayFilter apply(CustomConfig config) {
        return new GatewayFilter() {
            /**
             *
             * @param exchange HTTP请求和响应 交互的契机,提供了对HTTP 请求和响应的访问
             *                通俗的讲,就是封装了request和response
             * @param chain   过滤器链
             * Mono : 是Reactor的核心类,数据流的发布者,Mono最多只能触发一个事件,可以把Mono用在异步完成任务时,发出通知
             * @return   chain.filter(exchange) 执行请求
             *          Mono.fromRunnable(): 创建一个包含Runnable的数据流  创建一个任务
             */
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                //Pre 类型执行请求   post类型 执行
                log.info("pre Filter:{},",config);//Pre过滤器 的逻辑
                return chain.filter(exchange).then(Mono.fromRunnable(()->{
                    log.info("Post Filter....");//Post类型过滤器的逻辑
                }));
            }
        };
    }

    //设置优先级
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

        2.2 代码介绍

  1. public CustomGatewayFilterFactory() {super(CustomConfig.class);}: 这是 CustomGatewayFilterFactory 的构造函数,其中调用了父类 AbstractGatewayFilterFactory 的构造函数,指定了过滤器接收的配置参数类型为 CustomConfig.class

  2. @Override public GatewayFilter apply(CustomConfig config) {...}: 这是 AbstractGatewayFilterFactory 类中的抽象方法,用于创建并返回一个自定义的网关过滤器。在这里,根据传入的配置参数 config,创建了一个 GatewayFilter 实例,并在 filter 方法中编写了过滤器的逻辑。
    其中的参数介绍:

    exchange HTTP请求和响应 交互的契机,提供了对HTTP 请求和响应的访问
                    通俗的讲,就是封装了request和response
     @param chain   过滤器链
     Mono : 是Reactor的核心类,数据流的发布者,Mono最多只能触发一个事件,可以把Mono用在异步完成任务时,发出通知
     @return   chain.filter(exchange) 执行请求
             Mono.fromRunnable(): 创建一个包含Runnable的数据流  创建一个任务,线程的方式。
    
  3. @Override public int getOrder() {return Ordered.LOWEST_PRECEDENCE;}: 这是实现了 Ordered 接口中的 getOrder 方法,用于设置过滤器的执行顺序。在这里,返回了一个常量 Ordered.LOWEST_PRECEDENCE,表示该过滤器的执行优先级最低,会在所有其他过滤器之后执行。

总的来说,这段代码定义了一个自定义的 Gateway 过滤器工厂,用于创建自定义的网关过滤器,并且指定了过滤器的配置参数类型、过滤器的执行逻辑以及执行顺序。

        2.3 配置文件

 这里声明过滤器的name要和GatewayFilterFactory的前缀一样才可以自动映射,args为需要将参数进行传递。

3. 自定义 GlobalFilter(全局过滤器)

        3.1 代码实现

/**
 * @Description: 全局过滤器
 * @Author: windStop
 * @Date: 2024/6/6 18:23
 */
@Slf4j
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    /**
     * 实现全局的过滤器
     * @param exchange  封装了request和response方法
     * @param chain 过滤器链
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("Pre Global Filter");
        return chain.filter(exchange).then(Mono.fromRunnable(()->{
            log.info("Post Global Filter");
        }));
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

因为和上述相似就不介绍了

        3.2 配置文件

不需要任何配置文件,因为他是对我们所有的路由都进行生效的。 

4. 总结 

这份文档主要介绍了在Spring Cloud Gateway中如何自定义局部过滤器(GatewayFilter)和全局过滤器(GlobalFilter),以及它们的实现步骤和配置方式。

  1. 局部过滤器(GatewayFilter)

    • 通过继承AbstractGatewayFilterFactory类创建自定义过滤器工厂,实现apply()方法来定义过滤器的逻辑。
    • 过滤器逻辑中,可以对请求进行预处理(Pre类型)或者后处理(Post类型)。
    • 使用Mono<Void>作为返回类型,表示过滤器的异步执行结果。
    • 通过实现Ordered接口来设置过滤器的执行顺序。
  2. 全局过滤器(GlobalFilter)

    • 实现GlobalFilter接口来定义全局过滤器,它会对所有的路由都生效。
    • 同样使用Mono<Void>作为返回类型,并在逻辑中调用chain.filter(exchange)来执行后续过滤器和路由处理。
  3. 配置文件

    • 对于局部过滤器,需要在配置文件中声明过滤器的名称和参数。
    • 对于全局过滤器,则不需要任何配置文件,因为它会对所有路由生效。

总的来说,这份文档清晰地展示了如何在Spring Cloud Gateway中扩展和定制过滤器,以满足不同场景下的需求。自定义过滤器能够帮助开发者实现更加灵活和精细的请求处理逻辑。

上一篇:SpringBoot实现上传头像(查看头像)


下一篇:loading组件封装原理