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 ,结果如下图所示:

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/fx-blog/p/11751594.html
Copyright © 2011-2022 走看看