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


相关文章
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
2月前
|
Java 开发者 Spring
Spring Cloud Gateway 中,过滤器的分类有哪些?
Spring Cloud Gateway 中,过滤器的分类有哪些?
48 3
|
2月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
102 5
|
1月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
37 0
|
2月前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
219 6
|
3月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
3月前
|
监控 安全 Java
【开发者必备】Spring Boot中自定义注解与处理器的神奇魔力:一键解锁代码新高度!
【8月更文挑战第29天】本文介绍如何在Spring Boot中利用自定义注解与处理器增强应用功能。通过定义如`@CustomProcessor`注解并结合`BeanPostProcessor`实现特定逻辑处理,如业务逻辑封装、配置管理及元数据分析等,从而提升代码整洁度与可维护性。文章详细展示了从注解定义、处理器编写到实际应用的具体步骤,并提供了实战案例,帮助开发者更好地理解和运用这一强大特性,以实现代码的高效组织与优化。
171 0
|
3月前
|
Java 应用服务中间件 nginx
【Azure Spring Apps】Spring App部署上云遇见 502 Bad Gateway nginx
【Azure Spring Apps】Spring App部署上云遇见 502 Bad Gateway nginx
|
3月前
|
存储 Java API
|
3月前
|
安全 搜索推荐 Java