Spring-Cloud-Gateway如何自定义断言工厂?

遇到这么一个面试题:如何在网关做配置,实现只有在早晨9点到下午18点之间接口才允许访问,其他时间访问都是404。
我们知道网关的一个重要的作用就是路由转发,路由表的配置大概是这个样子:

spring:cloud:gateway:routes:- id: user-serviceuri: lb://userservicepredicates:- Path=/user/*

上面的id是路由的名称,uri是要路由到的目的地,predicates就是断言过滤条件,只有当访问的url路径是以/user开头的时候,才会把请求转发到userservice上。
gateway中内置了很多断言规则,每一种断言规则背后都是实现了AbstractRoutePredicateFactory的一个实现类,比如Path断言org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory。但是gateway并没有提供一个根据时间做过滤条件的断言工厂,因此,我们可以自定义一个断言工厂实现这个功能。
那如何来自定义一个断言工厂呢?
首先,写一个AbstractRoutePredicateFactory的实现类

/*** 自定义的断言工厂<br>* 1.名称必须是配置+RoutePredicateFactory<br>* 2.必须继承AbstractRoutePredicateFactory<配置类>*/
@Component
public class HourRoutePredicateFactory extends AbstractRoutePredicateFactory<HourRoutePredicateFactory.Config> {public HourRoutePredicateFactory() {super(HourRoutePredicateFactory.Config.class);}//读取配置文件的参数值,赋值到配置类中的属性上public List<String> shortcutFieldOrder() {//顺序必须与yml文件中的配置顺序对应return Arrays.asList("startHour", "endHour");}public Predicate<ServerWebExchange> apply(HourRoutePredicateFactory.Config config) {return new Predicate<ServerWebExchange>() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {//获取当前时间LocalDateTime now = LocalDateTime.now();int hour = now.getHour();if(hour >= config.getStartHour() && hour <= config.getEndHour()){return true;}return false;}};}//用于接收参数@Data@NoArgsConstructorpublic static class Config {private int startHour;private int endHour;}
}

然后在配置文件中使用就可以了,比如:

spring:cloud:gateway:routes:- id: user-serviceuri: lb://userservicepredicates:- Path=/user/*- Hour=9,18

打开浏览器,测试一下,如果当前时间是在9-18点之间可以正常访问,否则返回404。
源码下载:https://github.com/xjs1919/enumdemo/tree/master/gateway-predicate-demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel流量规则模块(新增)

系统并发能力有限&#xff0c;比如系统A的QPS支持1个请求&#xff0c;如果太多请求过来&#xff0c;那么系统A就应该进行流量控制了&#xff0c;比如其他请求直接拒绝 新增流控规则介绍:新增流控规则窗口 1.资源名&#xff1a;默认请求路径。 2.针对来源&#xff1a;Se…

基于51单片机和proteus的温室大棚系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示光照/土壤湿度/温度值及设定值。 2. 按键可增减光照/土壤湿度/温度设定阈值。 3. 获取到的温度低于设定温度则打开加热设备。 4. 获取到的光照值低于设定光照值则打开补光灯。…

【SpringBoot Web开发】如何构建树形结构数据

树形结构数据 应用场景 比如我们需要构建菜单、机构树、其他业务类型树形结构 工具类 我们可以把菜单列表返回&#xff0c;获取parent_id字段等于0的节点&#xff0c;称为根节点&#xff0c;这样的节点代表一级菜单再通过根节点的主键去寻找子菜单&#xff0c;因为要有多及菜…

【iOS】编译与链接

前言 计算机语言分为机器语言、汇编语言和高级语言。 可以将高级语言分为两种&#xff1a;编译语言和解释型语言&#xff08;直译式语言&#xff09;。 解释型语言&#xff08;逐步进行解释执行&#xff09; 解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态…

【区块链+体育】“数智化”的杭州亚运会,中创助力区块链技术发展

“智能”&#xff0c;是杭州亚运会的办赛理念之一。除了数字藏品开亚运先河&#xff0c;杭州亚组委充分应用区块链、大数据、人工智能等前沿技术&#xff0c;为观众提供从购票、出行、观赛到住宿、美食和旅游等“一站式”服务。 本次亚运会将全程智能陆续落到了实处&#xff0…

CSS 实现 Turbo 官网 3D 网格线背景动画

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 查看 Turbo 官网 时发现它的背景动画挺有意思&#xff0c;就自己动手实现了一下。下面对关键点进行解释说明&#xff0c;查看完整代码及预览效果请 点击这里。 简单说明原理&#xff1a;使用 mask-image 遮罩绘制网格&a…

Python测试框架Pytest的基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

ios 通过xib自定义控件

通过xib自定义控件 xib和stroyboayd对比 共同点&#xff1a; 都是用来描述软件界面 都是用interface Builder工具来编辑 本质都是转换成代码去创建控件 不同点&#xff1a; xib是轻量级的&#xff0c;用来描述局部ui界面 创建模型文件 XMGCar 自定义控件 xib 图形设计 …

graylog源码搭建

这里主要讲如何源码安装graylog 下载地址&#xff1a; https://www.graylog.org/downloads/ 下载带有JVM的源码文件源码安装 下载graylog-5.1.3-linux-x64.tgz&#xff0c;并上传到Centos中&#xff0c;执行以下操作 tar -zxvf graylog-5.1.3-linux-x64.tgzcd /etcmkdir -p …

每天一道C语言编程:Cylinder(圆柱体问题)

题目描述 使用一张纸和剪刀&#xff0c;您可以通过以下方式切出两个面形成一个圆柱体&#xff1a; 水平切割纸张&#xff08;平行于较短的边&#xff09;以获得两个矩形部分。 从第一部分开始&#xff0c;切出一个最大半径的圆。圆圈将形成圆柱体的底部。 将第二部分向上滚动&…

在 Amazon 上以高可用性模式实现 Microsoft SQL 数据库服务现代化的注意事项

许多企业都有需要 Microsoft SQL Server 来运行关系数据库工作负载的应用程序&#xff1a;一些应用程序可能是专有软件&#xff0c;供应商可使用它强制 Microsoft SQL Server 运行数据库服务&#xff1b;其他应用程序可能是长期存在的、自主开发的应用程序&#xff0c;它们在最…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…

跳跃表SkipList(简单的C++实现)

不懂跳跃表的请直接百度 直接上实现 #include <iostream> #include <string.h> #include <ctime>using namespace std;template<typename T> struct SkipNode {inline static constexpr int Rate3;inline static constexpr int MaxHeight8;inline sta…

2023版7月软件测试面试题(800道)【附带答案】持续更新...

又到了立flag的时候&#xff0c;你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一…

批量添加:vue+easyexcel 上传excel文件解析为Java对象并保存到数据库

对于像数据库中批量添加数据&#xff0c;我们一般会选择通过Excel文件先按照固定的格式将数据保存&#xff0c;然后再通过系统上传进而保存到数据库中。 阿里的excel解析工具EasyExcel和Apach的POI都能进行Excel文件的解析&#xff0c;但是EasyExcel操作起来要相对更简单一些&…

cancal报错 config dir not found

替换classpath中间封号两边的值

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU

1186. 删除一次得到子数组最大和 解题思路&#xff1a;如果没做过还不是很好想&#xff0c;当时自己第一反应是双指针&#xff0c;结果是个动态规划的题。 核心就是dp的定义&#xff0c;dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了 dp[i][0]表示以…

K8S pod 均匀调度分配 —— 筑梦之路

pod调度简介 在 k8s 中 通过 kube-scheduler 组件来实现 pod 的调度&#xff0c;所谓调度&#xff0c;即把需要创建的 pod 放到 合适的 node 上&#xff0c;大概流程为&#xff0c;通过对应的 调度算法 和 调度策略&#xff0c;为待调度的 pod 列表中的 pod 选择一个最合适的 N…

JVM理论(五)执行引擎--解释器/JIT编译器

概述 首先执行引擎是java虚拟机核心的组成部分之一;而JVM的主要任务是装载字节码到内存,但不能够直接运行在操作系统之上.因为字节码指令并非等价于本地机器指令,它仅仅包含能够被JVM所识别的指令、符号表、以及其他信息;而此时执行引擎就华丽登场,它的任务就是将字节码指令解…

rust学习-泛型和trait

泛型 Option&#xff0c;Vec&#xff0c;HashMap<K, V>&#xff0c;Result<T, E>等&#xff0c;取函数以减少代码重复的机制 背景 两个函数&#xff0c;不同点只是名称和签名类型 fn largest_i32(list: &[i32]) -> i32 {let mut largest list[0];for &…