Gateway-断言 - 指南

news/2025/9/27 12:22:44/文章来源:https://www.cnblogs.com/yxysuanfa/p/19114951

断言就是一套规则,用来判断“什么样的请求,该走哪条路”。

网关内部配置了多个路由规则,每个规则都有对应的断言(Predicate)。网关会拿这个请求去逐一匹配这些断言条件

1.写法

短写法:

spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order      #lb表示负载均衡# 断言predicates:      #短写法- Path=/api/order/**       #所有以api/order开头的路劲转给service-order处理order: 0                     #优先级,值越小优先级越高

全写法:

spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order      #lb表示负载均衡# 断言predicates:- name: Path   #全写法args:pattern: /api/order/**match-trailing-slash: true

2.规则

3.测试

spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order      #lb表示负载均衡# 断言predicates:- name: Pathargs:pattern: /api/order/**match-trailing-slash: trueorder: 0                     #优先级,值越小优先级越高- id: product-routeuri: lb://service-productpredicates:- Path=/api/product/**     #所有以api/product开头的路径转给service-product处理#  <--------全写法演示-------->- id: bing-routeuri: https://cn.bing.compredicates:- name: Pathargs:pattern: /search- name: Queryargs:param: qregexp: hello world# <---------全写法演示-------->#   <---------短写法演示------->- id: deepseek-routeuri: https://www.deepseek.compredicates:- Path=/search- Query=q,hello#   <---------短写法演示--------->

这里再写两个断言,一个用全写法,一个用短写法,体会两种写法的优劣

启动GatewayMainApplication,等待控制台出现Started GatewayMainApplication,即说明服务启动完毕,再执行下步操作 。

打开浏览器或者apipsot/postman/apifox等接口测试工具 (这里使用apipost)

浏览器网址口或者测试工具请求口输入localhost/search/?q=hello world 回车

可以看到,测试通过,匹配成功。

继续测试deepseek-route

如图可以看到,浏览器和apipost测试断言匹配,测试通过

4.自定义断言工厂

创建断言工厂

在com.atguigu.gateway包下连包带类创建VipRoutePredicateFactory类

创建完成后,我们使用ctrl+n来搜索断言工厂源码QueryRoutePredicateFactory类

我们可以通过源码看到,自定义一个断言工厂需要:

1.继承抽象父类 AbstractRoutePredicateFactory并需要指定一个配置类作为泛型参数

2.定义配置类,并添加getter和setter方法

3.实现构造函数调用 super(Config.class)

4.实现shortcutFieldOrder(可选):定义快捷配置的参数顺序

5.实现apply方法:编写核心逻辑,利用 ServerWebExchangeConfig 进行判断,返回 Predicat

6.注册为Bean:通常使用 @Component 注解将其声明为一个Spring Bean,这样框架就能自动发现它。

package org.springframework.cloud.gateway.handler.predicate;
import jakarta.validation.constraints.NotEmpty;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
public class QueryRoutePredicateFactory extends AbstractRoutePredicateFactory {
//定义常量字符串  k-vpublic static final String PARAM_KEY = "param";public static final String REGEXP_KEY = "regexp";
//构造函数public QueryRoutePredicateFactory() {super(Config.class);}
//短写法public List shortcutFieldOrder() {return Arrays.asList("param", "regexp");}
//这是核心方法,它创建了实际的断言逻辑public Predicate apply(final Config config) {return new GatewayPredicate() {public boolean test(ServerWebExchange exchange) {if (!StringUtils.hasText(config.regexp)) {return exchange.getRequest().getQueryParams().containsKey(config.param);} else {List values = (List)exchange.getRequest().getQueryParams().get(config.param);if (values == null) {return false;} else {Iterator var3 = values.iterator();String value;do {if (!var3.hasNext()) {return false;}value = (String)var3.next();} while(value == null || !value.matches(config.regexp));return true;}}}
//返回当前断言所使用的配置对象public Object getConfig() {return config;}public String toString() {return String.format("Query: param=%s regexp=%s", config.getParam(), config.getRegexp());}};}//内部配置类@Validatedpublic static class Config {private @NotEmpty String param;private String regexp;public Config() {}public String getParam() {return this.param;}public Config setParam(String param) {this.param = param;return this;}public String getRegexp() {return this.regexp;}public Config setRegexp(String regexp) {this.regexp = regexp;return this;}}
}

下面,我们根据源码来照猫画虎,定义一个自己的断言工厂VipRoutePredicateFactory

package com.atguigu.gateway.predicate;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
//注册为bean,交给spring管理
@Component
public class VipRoutePredicateFactory extends AbstractRoutePredicateFactory {//构造函数调用public VipRoutePredicateFactory() {super(Config.class);}@Override// 实现apply方法public Predicate apply(Config config) {System.out.println("进入自定义断言工厂");return new Predicate() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {//  ServerWebExchange内部封装了请求参数和响应结果ServerHttpRequest request = serverWebExchange.getRequest();// 获取参数String first = request.getQueryParams().getFirst(config.param);//判空并判等if (StringUtils.hasText(first) && first.equals(config.value)) {return true;}return false;}};}// 定义参数顺序,重写shortcutFieldOrder方法@Overridepublic List shortcutFieldOrder() {return Arrays.asList("param", "value");}/*** 定义配置类*/@Validatedpublic static class Config {@NotEmptyprivate String param;@NotEmptyprivate String value;public @NotEmpty String getParam() {return param;}public @NotEmpty String getValue() {return value;}public void setParam(@NotEmpty String param) {this.param = param;}public void setValue(@NotEmpty String value) {this.value = value;}}
}

接着我们需要在配置文件中配置自定义断言工厂

5.测试(自定义断言工厂)

我们在启动GatewayMainApplication,然后等待服务启动完毕,然后浏览器访问

首先测试短写法演示

可以看到localhost/search?q=hello&user=yuexihuachen 访问deepseek成功

然后测试全写法演示 此时q=hello world,localhost/search?q=hello world&user=yuexihuachen访问bing也成功

最后我们再改变user的值,看看是否会失败,localhost/search?q=hello world&user=yuexihuache

果不其然,访问未通过,因为user参数的值与我们在idea中配置文件中不一致,返回404错误码。

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

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

相关文章

macOS 多 Java 版本管理(jenv 方案)

目录一、目标二、查看已安装的 JDK三、使用 jenv 管理 Java 版本1. 安装 jenv2. 配置 Shell 环境3. 添加已安装的 JDK4. 查看可用版本5. 切换 Java 版本6. 验证版本四、常见问题1. 权限问题2. Shell 配置文件选择错误五…

龙口网站制作价格衡阳网站建设技术外包

操作&#xff1a; 是时机函数&#xff0c;在页面加载前&#xff0c;可以在这两个函数里面做一些事情&#xff0c; 比如发送异步请求。 类似过滤器&#xff0c;或者拦截器。1. axios安装 安装报错&#xff0c;多装几遍&#xff0c;或者用cnpm安装 npm install axios -s npm in…

怎么提高网站关键字排名网站怎么做360免费优化

在数字化浪潮席卷全球的今天&#xff0c;跨境电商业务蓬勃发展&#xff0c;成为推动国际贸易增长的重要引擎。亚马逊&#xff0c;作为全球最大的电商平台之一&#xff0c;以其独特的平台特点和全球化布局&#xff0c;为卖家和买家提供了便捷、高效的交易环境&#xff0c;成为众…

广州搜索seo网站优化建设银行网站字体

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

AI 落地教育智慧招生:从 “热线占线” 到 “724 小时精准应答” 的实践分享

AI 落地教育智慧招生:从 “热线占线” 到 “724 小时精准应答” 的实践分享在教育招生季,家长对 “报名时间”“学区范围”“学校特色” 的咨询需求集中爆发,而传统招生咨询模式往往陷入 “家长急、老师累、效率低”…

软件技术基础第一次课程

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc 这个作业的目标 初步学习博客的发文方法,进行自我评估,有初步的认知 姓名-学号 林靖迪- 2023329301118自我介绍与自我评估自我介绍 我叫林靖迪,是…

服装网站策划设计重庆手机网站制作价格

过几天就要回家了,剩下的工作还有一点没有完成.不过已经是无关大碍了.突然有种很烦的感觉.想想这个暑假的时间里面自己也算是经历不少了,可是回忆一下自己到底收获了什么,脑子里面却是一片空白,什么都想不到.本来是要动笔写篇"我的深圳之行"之类的东西的,可是却没有一…

做网站推广怎么找客户临安区做网站的公司

实现一个标准型计算器及其各项功能的实现 效果图欣赏 是不是看起来很漂亮的呢&#xff1f;&#xff1f;&#xff1f; 功能详解&#xff1a; 屏幕显示输入的数字和符号实现加减乘除运算回退和清零功能小数的运算结果的输出 相信小伙伴们都已经迫不及待的想要知道源码了。 代…

石子合并(一排的和一个环的)

石子合并 石子合并是环形dp的经典题,要做它我们首先要做它的弱化版,也就是排成一排的情况:石子合并(弱化版)(洛谷p1775) 石子合并弱化版解法 对于这道题,可以先从简单的情况开始考虑;比如现在要合并a,b,c三堆…

思维题练习

思维题题解合集本文选取题目源于此处,以及一些平时的好的思维题。 大体按照主观难度排序。[FJCPC 2025] 构造大师贝贝 注意到 \(T\leq1000\),但是 \(n\leq10^{12}\)。那么从时间复杂度的角度考虑,应当为一个类似于 …

NXP - 用MCUXpresso IDE导入lpcopen_2_10_lpcxpresso_nxp_lpcxpresso_1769.zip中的工程 - 教程

NXP - 用MCUXpresso IDE导入lpcopen_2_10_lpcxpresso_nxp_lpcxpresso_1769.zip中的工程 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

US$42 BDM01 Adapter for Yanhua Mini ACDP Module1 BMW CAS1-CAS4+

BDM01 Adapter for Yanhua Mini ACDP Module1 BMW CAS1-CAS4+Package List:1pc x BDM01 Adapter for Yanhua Mini ACDP Module1 Pictures of BDM01 Adapter for Yanhua Mini ACDP Module1 BMW CAS1-CAS4+BDM01 Adapter…

江苏网站集约化建设frontpage怎么改网站名字

教你快速上手AI应用——吴恩达AI系列教程 人工智能风靡全球,它的应用已经渗透到我们生活的方方面面,从自动驾驶到智能家居,再到医疗辅助和量化交易等等。他们逐渐改变了我们的生活方式,然而,对于许多人来说,AI仍然是一个神秘且无法理解的领域。 为了帮助更多的人理解并掌握AI…

北京网站案例站长统计app软件

前言 Perfectly Clear WorkBench 是一款图像修复工具&#xff0c;可以帮助用户对自己的图片素材进行修复&#xff0c;很多的照片因为拍摄问题&#xff0c;或者设备限制&#xff0c;会导致拍摄效果不好&#xff0c;使用这款软件可以进行一定程度的修复&#xff0c;当拍摄时亮度…

spatial项目的主要领导者斯坦福大学ppl实验室的 Kunle Olukotun 教授和 Christos Kozyrakis 教授

Kunle Olukotun 教授是一位出身于印度的计算机科学家,他的知名成就是开创了多核处理器的先河。标签是 Sun 公司的 Niagara 系列多核处理器,当时大家都还在单核上混。Olukotun团队的解决方案:他们提出了 芯片多处理器…

程序杂谈:概述

程序语言是一切计算机程序的载体,可谓是计算机技术的核心。 这个世界上有各种各样的程序语言,本合集将介绍尽可能多的、著名的程序设计语言。了解更多的程序语言(以及背后的哲学、生态)有助于技术选型。选择正确的…

字符串基础

字符串Hash我们定义一个把字符串映射到整数的函数 \(f\) ,这个 \(f\) 称为是 \(Hash\) 数。 我们希望这个函数 \(f\) 可以方便地帮我们判断两个字符串是否相等。基础公式: $f(s)= {\textstyle \sum_{i=1}^{l}} s[i]…

免费微网站建设网站关键字字数

王江民&#xff0c;中国最早的反病毒专家&#xff0c;被业界尊称“中国杀毒软件之父”、“中国反病毒第一人。以38岁为分界&#xff0c;王江民的前半生&#xff0c;是中国青年身残志坚的楷模&#xff0c;他的后半生是中国安全软件的奠基人&#xff0c;带领中国商用软件第一个走…

营销型网站建设有哪些官方网站建设必要性

题干&#xff1a; 分东西 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;1 输入 第一行输出一个数i表示有i组情况&#xff08;0<i<10&#xff09; 接下来的i行&#xff0c;每一行输入两个个数M(0<M<1000000)和N(0<N<2…