Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂

Posted 小小工匠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂相关的知识,希望对你有一定的参考价值。

文章目录


需求

我们看了官方提供的几个例子,如果都不满足呢?

举个例子: 实现一个类似 12306订票管控的需求: 早上6点到23点,才允许业务进行。

三部曲

第一步 搞配置类

package com.artisan.custom;

import lombok.Data;

import java.time.LocalTime;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2022/2/14 0:21
 * @mark: show me the code , change the world
 */


@Data
public class CustomTimeBetweenConfig 

    private LocalTime startTime;

    private LocalTime endTime;

    

第二步 搞自定义谓词工厂

类名必须要以RoutePredicateFactory结尾,然后继承AbstractRoutePredicateFactory

package com.artisan.custom;

import lombok.extern.slf4j.Slf4j;
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;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2022/2/14 0:20
 * @mark: show me the code , change the world
 */

@Component
@Slf4j
public class CustomTimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomTimeBetweenConfig> 

    public CustomTimeBetweenRoutePredicateFactory() 
        super(CustomTimeBetweenConfig.class);
    


    /***
     *  真正的业务判断逻辑
     * @param config
     * @return
     */
    @Override
    public Predicate<ServerWebExchange> apply(CustomTimeBetweenConfig config) 

        LocalTime startTime = config.getStartTime();

        LocalTime endTime = config.getEndTime();

        return new Predicate<ServerWebExchange>() 
            @Override
            public boolean test(ServerWebExchange serverWebExchange) 
                LocalTime now = LocalTime.now();
                //判断当前时间是否在在配置的时间范围类
                return now.isAfter(startTime) && now.isBefore(endTime);
            
        ;

    

    /**
     * 用于接受yml中的配置CustomTimeBetween=上午6:00,下午11:00
     *
     * @return
     */
    @Override
    public List<String> shortcutFieldOrder() 
        return Arrays.asList("startTime", "endTime");
    

 

    

第三部 搞配置

在yml配置中谓词配置是以我们自定义类CustomTimeBetweenRoutePredicateFactory
去除了RoutePredicateFactory接受开头CustomTimeBetween

application-custom.yml

# 自定义谓词工厂
spring:
  cloud:
    gateway:
      routes:
        - id: custom-timeBetween #id必须要唯一
          uri: lb://artisan-cloud-gateway-order
          predicates:
            #当前请求的时间必须在早上6点到 晚上11点 http://localhost:8888/selectOrderInfoById/1
            #才会被转发
            #到http://artisan-cloud-gateway-order/selectOrderInfoById/1
            - CustomTimeBetween=上午06:00,下午11:00

激活profile

验证

   public static void main(String[] args) 
        System.out.println(LocalTime.now());
    

现在是

访问肯定不行

debug走下




改改时间 符合规则 试试能行吗



OK, 妥妥的实现了


源码

https://github.com/yangshangwei/SpringCloudAlibabMaster

以上是关于Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂的主要内容,如果未能解决你的问题,请参考以下文章

是Dubbo不香了吗?阿里为啥又搞一套Spring Cloud Alibaba?

Spring Cloud Alibaba环境搭建

Spring Cloud Alibaba全家桶——Spring Cloud Alibaba介绍

Spring Cloud Alibaba系列教程——Spring Cloud Alibaba开篇

spring boot 整合spring cloud alibaba

spring boot 整合spring cloud alibaba