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

简介: Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂RoutePredicateFactory


需求

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

举个例子: 实现一个类似 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


相关文章
|
6天前
|
负载均衡 Nacos 数据安全/隐私保护
SpringCloud GateWay 使用
SpringCloud GateWay 使用
14 0
|
1月前
|
Java Spring 容器
【Java】Spring如何扫描自定义的注解?
【Java】Spring如何扫描自定义的注解?
30 0
|
1月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
26天前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
74 0
|
2天前
|
XML Java 数据格式
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
13 0
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
|
27天前
|
Java 网络架构 微服务
SpringCloud GateWay网关-学习笔记
SpringCloud GateWay网关-学习笔记
30 0
|
1月前
|
SpringCloudAlibaba 负载均衡 前端开发
【十】SpringCloud Alibaba之整合gateway(包括配置详解以及各种坑)
【十】SpringCloud Alibaba之整合gateway(包括配置详解以及各种坑)
64 2
|
1月前
|
前端开发 微服务
【十八】搭建SpringCloud项目二(GateWay)
【十八】搭建SpringCloud项目二(GateWay)
23 0
|
1月前
|
人工智能 负载均衡 Java
【Spring实战】动手拥有自己的ai小站!使用Springboot整合Spring Cloud Gateway实现对接open ai并实现令牌记量和限制对话次数
【Spring实战】动手拥有自己的ai小站!使用Springboot整合Spring Cloud Gateway实现对接open ai并实现令牌记量和限制对话次数
|
2月前
|
监控 Java 应用服务中间件
网关大解密:探索Spring Cloud Alibaba中Gateway的奥秘
网关大解密:探索Spring Cloud Alibaba中Gateway的奥秘
102 1