Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂

在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求。
例如有某个服务限制用户只允许在06:00 - 13:00这个时间段内才可以访问,内置的路由谓词工厂是无法满足这个需求的,所以此时我们就需要自定义能够实现该需求的路由谓词工厂。

首先定义一个配置类,用于承载时间段的配置参数:

package com.example.gateway;

import lombok.Data;

import java.time.LocalTime;

@Data
public class TimeBetweenConfig {
    private LocalTime start;
    private LocalTime end;
}

然后定义一个路由谓词工厂:

@Component
public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<TimeBetweenConfig> {

    public TimeBetweenRoutePredicateFactory() {
        super(TimeBetweenConfig.class);
    }

    /**
     * 实现为谓词判断的方法
     */
    @Override
    public Predicate<ServerWebExchange> apply(TimeBetweenConfig config) {
        LocalTime start = config.getStart();
        LocalTime end = config.getEnd();
        return serverWebExchange -> {
            LocalTime now = LocalTime.now();
            return now.isAfter(start) && now.isBefore(end);
        };
    }

    /**
     * 设置配置类与配置文件的关系
     * @return
     */
    @Override
    public List<String> shortcutFieldOrder() {
        /*
         * 例如我们的配置项是:TimeBetween=上午6:00, 下午1:00
         * 那么按照顺序,start对应的是上午6:00;end对应的是下午1:00
         */
        return Arrays.asList("start", "end");
    }
}

最后,需要在配置文件中启用该路由谓词工厂:

spring:
    gateway:
      discovery:
        locator:
          enabled: false
      routes:
        - id: study
          uri: lb://study01
          predicates:
            - TimeBetween=上午6:00,下午1:00

PS:

  • 自定义路由谓词工厂类时,按照Spring Cloud Stream的约定,类名须为“谓词工厂名(本文例中:TimeBetween)” + RoutePredicateFactory
  • 要禁止gateway通过服务发现组件转发请求到其他的微服务,开启该配置项的话会导致自定义的路由谓词工厂不生效【开启该配置项会令Gateway优先将请求按照该配置项进行转发,导致自定义的路由不生效】
  • 时间格式不是随便配置的,而是Spring Cloud Gateway的默认时间格式:

到此为止就实现了一个自定义路由谓词工厂,若此时不在允许的访问时间段内,访问就会报404,访问:http://localhost:8040/findById ,结果如下图所示:

posted @ 2019-10-28 16:20  夜的那种黑丶  阅读(1418)  评论(0编辑  收藏  举报