• 【云原生&微服务>SCG网关篇五】Spring Cloud Gateway自定义网关路由Predicate


    文章目录

    一、前言

    至此微服务网关系列文章已出:

    1. 【云原生&微服务>SCG网关篇一】为什么要有网关、生产环境如何选择网关
    2. 云原生&微服务>SCG网关篇二】生产上那些灰度发布方式
    3. 【云原生&微服务>SCG网关篇三】Spring Cloud Gateway是什么、详细使用案例
    4. 云原生&微服务>SCG网关篇四】Spring Cloud Gateway内置的11种PredicateFactory如何使用

    聊了以下问题:

    1. 为什么要有网关?网关的作用是什么?
    2. 网关的分类?
    3. 网关的技术选型?
    4. 使用网关时常用的灰度发布方式有哪些?
    5. Spring Cloud Gateway是什么?详细使用案例?
    6. Spring Cloud Gateway内置的11种PredicateFactory

    本文接着聊如何自定义PredicateFactory,实现网关早九晚六之间才提供路由服务。

    PS:SpringCloud版本信息:

    
        2.4.2
        2020.0.1
        2021.1
    
    
    
        
            
                org.springframework.boot
                spring-boot-dependencies
                ${spring-boot.version}
                pom
                import
            
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${spring-cloud-alibaba.version}
                pom
                import
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    二、自定义PredicateFactory

    路由谓词工厂的命令要求一定要以RoutePredicateFactory结尾。

    这里谓词工厂要实现的效果是:限制每天的09:00 – 18:00才能访问路由;想要实现这一效果,需要一个实现自AbstractRoutePredicateFactory的工厂类、一个接收时间参数的配置类,并且需要在application.yml文件中配置这个谓词工厂。

    1、自定义参数配置类(TimeBetweenConfig)

    package com.saint.gateway.predicate;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.time.LocalTime;
    
    /**
     * time parameter config
     *
     * @author Saint
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class TimeBetweenConfig {
    
        private LocalTime start;
    
        private LocalTime end;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    2、自定义谓词工厂(TimeBetweenRoutePredicateFactory)

    自定义谓词工厂需要继承自AbstractRoutePredicateFactory,并需要将泛型替换为自己需要接收Yaml文件中参数的配置类;

    package com.saint.gateway.predicate;
    
    import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    
    import java.time.LocalTime;
    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Predicate;
    
    /**
     * Customized time between route predicate factory
     *
     * @author Saint
     */
    @Component
    public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory {
    
        public TimeBetweenRoutePredicateFactory() {
            super(TimeBetweenConfig.class);
        }
    
        /**
         * 控制路由的条件
         *
         * @param config
         * @return
         */
        @Override
        public Predicate apply(TimeBetweenConfig config) {
            LocalTime start = config.getStart();
            LocalTime end = config.getEnd();
            return serverWebExchange -> {
                // 当前时间再start 和 end之间,则允许匹配路由
                LocalTime now = LocalTime.now();
                return now.isAfter(start) && now.isBefore(end);
            };
        }
    
        /**
         * 用来配置控制类和yaml配置文件的映射关系
         *
         * @return
         */
        @Override
        public List shortcutFieldOrder() {
            return Arrays.asList("start", "end");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    3、修改application.yml配置文件

    在application.yml文件中添加TimeBetween 谓词;

    server:
      port: 9999
    spring:
      cloud:
        gateway:
          routes:
            - id: time_between_route
              uri: http://127.0.0.1:9001
              predicates:
                # 当且仅当请求时的时间在Between配置的时间范围内时,才会匹配到路由进行转发
                - TimeBetween=上午9:00, 下午6:00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里表情请求仅在早上9点到下午6点之间提供服务,过时不给路由做匹配,全部休息。

    三、验证

    当前时间:早上7点;随便访问一个地址时,会报错“404 not found”;

    在这里插入图片描述

    假如我们把TimeBetween的时间放开成:上午7:00, 下午6:00,便可以进行路由匹配。

    在这里插入图片描述

    做个验证就行,赶紧改回去,要求是9点之前不提供服务;

    四、总结

    至此,Spring Cloud Gateway的 Predicate也就告一段落了,后面我们继续看Filter。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    linux 上 jps 列出一堆 jar,如何快速定位 jar 文件启动位置?
    openfeign
    [激光原理与应用-20]:《激光原理与技术》-6- 谐振腔的结构、作用、工作原理
    Java实现连接SQL Server解决方案及代码
    给根目录扩容
    mysql常用语句之DML:数据操作语句:插入、修改、删除
    《自然语言处理》第二次实验:机器翻译(Seq2Seq中英文翻译实验)
    c++视觉处理---仿射变换和二维旋转变换矩阵的函数
    PPT制作小技巧分享
    从底层原理看Android的序列化是如何实现的
  • 原文地址:https://blog.csdn.net/m0_67392273/article/details/126080722