SpringCloud GateWay 自定义AbstractRoutePredicateFactory

SpringCloud GateWay 自定义AbstractRoutePredicateFactory

主要为了解决原有的断言配置不满足业务

自定义模板套路

  1. 开头任意取名,但是必须以RoutePredicateFactory后缀结尾
  2. 继承AbstractRoutePredicateFactory抽象类

自定义路由断言规则步骤套路

需要重写的源码

仿照这个源码写,这个源码的路由规则是根据时间来定义的

接下来以示例演示

public class AfterRoutePredicateFactory extends AbstractRoutePredicateFactory<Config> {public static final String DATETIME_KEY = "datetime";public AfterRoutePredicateFactory() {super(Config.class);}//支持shortcut 如果不重写 用简便形式写就会报错public List<String> shortcutFieldOrder() {return Collections.singletonList("datetime");}//ServerWebExchange这个类似与request,这个是判断是否让请求通过的规则public Predicate<ServerWebExchange> apply(final Config config) {return new GatewayPredicate() {public boolean test(ServerWebExchange serverWebExchange) {ZonedDateTime now = ZonedDateTime.now();return now.isAfter(config.getDatetime());}public Object getConfig() {return config;}public String toString() {return String.format("After: %s", config.getDatetime());}};}//路由规则public static class Config {private @NotNull ZonedDateTime datetime;public Config() {}public ZonedDateTime getDatetime() {return this.datetime;}public void setDatetime(ZonedDateTime datetime) {this.datetime = datetime;}}
}

1.新建类名XXX需要以RoutePredicateFactory结尾并继承AbstractRoutePredicateFactory类

@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<WeGateWay.Config>
{}

2.重写Config

根据什么来断言 ,这里是根据是请求参数是否有userType这个字符串

@Validatedpublic static class Config {@NotEmpty@Setter@Getterprivate String userType;public Config() {}}

3.重写apply方法

  @Override//ServerWebExchange这个类似与requestpublic Predicate<ServerWebExchange> apply(MyRoutePredicateFactory.Config config) {return new Predicate<ServerWebExchange>() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {String userType = serverWebExchange.getRequest().getQueryParams().getFirst("userType");if(userType==null)return false;//这里的config是网关中是否yaml中配置的if(userType.equalsIgnoreCase(config.getUserType())) return true;return false;}};}

4 .yaml配置之后开始测试

gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名uri: lb://cloud-payment-service              #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由- after=2024-03-08T16:16:20.512583800+08:00[Asia/Shanghai]- My=gold  #如果请求参数中有useType=gold 就会成功请求

测试结果 加userType

GET http://localhost:9527/pay/gateway/get/1?userType=goldHTTP/1.1 200 OK
transfer-encoding: chunked
Content-Type: application/json
Date: Fri, 08 Mar 2024 13:22:16 GMT{"code": "200","message": "success","data": null,"timestamp": 1709904136045
}
Response file saved.
> 2024-03-08T212216.200.jsonResponse code: 200 (OK); Time: 147ms (147 ms); Content length: 72 bytes (72 B)

不加

GET http://localhost:9527/pay/gateway/get/1?userType=gHTTP/1.1 404 Not Found
Content-Type: application/json
Content-Length: 131{"timestamp": "2024-03-08T13:23:11.114+00:00","path": "/pay/gateway/get/1","status": 404,"error": "Not Found","requestId": "a4ff3329-8"
}
Response file saved.
> 2024-03-08T212311.404.jsonResponse code: 404 (Not Found); Time: 23ms (23 ms); Content length: 131 bytes (131 B)

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

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

相关文章

[BUG]Windows安装WSL报错

Windows安装WSL报错 报错内容如下&#xff1a; Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x800701bc Error: 0x800701bc WSL 2 ????????????? https://aka.ms/wsl2kernel Press any key to continue...产生原因 在…

Android中向Fragment传递数据

为什么不推荐用构造函数传递参数 有人说向Fragment传递数据可以通过构造函数或者public方法&#xff0c;这确实是可以传递成功的&#xff0c;但是安卓官方并不推荐这两种方法&#xff0c;而是推荐用setArguments()方法来向Fragmen传递数据&#xff0c;这是为什么呢&#xff1f…

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…

[Leetcode] 904. 水果成篮 —— 滑动窗口

Problem: 904. 水果成篮 文章目录 思路解题方法复杂度Code 思路 需要找到连续的最多两种类型的最长序列 通过例子讲解思路&#xff1a;34335&#xff0c;left0&#xff0c;mid1&#xff0c;new_mid2 定义&#xff1a;现有三个下标left,mid,new_mid&#xff1b;其中left和mid分别…

USB2.0设备检测过程信号分析

1.简介 USB设备接入的Hub端口负责检测USB2.0设备是否存在和确定USB2.0设备的速度。检测设备是否存在和确定设备速度涉及一系列的信号交互&#xff0c;下面将分析该过程。 2.硬件 USB低速设备和全速/高速设备的连接器在硬件结构上有所不同&#xff0c;而主机或者Hub接收端连接…

C++11_右值引用与移动语义

目录 1、左值的定义 1.1 左值引用 2、右值的定义 2.1 右值引用 3、右值与左值的使用区别 4、右值引用的意义 4.1 左值引用的短板 5、移动语义 5.1 移动构造 5.2 移动赋值 6、万能引用 6.1 右值的别名-左值化 6.2 完美转发 前言&#xff1a; 在C11之前就有了引…

地址分词 | EXCEL批量进行地址分词,标准化为十一级地址

一 需求 物流需要对用户输入地址进行检查&#xff0c;受用户录入习惯地址可能存在多种问题。 地址标准化是基于地址引擎和地址大数据模型&#xff0c;自动将地址信息标准化为省、市、区市县、街镇、小区、楼栋、单元、楼层、房屋、房间等元素&#xff0c;补充层级缺失数据、构建…

【LeetCode】392. 判断子序列(简单)——代码随想录算法训练营Day54

题目链接&#xff1a;392. 判断子序列 题目描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"…

bug - poi getMergedRegion合并后的行列number错误

第一个CellRangeAddress 的Row number 应该是0&#xff0c;但是给出的是1。 其它的CellRangeAddress 与实际大致相差4-5不等&#xff0c;没有规律。 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>…

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办?

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办&#xff1f; 在订阅 ChatGPT Plus 或者 OpenAI API 时&#xff0c;有时候会出现已下报错 &#xff1a; Your card has been declined. 您的银行卡被拒绝 出现这种错误&#xff0c;有以下几个解…

网关数据采集解决方案-天拓四方

随着物联网技术的快速发展&#xff0c;数据采集已成为企业运营、管理和决策的重要支撑。网关作为连接不同网络的关键设备&#xff0c;其在数据采集过程中发挥着至关重要的作用。本文将详细介绍一种网关数据采集解决方案&#xff0c;旨在确保数据采集的高效性、准确性和安全性。…

在圆钢生产中 哪种直线度测量仪更具实用性?

圆钢直线度尺寸是其品质检测中重要一环&#xff0c;要说直线度测量方法&#xff0c;那肯定是有很多种&#xff0c;但要说适合产线&#xff0c;更具实用性的是哪种&#xff0c;本文就来简单的看一下。 简单来说&#xff0c;直线度测量方法有直尺法、重力法、直线法、百分表、水平…

入门C++《类与对象》————2

目录 前言&#xff1a; 1.类的6个默认成员函数 2. 构造函数 1、概念引入&#xff1a; 2、特性&#xff1a; 3.析构函数 1、概念引入&#xff1a; 2、特性&#xff1a; 4.拷贝构造函数 1、概念&#xff1a; 2、特征&#xff1a; 5.赋值运算符重载 1、运算符重载&am…

代码随想录算法训练营第四十天|LeetCode343 整数拆分、LeetCode96 不同的二叉搜索树

343.整数拆分 思路&#xff1a;确定dp数组以及下标的含义 dp[i]代表 i可以被拆分后的最大乘积。确定递推公式&#xff0c;假如拆成连个数&#xff0c;dp[i] j*(i-j),拆成两个数以上&#xff0c;dp[i]j*dp[i-j]&#xff0c;j的范围为1到i-1.dp[i]找到所有情况的最大值。初始化…

Word论文格式怎么设置 Word论文查重功能在哪里 论文格式要求及字体大小 论文查重怎么查 WPS论文查重准确吗

Word文档是由Microsoft Word处理软件创建和编辑的文档。Word文档通常用于创建各种类型的文档&#xff0c;如信函、报告、简历、论文等。本篇文章将为大家介绍Word论文格式怎么设置以及Word论文查重功能在哪里。 一、Word论文格式怎么设置 一个好的论文格式&#xff0c;是论文…

机器学习——神经网络压缩

神经网络压缩 需要部署&#xff0c;设备内存和计算能力有限&#xff0c;需要进行模型压缩&#xff0c;在设备上运行的好处是低延迟&#xff0c;隐私性。 目录 不考虑硬件问题&#xff0c;只考虑通过软件算法优化。 修剪网络 参数过多或者没有用的参数&#xff0c;可以将其剪…

Shell脚本的编写规范【入门篇】

在软件开发中&#xff0c;Shell脚本是一种非常常见的脚本语言&#xff0c;用于自动化执行一系列命令。Shell脚本可以帮助开发人员简化日常工作&#xff0c;提高工作效率。然而&#xff0c;要编写出高效且易于维护的Shell脚本&#xff0c;需要掌握其基本结构和书写规范。本文将通…

Missing type map configuration or unsupported mapping

今天开发的时候突然遇到这么一个问题&#xff0c;可以确定的是不是AutoMap的问题&#xff0c;因为项目中其他接口都是好好的&#xff0c;只有新加的这个控制器不行&#xff0c;排查了一下&#xff0c;少了映射配置&#xff0c;在这里加上映射关系即可&#xff0c;大意了。

大唐杯学习笔记:Day8

1.1 功率控制 一、NR功控的作用 抑制小区间干扰省电,减少发射功率&#xff1b;在小区内,主要用于补偿路损和阴影 小区内工控上行功率控制下行功率分配 二、PRACH信道的功率控制 P P R A C H ( i ) m i n { P C M A X , f , c ( i ) , P L b , f , c Δ p r e ( N p r e…

2023年NOC大赛软件创意编程(学而思)赛道c++初赛试题

2023NOC软件创意编程初中组C++初赛 一、单选 1、(2分)下列选项中,不属于计算机软件系统的是 A 操作系统 C.用户自己开发的软件系统 B.系统文用程序D.存储系统 2、(2分)十进制数17对应的二进制数是( A 11000B.10001 C 11111 D.10101 3、(2分)关于函数,以下说法错误的是( A…