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

相关推荐
A ?Charis6 小时前
记录一下_treafik使用Gateway-APi使用的细节参数
gateway
运维开发王义杰3 天前
Kubernetes:EKS 中 Istio Ingress Gateway 负载均衡器配置及常见问题解析
kubernetes·gateway·istio
铭毅天下4 天前
极限网关 INFINI Gateway 从 0 到 1:简单易懂的入门教程
gateway
铭毅天下4 天前
极限网关核心架构解析:从 Nginx 到 INFINI Gateway 的演进
运维·nginx·架构·gateway
Xwzzz_5 天前
Spring Cloud Gateway中断言路由和过滤器的使用
java·spring cloud·gateway
zzyh1234565 天前
springcloudalibaba组件gateway
前端·javascript·gateway
@明明不知道5 天前
spring cloud 微服务部署(2025年)第一章:Nacos、LoadBalancer、GateWay、Ribbon集成之Nacos部署
spring cloud·微服务·nacos·gateway·loadbalancer
山海不说话6 天前
从零搭建微服务项目(第7章——微服务网关模块基础实现)
java·spring boot·spring·spring cloud·微服务·gateway
默辨6 天前
再谈SpringCloud Gateway源码
java·网关·spring cloud·gateway·reactor·webflux
飞火流星020276 天前
【动态路由】系统web url整合系列【springcloud-gateway实现】【不改hosts文件版】组件一:多个Eureka路由过滤器
gateway·gateway动态路由·gateway实现反向代理·系统url整合·eureka路由过滤器·gateway路由过滤器