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


相关文章
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
15460 60
|
10月前
|
监控 安全 Java
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
Spring Boot 通过 Actuator 模块提供了强大的健康检查功能,帮助开发者快速了解应用程序的运行状态。默认健康检查可检测数据库连接、依赖服务、资源可用性等,但在实际应用中,业务需求和依赖关系各不相同,因此需要实现自定义健康检查来更精确地监控关键组件。本文介绍了如何使用 @HealthEndpoint 注解及实现 HealthIndicator 接口来扩展 Spring Boot 的健康检查功能,从而提升系统的可观测性与稳定性。
716 0
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
SpringCloudAlibaba 负载均衡 Dubbo
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
2097 7
【SpringCloud Alibaba系列】Dubbo高级特性篇
|
人工智能 SpringCloudAlibaba 自然语言处理
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
5683 2
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
SpringCloudAlibaba JavaScript Dubbo
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
4299 1
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2577 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
4438 8
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
1870 4