SpringCloud系列——Gateway 自定义网关过滤器(六)

905 阅读2分钟

Gateway过滤器有什么用?

一个标准的Spring webFilter,使用过滤器,可以在请求之前或者之后执行业务逻辑。

image.png

从图中很明显可以看出,在请求后端服务前后都需要经过Filter,于是乎Filter的作用就明确了,在PreFilter(请求前处理)可以做参数校验流量监控日志记录修改请求内容等等,在PostFilter(请求后处理)可以做响应内容修改

Gateway过滤器分类

Gateway中一共提供了两种过滤器,一种是GatewayFilter、GlobalFilter;
GatewayFilter:Gateway网关过滤器,是针对单个路由的过滤器,又称局部过滤器,其功能是针对访问的URL起到一定的过滤效果。
GlobalFilter:从名称而言,那就是全局过滤器,是需要实现具体的Java类来实现GlobalFilter接口,这其中可以根据进行权限的验证,HTTP请求的头部添加等等。

过滤器的声明周期

有pre和post两种方式的filter,分别处理前置逻辑和后置逻辑。客户端的请求先经过pre类型的filter,然后将请求转发到具体的业务服务,收到业务服务的响应之后,再经过post类型的filter处理,最后返回响应到客户端。

过滤器的优先级

order越大,优先级越低

@Slf4j
public class AFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("AFilter前置逻辑");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("AFilter后置逻辑");
        }));
    }
}

@Slf4j
public class BFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("BFilter前置逻辑");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("BFilter后置逻辑");
        }));
    }
}

@Slf4j
public class CFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("CFilter前置逻辑");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("CFilter后置逻辑");
        }));
    }
}

@Configuration
public class FilterConfig {

    @Bean
    @Order(-1)
    public GlobalFilter a() {
        return new AFilter();
    }

    @Bean
    @Order(0)
    public GlobalFilter b() {
        return new BFilter();
    }

    @Bean
    @Order(1)
    public GlobalFilter c() {
        return new CFilter();
    }
}
AFilter前置逻辑
BFilter前置逻辑
CFilter前置逻辑

CFilter后置逻辑
BFilter后置逻辑
AFilter后置逻辑

过滤器参数

过滤器参数相对断言参数要少一些,但是同样重要,让我们来细数一下。
路由中的filters参数的设置也是非常广泛的。
而我们平时使用最多的就是

      routes:
      - id: demo
        uri: http://demo
        predicates:
        - Path=/demo/**
        filters:
        - StripPrefix=1

这个参数是从请求中剥离的路径个数,比如http://127.0.0.1/demo/user/list, 就可以得到http://127.0.0.1/demo/list