Gateway Predicate断言(谓词)

是什么

Spring Cloud Gateway匹配路由作为Spring WebFlux HandlerMapping基础设施的一部分。 Spring Cloud Gateway包含许多内置的路由谓词工厂。 所有这些谓词都匹配HTTP请求的不同属性。 您可以使用逻辑 and 语句来联合收割机组合多个路由谓词工厂。

Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。

分类

                                                

idea启动项目打印的日志: 

常用的内置Route Predicate

id:我们自定义的路由 ID,保持唯一
uri:目标服务地址
predicates:路由条件,Predicate接受一个输入参数返回一个布尔值。
        该属性包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)

配置语法总体概述

2种配置方式,二选一

短格式配置

完全展开配置

测试地址

http://localhost:9527/pay/gateway/get/1

After Route Predicate

After路由谓词工厂接受一个datetime参数(这是一个java ZonedDateTime)。

在指定日期时间之后才可以请求该地址。

spring:cloud:gateway:routes:- id: after_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- After=2024-04-24T23:56:23.970133500+08:00[Asia/Shanghai]

如何获取ZonedDateTime

import java.time.ZonedDateTime;public class Testtt {public static void main(String[] args) {ZonedDateTime zonedDateTime = ZonedDateTime.now().plusMinutes(1);   // 1分钟之后的时间System.out.println(zonedDateTime);}
}

Before Route Predicate

Before路由谓词工厂接受一个datetime参数(这是一个java ZonedDateTime)。

在指定日期时间之前才可以请求该地址。

spring:cloud:gateway:routes:- id: before_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Before=2024-04-25T00:02:10.783066100+08:00[Asia/Shanghai]

Between Route Predicate

Between路由谓词工厂接受两个参数,datetime1和datetime2(都是Java ZonedDateTime)。用英文逗号分隔。

在datetime1之后和datetime2之前可以请求该地址。

datetime2参数必须在datetime1之后。

spring:cloud:gateway:routes:- id: between_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Between=2024-04-24T23:56:23.970133500+08:00[Asia/Shanghai], 2024-04-25T00:02:10.783066100+08:00[Asia/Shanghai]

Cookie Route Predicate

Cookie Route Predicate需要两个参数,一个是 Cookie name ,一个是正则表达式。
路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

spring:cloud:gateway:routes:- id: cookie_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Cookie=chocolate, ch.p

Header Route Predicate

Header路由谓词工厂接受两个参数,header和regexp(这是一个Java正则表达式)。

此谓词与具有给定名称且其值与正则表达式匹配的标头匹配。

spring:cloud:service-name: ${spring.application.name}gateway:routes:- id: header_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Header=X-Request-Id, [0-9]+

Host Route Predicate

Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。

它通过参数中的主机地址作为匹配规则。

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Host=**.somehost.org,**.anotherhost.org

Path Route Predicate

路径相匹配的进行路由

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**

Query Route Predica

Query路由谓词工厂有两个参数:一个必需的param和一个可选的regexp(这是一个Java正则表达式)。

请求包含param查询参数。

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Query=green

RemoteAddr route predicate

RemoteAddr路由断言工厂采用sources的列表(最小大小为1),这些列表是CIDR表示法(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。

什么是计算机网络中的 CIDR

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- RemoteAddr=192.168.31.171/24

Method Route Predicat

Method路由谓词工厂接受一个methods参数,它是一个或多个参数:要匹配的HTTP方法。

配置某个请求地址,只能用Get/Post方法访问,方法限制。

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Method=GET,POST

Weight Route Predicat

Weight路由谓词工厂有两个参数:group和weight(一个int)。计算每组的权重。 

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

该路由将把80%的流量转发到weightthigh.org,20%的流量转发到weightlow.org。

自定义断言

规则:

        要么继承AbstractRoutePredicateFactory抽象类

        要么实现RoutePredicateFactory接口

        开头任意取名,但是必须以RoutePredicateFactory后缀结尾

仿照:AfterRoutePredicateFactory

自定义XXXRoutePredicateFactory

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

2. 重写apply方法

3. 新建apply方法所需要的静态内部类MyRoutePredicateFactory.Config,这个Config类就是我们的路由断言规则,重要

4. 空参构造方法,内部调用super

5. 重载 shortcutFieldOrder 方法

        不重载,配置的时候只能完全展开配置,不能短格式配置。

package com.yq.springcloud.predicate;import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config> {public static final String PARAM_USERTYPE = "userType";public MyRoutePredicateFactory() {super(Config.class);}/*** 返回有关参数数和快捷方式分析顺序的提示* @return*/@Overridepublic List<String> shortcutFieldOrder() {return Collections.singletonList(PARAM_USERTYPE);}@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return serverWebExchange -> {//检查request的参数里面,userType是否为指定的值,符合配置就通过String userType = serverWebExchange.getRequest().getQueryParams().getFirst(PARAM_USERTYPE);if (userType == null) return false;//如果说参数存在,就和config的数据进行比较if (userType.equals(config.getUserType())) {return true;}return false;};}@Validated@Datapublic static class Config {@NotBlankprivate String userType; //钻、金、银等用户等级}
}

自定义GatewayAutoConfiguration

仿照:org.springframework.cloud.gateway.config.GatewayAutoConfiguration

将自己自定义的断言加入IOC

package com.yq.springcloud.config;import com.yq.springcloud.predicate.MyRoutePredicateFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayReactiveLoadBalancerClientAutoConfiguration;
import org.springframework.cloud.gateway.config.conditional.ConditionalOnEnabledPredicate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true)
@EnableConfigurationProperties
@AutoConfigureBefore({ HttpHandlerAutoConfiguration.class, WebFluxAutoConfiguration.class })
@AutoConfigureAfter({ GatewayReactiveLoadBalancerClientAutoConfiguration.class,GatewayClassPathWarningAutoConfiguration.class })
public class MyGatewayAutoConfiguration {@Bean@ConditionalOnEnabledPredicatepublic MyRoutePredicateFactory myRoutePredicateFactory() {return new MyRoutePredicateFactory();}
}

 配置文件中添加配置断言

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- My=diamond

测试

1, 启动的时候,已加载到断言中

2. 只有userType=diamond才可以正常访问。

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

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

相关文章

基于EBAZ4205矿板的图像处理:03使用VIO调试输出HDMI视频图像

基于EBAZ4205矿板的图像处理&#xff1a;03使用VIO调试输出HDMI视频图像 在zynq调试时VIO是真的方便&#xff0c;特此写一篇博客记录一下 先看效果 项目简介 下面是我的BD设计&#xff0c;vtc用于生成时序&#xff0c;注意&#xff0c;2021.2的vivado的vtcIP是v6.2版本&…

Stm32CubeMX 为 stm32mp135d 添加 adc

Stm32CubeMX 为 stm32mp135d 添加 adc 一、启用设备1. adc 设备添加2. adc 引脚配置2. adc 时钟配置 二、 生成代码1. optee 配置 adc 时钟和安全验证2. linux adc 设备 dts 配置 bringup 可参考&#xff1a; Stm32CubeMX 生成设备树 一、启用设备 1. adc 设备添加 启用adc设…

JAVA前端快速入门基础_javascript入门(03)

写在前面:本文用于快速学会简易的JS&#xff0c;仅做扫盲和参考作用 本章节主要介绍JS的事件监听 1.什么是事件监听 事件:是指发生在HTML端的事件&#xff0c;主要指以下几种。 1.按钮被点击 2.鼠标移动到元素上 3.按到了键盘 事件监听:当触发了事件时&#xff0c;JS会执行相…

vue3、element-plus递归实现动态菜单

vue3、element-plus递归实现动态菜单 使用场景&#xff1a;动态菜单为什么使用递归递归在动态菜单中的实现 使用场景&#xff1a;动态菜单 动态菜单是指菜单项的数量和层次结构可能是动态的&#xff0c;通常来自后端或用户输入。这些菜单的特征包括&#xff1a; 多层嵌套&…

【webrtc】MessageHandler 3: 基于线程的消息处理:以sctp测试为例

消息处理可以用于模拟发包处理G:\CDN\rtcCli\m98\src\net\dcsctp\socket\dcsctp_socket_network_test.cc 这个实现中,onMessage还是仅对了一种消息进行处理,就是接收则模式下,打印带宽。当然,可能程序有多个消息,分别在不同的onmessage中执行?SctpActor:以一个恒定的速率…

【大语言模型LLM】-基于ChatGPT搭建客服助手(1)

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

利用大型语言模型提升个性化推荐的异构知识融合方法

在推荐系统中&#xff0c;分析和挖掘用户行为是至关重要的&#xff0c;尤其是在美团外卖这样的平台上&#xff0c;用户行为表现出多样性&#xff0c;包括不同的行为主体&#xff08;如商家和产品&#xff09;、内容&#xff08;如曝光、点击和订单&#xff09;和场景&#xff0…

C++ 堆结构和堆排序(从顶到底/从底到顶的大顶堆)+ 优化

一、堆结构和堆排序 &#xff08;1&#xff09;heapInsert&#xff0c;向上调整大根堆 和 heapify&#xff0c;向下调整大根堆 // i位置的数&#xff0c;向上调整大根堆 // arr[i] x&#xff0c;x是新来的&#xff01;往上看&#xff0c;直到不比父亲大&#xff0c;或者来到0…

使用Gradio搭建聊天UI实现质谱AI智能问答

一、调用智谱 AI API 1、获取api_key 智谱AI开放平台网址&#xff1a; https://open.bigmodel.cn/overview 2、安装库pip install zhipuai 3、执行一下代码&#xff0c;调用质谱api进行问答 from zhipuai import ZhipuAIclient ZhipuAI(api_key"xxxxx") # 填写…

短视频交友系统搭建重点,会用到哪些三方服务?

在搭建短视频交友系统时&#xff0c;为了确保系统的稳定性、安全性和用户体验&#xff0c;通常需要用到多种第三方服务。以下是搭建短视频交友系统时可能用到的关键第三方服务&#xff1a; 云服务提供商&#xff1a;如阿里云、腾讯云等&#xff0c;提供稳定、可扩展的服务器资源…

如何消除SmartScreen“未知发布者”警告?

在互联网高速发展、应用程序遍地开花的当今时代&#xff0c;作为企业&#xff0c;我们通常会开发自己的应用程序来开展自己的业务&#xff0c;以便与客户建立更深入的联系。不少应用程序所有者可能会面临一个难题&#xff0c;那就是用户下载时&#xff0c;系统会弹出SmartScree…

nuxt3项目服务端bulid后在本地浏览的3种方式(nuxi preview、Node.js Server、PM2)

你也许会问有了开发调试本地浏览&#xff0c;为什么还要服务端构建之后在本地浏览&#xff1f; 举个简单例子 在 Nuxt 3 服务端打包中&#xff0c;由于运行环境不同&#xff0c;无法直接访问 process 对象。服务端打包通常是在 Node.js 环境中进行的&#xff0c;而 process 对象…

设计模式之代理模式ProxyPattern(六)

一、代理模式介绍 1、什么是代理模式&#xff1f; 代理模式是一种结构型设计模式&#xff0c;它允许为其他对象提供一个替代品或占位符&#xff0c;以控制对这个对象的访问。 2、代理模式的角色构成 抽象主题&#xff08;Subject&#xff09;&#xff1a;定义了真实主题和代…

记一次使用Notepad++正则表达式批量替换SQL语句

目录 一、需求二、解决方案三、正则解析 一、需求 存在如下SQL建表脚本&#xff1a; CREATE TABLE "BUSINESS_GOODS" ( "ID" VARCHAR(32) NOT NULL, "GOODS_CODE" VARCHAR(50), "GOODS_NAME" VARCHAR(100), ... NOT CLUSTER PRIMARY…

刷代码随想录有感(50):路径总和

题干&#xff1a; 代码; class Solution { public:bool traversal(TreeNode* node, int count){if(node NULL)return false;if(!node -> left && !node -> right && count 0)return true;if(!node -> left && !node -> right &&…

北京金融大数据有限公司X百望云签署战略合作协议 共同发布“金数数据要素流通云平台”

随着数据资产与数据要素相关政策密集出台&#xff0c;资本与实业企业均跃跃欲试。但因为没有龙头企业的方案引领和成熟的落地实践&#xff0c;市场呈谨慎观望态势&#xff0c;热度无处安放。 北京金融大数据有限公司&#xff08;以下简称“金融大数据公司”&#xff09;作为市…

动手学深度学习——softmax分类

1. 分类问题 回归与分类的区别&#xff1a; 回归可以用于预测多少的问题&#xff0c; 比如"预测房屋被售出价格"&#xff0c;它是个单值输出。softmax可以用来预测分类问题&#xff0c;例如"某个图片中是猫、鸡还是狗&#xff1f;"&#xff0c;这是一个多…

深入理解正则表达式:从入门到精通

title: 深入理解正则表达式&#xff1a;从入门到精通 date: 2024/4/30 18:37:21 updated: 2024/4/30 18:37:21 tags: 正则Python文本分析日志挖掘数据清洗模式匹配工具推荐 第一章&#xff1a;正则表达式入门 介绍正则表达式的基本概念和语法 正则表达式是一种用于描述字符串…

Bert基础(二十一)--Bert实战:文本摘要

一、介绍 1.1 文本摘要简介 文本摘要&#xff08;Text Summarization&#xff09;&#xff0c;作为自然语言处理&#xff08;NLP&#xff09;领域的一个分支&#xff0c;其核心目标是从长篇文档中提取关键信息&#xff0c;并生成简短的摘要&#xff0c;以提供对原始内容的高度…

Go语言map

map 概念 在Go语言中&#xff0c;map 是一种内建的数据结构&#xff0c;它提供了一种关联式的存储机制&#xff0c;允许你以键值对的形式存储数据。每个键都是唯一的&#xff0c;并且与一个值相关联。你可以通过键来查找、添加、更新和删除值&#xff0c;这类似于其他编程语言…