Spring Cloud Gateway之Predicate断言详解

2023-12-30 11:52

本文主要是介绍Spring Cloud Gateway之Predicate断言详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • Predicate(断言)
    • 内置Predicate
      • 请求参数匹配
      • 请求路径匹配
      • Header 属性匹配
      • Cookie 匹配
      • 请求方式匹配
      • 请求 ip 地址匹配
      • 时间匹配
      • 组合匹配

Predicate(断言)

在 Spring Cloud Gateway 中,Predicate(断言)是用于匹配传入请求的条件。它们用于确定哪些请求应该被路由到特定的目标服务。

Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。

Spring Cloud Gateway 提供了多种预定义的 Predicate,可以根据不同的条件进行路由匹配。以下是一些常用的 Predicate

内置Predicate

请求参数匹配

Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式。

示例:

spring:cloud:gateway:routes:- id: my_routeuri: https://example.orgpredicates:- Query=myparameter

这样配置,只要请求中包含 myparameter属性的参数即可匹配路由。

我们还可以对参数值也进行配置

spring:cloud:gateway:routes:- id: my_routeuri: https://example.orgpredicates:- Query=myparameter,parametervalue

这样配置, myparameter属性的值为parametervalue才会匹配

同时我们还可以使用正则表达式来表示

        predicates:- Query=myparameter,my.

这样只要当请求中包含 myparameter属性并且参数值是以 my 开头的长度为三位的字符串才会进行匹配和路由。

请求路径匹配

Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。

spring:cloud:gateway:routes:- id: my_routeuri: https://example.orgpredicates:- Path=/user/**

这样设置,则/user开头的任一路径都会匹配路由

在路径配置中,我们可以使用{segment}来进行占位,表示一个请求路径中的特定段
具体来说,{segment}可以用于匹配请求路径中的任意段。例如,如果有一个路由路径定义为/api/{segment}/users,那么当请求路径为/api/profile/users时,{segment}将会被替换为profile,从而匹配该路由路径。

但是{segment}不支持匹配子路径,如果想匹配子路径需要使用/**

Header 属性匹配

Header Route Predicate 接受两个参数:一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行

spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+

这样配置,则只有header请求头中有X-Request-Id属性,并且属性值为数值的时候才匹配路由

Cookie 匹配

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

spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p

这样配置,请求必须包含一个名为chocolate的cookie,其值需要与ch.p正则表达式匹配才会进行路由

请求方式匹配

可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由,支持一个或多个参数

spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST

这样配置,如果请求方法是GET或POST,则此路由匹配

请求 ip 地址匹配

Predicate 也支持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最小大小为1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。

在 CIDR 表示法中,IP 地址后面跟着斜杠和一个数字,斜杠后的数字表示子网掩码位数。

CIDR 符号的范围从 /0 到 /32,对应着不同长度的子网掩码位数。较小的数字表示更大的范围,例如 /0 表示整个 IP 地址空间,而 /32 表示单个主机地址。

spring:cloud:gateway:routes:- id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24

192.168.1.1/24 表示一个 CIDR 格式的 IP 地址范围,其中 /24 表示子网掩码。这个范围包括从 192.168.1.1 到 192.168.1.254 的所有 IP 地址。例如,如果请求的远端地址为192.168.1.10,则此路由匹配。

如果你只想匹配单个ip地址,那么可以使用ip/32来表示,ip/32表示只有该 IP 地址本身才会匹配,其他任何 IP 地址都不会与之匹配。

时间匹配

我们可以指定某个时间前后的请求匹配路由

After :匹配在指定日期时间之后发生的请求

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]

如果想匹配某个日期之前,那么可以使用Before

spring:cloud:gateway:routes:- id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]

组合匹配

多个 Predicates 可以同时存在于同一个路由,请求必须同时满足所有的条件才被这个路由匹配

示例

spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=POST- Header=X-Request-Id, \d+

这样配置,只有当请求方法是POST方法,而且请求头有X-Request-Id属性,且值为数值才会匹配

这篇关于Spring Cloud Gateway之Predicate断言详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/552768

相关文章

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带