美文网首页Spring Cloud Alibaba
Spring-Cloud-Gateway Predicate断言

Spring-Cloud-Gateway Predicate断言

作者: 晓阳emmm | 来源:发表于2019-09-14 16:12 被阅读0次

    路由断言Factories

    Spring Cloud Gateway 是路由使用spring webfluxHandler Mapping为基础结构实现的。
    Spring Cloud Gateway包含许多内置的路由断言Factories。这些断言都匹配HTTP请求的不同属性。多个路由断言Factories可以通过 and 组合使用

    一些默认的路由断言 Factory配置

    #路由断言
    spring.cloud.gateway.routes[0].predicates[0]=Path=/auth/**
    #After路由断言,使用一个日期时间,在该日期以后请求才被匹配
    spring.cloud.gateway.routes[0].predicates[1]=After=2019-09-12T17:42:47.789-07:00
    #Before路由断言,使用一个日期时间,在该日期之前才被匹配
    spring.cloud.gateway.routes[0].predicates[1]=Before=2019-09-12T17:42:47.789-07:00
    #Between路由断言,使用两个参数用逗号分隔,在两个时间范围内的请求才被匹配
    spring.cloud.gateway.routes[0].predicates[1]=Between=2019-09-12T17:42:47.789-07:00,2019-10-12T17:42:47.789-07:00
    

    除了这些还有许多内置的路由断言Factories可以去官网的文档查看。

    自定义路由Predicate 断言

    spring-cloud-gateway的官方文档中没有给出自定义Predicate ,只留下一句TODO: document writing Custom Route Predicate Factories

    创建RoutePredicateFactory
    /**
     * @author WXY
     */
    @Slf4j
    public class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenRoutePredicateFactory.Config> {
    
    
        private static final String DATETIME_KEY = "headerName";
    
        public TokenRoutePredicateFactory() {
            super(Config.class);
        }
    
        @Override
        public List<String> shortcutFieldOrder() {
            return Collections.singletonList(DATETIME_KEY);
        }
    
        @Override
        public Predicate<ServerWebExchange> apply(Config config) {
            log.debug("TokenRoutePredicateFactory Start...");
            return exchange -> {
                //判断header里有放token
                HttpHeaders headers = exchange.getRequest().getHeaders();
                List<String> header = headers.get(config.getHeaderName());
                log.info("Token Predicate headers:{}", header);
                return header.size() > 0;
            };
        }
    
        public static class Config {
            /**
             * 传输token header key
             */
            private String headerName;
    
            public String getHeaderName() {
                return headerName;
            }
    
            public void setHeaderName(String headerName) {
                this.headerName = headerName;
            }
        }
    }
    
    

    继承AbstractRoutePredicateFactory<C>主要实现其中的两个方法

    shortcutFieldOrder()-Config对应的字段

    Predicate<ServerWebExchange> apply(Config config)-具体的逻辑

    还有就是构造方法传入用来装配置的类程序会自动把配置的value传入apply中的入参

    初始化RoutePredicateFactory为bean
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author WXY
     *
     */
    @Configuration
    public class RoutesConfiguration {
    
        @Bean
        public TokenRoutePredicateFactory initTokenRoutePredicateFactory(){
            return new TokenRoutePredicateFactory();
        }
    
    }
    
    

    或者直接在TokenRoutePredicateFactory类上加@Component也行

    配置自定义的Predicate

    使用属性文件配置自定义Predicate
    spring.cloud.gateway.routes[1].predicates[1]=Token=Authorization
    

    其中Toekn为命名RoutePredicateFactory时的前面部分,所以在定义RoutePredicateFactory时类名必须后缀为RoutePredicateFactory,否则找不到自定义的Predicate

    使用代码配置
    /**
     * @author WXY
     *
     */
    @Configuration
    public class RoutesConfiguration {
        /**
         * 代码配置路由
         */
        @Bean
        public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
            return builder.routes().route(predicateSpec ->
                    predicateSpec.path("/order/**")
                         .and().asyncPredicate(initTokenRoutePredicateFactory().applyAsync(config -> config.setHeaderName("Authorization")))
                         .uri("lb://order-service").id("order-service")
            ).build();
        }
    
        @Bean
        public TokenRoutePredicateFactory initTokenRoutePredicateFactory(){
            return new TokenRoutePredicateFactory();
        }
    
    }
    
    

    使用代码配置自定义Predicate,主要使用asyncPredicate方法,把所需的自定义RoutePredicateFactory对象传进去配置applyAsync方法传入配置的属性。

    spring-cloud-gateway中文文档
    示例代码
    个人博客

    相关文章

      网友评论

        本文标题:Spring-Cloud-Gateway Predicate断言

        本文链接:https://www.haomeiwen.com/subject/pudayctx.html