zoukankan      html  css  js  c++  java
  • Spring Cloud Alibaba学习笔记(17)

    在前文中,我们介绍了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 ,结果如下图所示:

  • 相关阅读:
    产品经理经常犯的错误李可按
    skills_hive
    skills_office
    skills_idea
    skills_linux
    skills_ubuntu
    skills_git
    skills_redis
    skills_centos
    problems_hive
  • 原文地址:https://www.cnblogs.com/fx-blog/p/11751594.html
Copyright © 2011-2022 走看看