Spring-Cloud-Gateway如何自定义断言工厂?

遇到这么一个面试题:如何在网关做配置,实现只有在早晨9点到下午18点之间接口才允许访问,其他时间访问都是404。

我们知道网关的一个重要的作用就是路由转发,路由表的配置大概是这个样子:

java 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/*

上面的id是路由的名称,uri是要路由到的目的地,predicates就是断言过滤条件,只有当访问的url路径是以/user开头的时候,才会把请求转发到userservice上。

gateway中内置了很多断言规则,每一种断言规则背后都是实现了AbstractRoutePredicateFactory的一个实现类,比如Path断言org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory。但是gateway并没有提供一个根据时间做过滤条件的断言工厂,因此,我们可以自定义一个断言工厂实现这个功能。

那如何来自定义一个断言工厂呢?

首先,写一个AbstractRoutePredicateFactory的实现类

java 复制代码
/**
 * 自定义的断言工厂<br>
 * 1.名称必须是配置+RoutePredicateFactory<br>
 * 2.必须继承AbstractRoutePredicateFactory<配置类>
 */
@Component
public class HourRoutePredicateFactory extends AbstractRoutePredicateFactory<HourRoutePredicateFactory.Config> {

    public HourRoutePredicateFactory() {
        super(HourRoutePredicateFactory.Config.class);
    }

    //读取配置文件的参数值,赋值到配置类中的属性上
    public List<String> shortcutFieldOrder() {
        //顺序必须与yml文件中的配置顺序对应
        return Arrays.asList("startHour", "endHour");
    }

    public Predicate<ServerWebExchange> apply(HourRoutePredicateFactory.Config config) {
        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                //获取当前时间
                LocalDateTime now = LocalDateTime.now();
                int hour = now.getHour();
                if(hour >= config.getStartHour() && hour <= config.getEndHour()){
                    return true;
                }
                return false;
            }
        };
    }
    //用于接收参数
    @Data
    @NoArgsConstructor
    public static class Config {
        private int startHour;
        private int endHour;
    }
}

然后在配置文件中使用就可以了,比如:

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/*
            - Hour=9,18

打开浏览器,测试一下,如果当前时间是在9-18点之间可以正常访问,否则返回404。

源码下载:https://github.com/xjs1919/enumdemo/tree/master/gateway-predicate-demo

相关推荐
研究司马懿1 天前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
Java后端的Ai之路2 天前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway
研究司马懿6 天前
【云原生】Gateway API介绍
云原生·gateway
研究司马懿6 天前
【云原生】Gateway API路由、重定向、修饰符等关键操作
云原生·gateway
研究司马懿6 天前
【云原生】初识Gateway API
云原生·gateway
七夜zippoe7 天前
API网关设计模式实战 Spring Cloud Gateway路由过滤限流深度解析
java·设计模式·gateway·路由·api网关
汪碧康7 天前
一文讲解kubernetes的gateway Api的功能、架构、部署、管理及使用
云原生·容器·架构·kubernetes·gateway·kubelet·xkube
大佐不会说日语~7 天前
Docker Compose 部署 Spring Boot 应用 502 Bad Gateway 问题排查与解决
spring boot·docker·gateway·maven·故障排查
Dontla9 天前
Kubernetes流量管理双雄:Ingress与Gateway API解析(Nginx与Ingress与Gateway API的关系)
nginx·kubernetes·gateway
JavaLearnerZGQ9 天前
Gateway网关将登录用户信息传递给下游微服务(完整实现方案)
微服务·架构·gateway