Spring Cloud Gateway(二)自定义谓词、过滤器、全局过滤器

1、请求流程

  • 1.客户端向Spring Cloud Gateway发出请求。
  • 2.网关处理程序映射确定请求与路由匹配
  • 3.过滤器过滤请求。
  • 4.服务端处理请求
  • 5.过滤器处理响应请求
  • 6.网关路由处理响应请求
  • 7.响应到客户端
    在这里插入图片描述

2、自定义谓词

例如:

  • 自定义谓词CustomPredicate:有2个参数
  1. 点击配置文件中“routes”进入RouteDefinition后进入PredicateDefinition类中,查看当前包下AbstractRoutePredicateFactory接口的层次结构,可以发现,在第一篇文章中所示的11个谓词类。
    在这里插入图片描述
    在这里插入图片描述

  2. 分析谓词类可得规则
    在这里插入图片描述

  3. 代码

    @Slf4j
    @Component
    public class CustomPredicateRoutePredicateFactory  extends AbstractRoutePredicateFactory<CustomPredicateRoutePredicateFactory.Config> {
    
    
        public CustomPredicateRoutePredicateFactory () {
            // 传入bean
            super(CustomPredicateRoutePredicateFactory.Config.class);
        }
        /**
         *参数值
         */
        @Override
        public List<String> shortcutFieldOrder() {
            // 与参数bean一一对应
            return Arrays.asList("startTime", "endTime");
        }
    
        /**
         * ServerWebExchange:相当于当前请求和响应的上下文
         * @param config 参数类
         * @return
         */
        @Override
        public Predicate<ServerWebExchange> apply (Config config) {
            // 路由判断是否符合 此处根据自己的场景处理返回true或false就可以
            return exchange -> {
                System.out.println(config.getStartTime());
                System.out.println(config.getEndTime());
                return true;
            };
        }
    
        /**
         * 几个参数bean中就有几个对象
         */
        @Data
        public static class Config {
    
            private LocalTime startTime;
            private LocalTime endTime;
        }
    }
    
  4. 配置类谓词:CustomPredicate=下午10:11, 下午11:20
    在这里插入图片描述

3、自定义过滤器

同谓词配置相似

随便找几个过滤器发现大部分都是继承AbstractNameValueGatewayFilterFactory来实现过滤器的
在这里插入图片描述
代码如下

@Slf4j
@Component
public class CustomGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {

    @Override
    public GatewayFilter apply(NameValueConfig config) {

        return (ServerWebExchange exchange, GatewayFilterChain chain) -> {
            // config.getName() 对应的是配置文件中filter中的key
            log.info("请求网关,filter.key={}, filter.value={}", config.getName(), config.getValue());

            // 继续执行其他filter
            return chain.filter(exchange);
        };
    }
}

配置文件如图:- Custom=prefix, gateway
在这里插入图片描述

3、自定义全局过滤器

  • 全局filter 会作用于所有路由(走满足要求的全局filter)
    在这里插入图片描述

  • 全局filter有执行顺序,通过getOrder()方法的返回值决定执行顺序,数值越小越靠前执行;

  • 定义成spring的bean对象就会生效

代码如下

@Slf4j
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("自定义全局Filter请求.url={}",exchange.getRequest().getURI());
        //业务逻辑

        // 继续执行其他全局filter
        return chain.filter(exchange);
    }

    /**
     * 定义的filter执行的顺序,越小越优先执行
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值