【深入解析spring cloud gateway】02 网关路由断言

一、断言(Predicate)的意义

断言是路由配置的一部分,当断言条件满足,即执行Filter的逻辑,如下例所示

spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgpredicates:- Path=/red/{segment}filters:- AddRequestHeader=X-Request-Red, Blue-{segment}

当请求路径满足条件/red/,即添加头信息:X-Request-Red,value为Blue-{segment},segment是路径里面带的信息。

gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分

Route(路由)路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
Predicate(谓语、断言)路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式
Filter(过滤器)过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容

其中Route和Predicate必须同时申明
在这里插入图片描述

以下内容,来自于SpringCloud Gateway官网,经过整理得来。

二、配置路由断言

注意:以下的配置,只写了routes配置的predicates的部分,实际上,predicates单独用没有意义,一般要配置filter来用。如上面的添加头信息的示例。

1.1 简写配置

由过滤器名称,后跟等号,后跟逗号分割的参数值

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- Cookie=mycookie,mycookievalue

1.2 展开的写法

spring:cloud:gateway:routes:- id: test_cookieuri: https://example.orgpredicates:- name: Cookieargs:name: mycookieregexp: mycookievalue

以上两个写法,效果是一样的。
问题1:展开的predicates的展开写法为什么是这么写?
原因是,这个配置对应的配置类是这么写的
在这里插入图片描述

问题2:name:Cookie是怎么来的?
根据类名来的,CookieRoutePredicateFactory,取的Cookie前缀,还有很多断言工厂,如下:
在这里插入图片描述

问题3:为啥args下面是name和regexp?
在这里插入图片描述

三、路由断言工厂示例

Spring Cloud Gateway 路由匹配作为Spring WebFlux HandlerMapping 基础设施的一部分。Spring Cloud Gateway内置了很多路由断言工厂。用于匹配HTTP请求的不同属性。
注意:以下的配置,只写了routes配置的predicates的部分,实际上,predicates单独用没有意义,一般要配置filter来用。如上面的添加头信息的示例。

2.1 The After Route Predicate Factory

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

匹配2017-01-20T17:42:47.789-07:00之后的请求

2.2 The Before Route Predicate Factory

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

匹配2017-01-20T17:42:47.789-07:00之前的请求

2.3 The Between Route Predicate Factory

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

表示在第一个时间之后,第二个时间之前的请求才能正确匹配路由

2.4 The Cookie Route Predicate Factory

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

接收两个参数,分别为name 和 regexp(Java正则表达式),表示cookie中携带的name值满足正则表达式regexp,则被路由

2.5 The Header Route Predicate Factory

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

接收两个参数,header 和 regexp(Java正则表达式),表示header中携带的name值满足正则表达式regexp,则被路由

2.6 The Host Route Predicate Factory

spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org

支持URI模板变量(如{sub}.myhost.org)。当Host 头的值为 www.somehost.org 或 beta.somehost.org 或 www.anotherhost.org 都能匹配该路由。
Predicate 会提取URI模板变量作为map集合,并放置在 ServerWebExchange.getAttributes() 中,key定义为 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE ,这些值能在 GatewayFilter工厂中使用。

2.7 The Method Route Predicate Factory

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

上面示例表示匹配 GET ,POST请求

2.8 The Path Route Predicate Factory

spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:- Path=/red/{segment},/blue/{segment}

如果请求地址是 /red/1 或 /red/1/ 或 /red/blue 或 /blue/green ,那么路由将会被匹配。
如果 matchTrailingSlash 设置为 false ,那么 /red/1/ 不会被匹配。
Predicate 会提取URI模板变量作为map集合,并放置在 ServerWebExchange.getAttributes() 中,key定义
为 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE ,这些值能在 GatewayFilter 工厂中使用。
可以使用个实用法(调用get)来简化对这些变量的访问。下面的例示展示了如何使用get方法:

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);String segment = uriVariables.get("segment");

2.9 The Query Route Predicate Factory

spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=green

接收两个参数,分别是一个必须的param和一个可选的regexp。

spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=red, gree.

red和gree两个参数都有才满足

2.10 The RemoteAddr Route Predicate Factory

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

接收⼀个sources列表(最小1个),CIDR表示法(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是
⼀个IP地址,16是⼀个⼦网掩码)。
如果请求的远程地址是 192.168.1.10 ,则此路由被匹配

2.11 The Weight Route Predicate Factory

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

将有80%的流量被路由到 weighthigh.org ,20%的流量被路由到 weightlow.org 。

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

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

相关文章

回归拟合 | 灰狼算法优化核极限学习机(GWO-KELM)MATLAB实现

这周有粉丝私信想让我出一期GWO-KELM的文章&#xff0c;因此乘着今天休息就更新了(希望不算晚) 作者在前面的文章中介绍了ELM和KELM的原理及其实现&#xff0c;ELM具有训练速度快、复杂度低、克服了传统梯度算法的局部极小、过拟合和学习率的选择不合适等优点&#xff0c;而KEL…

Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类GO 语言当中 NEW 和 MAKE 有什么区别吗&#xff1f;PRINTF(),SPRINTF(),FPRINTF() 都是格式化输出&#xff0c;有什么不同&#xff1f;GO 语言当中数组和切片的区别是什么&#xf…

自学Python01-创建文件写入内容

此处省去安装和前言&#xff0c;需要两个东西 一个去下载安装python官方库 Welcome to Python.org 一个是编译器pycharm PyCharm 安装教程&#xff08;Windows&#xff09; | 菜鸟教程 PyCharm: the Python IDE for Professional Developers by JetBrains 第一节 练习print…

讲清楚两个简单的概念之进程、线程

前言 话不多说&#xff0c;先来张思维脑图~~ 进程与线程的关系并行与并发进程与线程的上下文切换 进程与线程的关系 什么是进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后就会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xf…

PhpStorm安装篇

PhpStorm安装篇: 下载地址 : 进入官网下PhpStorm: PHP IDE and Code Editor from JetBrains 下载完之后&#xff0c;安装包 安装目录建议不要放C盘&#xff0c;放其他盘&#xff0c;其他直接一直点 next &#xff0c;到结束 安装完&#xff0c;打开编辑器 注册账号并登录后…

vue3项目导入异常Error: @vitejs/PLUGIN-vue requires vue (>=3.2.13)

vue3项目导入异常 1、异常提示如下&#xff1a; failed TO LOAD config FROM D:\ws-projects\vite.co nfig.js error WHEN STARTING dev SERVER: Error: vitejs/PLUGIN-vue requires vue (>3.2.13) OR vue/compiler-sfc TO be pre sent IN the dependency tree.2、解决办法…

conda和Python的虚拟环境如何结合使用,以及二者之间到底有什么区别?

问题描述 今天在复现streamlit的代码时&#xff08;参考Streamlit 讲解专栏&#xff08;一&#xff09;&#xff1a;安装以及初步应用&#xff09;&#xff0c;根据这篇博文指导&#xff0c;要先用以下指令创建一个虚拟环境&#xff1a; # 创建虚拟环境&#xff08;使用venv&a…

python3.11教程2:基础数据类型(数字和字符串)、组合数据类型(集合、元组、列表、字典)

文章目录 五、基本数据类型5.1 整数和浮点数5.1.1 整数和浮点数的类型5.1.2 进制和进制转换5.1.3 round函数 5.2 运算符5.2.1 常用运算符、运算符函数和逻辑运算符5.2.2 位运算符5.2.3 运算符的优先级及其进阶使用5.2.4 海象运算符: 5.3 布尔类型5.4 字符串5.4.1 字符串的基本操…

【SpringSecurity】八、集成图片验证码

文章目录 1、生成图片验证码2、创建验证码过滤器3、将过滤器加入SpringSecurity过滤链4、修改登录页 SpringSecurity是通过过滤器链来完成的&#xff0c;接下来的验证码&#xff0c;可以尝试创建一个过滤器放到Security的过滤器链中&#xff0c;在自定义的过滤器中比较验证码。…

docker快速安装-docker一键安装脚本

1.下载/配置安装脚本 touch install-docker.sh #!/bin/bash #mail:ratelcloudqq.com #system:centos7 #integration: docker-latestclear echo "######################################################" echo "# Auto Install Docker …

OJ练习第164题——具有所有最深节点的最小子树

具有所有最深节点的最小子树 力扣链接&#xff1a;865. 具有所有最深节点的最小子树 力扣链接&#xff1a;1123. 最深叶节点的最近公共祖先 题目描述 给定一个根为 root 的二叉树&#xff0c;每个节点的深度是 该节点到根的最短距离 。 返回包含原始树中所有 最深节点 的…

PEX装机

目录 一、PXE是什么&#xff1f; 二、PXE的组件&#xff1a; vsftpd/httpd/nfs tftp dhcp 三、配置vsftpd 四、配置tftp 1.安装tftp-server 2.启动tftp 五、准备pxelinx.0文件、引导文件、内核文件 1.准备pxelinux.0文件 2.准备引导文件、内核文件 六、配置dhcp …

爬楼梯【动态规划】

爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; class Solution {public int climbStairs(int n) {if (n < 2) return n;//特殊情况处理int dp[] new int[n 1];dp[1] 1;//因为数组索…

java面试之ThreadLocal问题

什么是ThreadLocal,它的基本用法是什么 简单来说就是能在多线程中保持变量独立的线程对象 不用Threadlocal多线程访问同一个变量会出现的问题 package com.pxx;/*** Created by Administrator on 2023/9/3.*/ public class Demo1 {private String v1;public String getV1() …

非科班菜鸡算法学习记录 | 代码随想录算法训练营第57天|| 647. 回文子串 516.最长回文子序列 动态规划总结篇

647. 回文子串 知识点&#xff1a;动规 状态&#xff1a;看思路自己写 思路&#xff1a; dp不好想&#xff0c;dp[i][j] 是指左闭右闭时&#xff0c;是否为回文,bool类型&#xff1b; 注意递归公式和遍历顺序 class Solution { public:int countSubstrings(string s) {int …

音频——I2S TDM 模式(六)

I2S 基本概念飞利浦(I2S)标准模式左(MSB)对齐标准模式右(LSB)对齐标准模式DSP 模式TDM 模式 文章目录 TDM formatTDM format ATDM format BTDM format C总结 TDM format TDM 一般有三种常用操作模式&#xff1a;TDM A mode &#xff0c;TDM B mode 和 TDM C mode&#xff0c; …

【算法系列篇】模拟算法

文章目录 前言1.替换所有问号1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 提莫攻击2.1 题目要求2.2 做题思路2.3 Java代码实现 3. N 字形变换3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 外观数列4.1 题目要求4.2 做题思路4.3 Java代码实现 5. 数青蛙5.1 题目要求5.2 做题思…

安防监控/视频存储/视频汇聚平台EasyCVR如何接入智能分析网关V4?

TSINGSEE青犀AI边缘计算网关硬件 —— 智能分析网关目前有5个版本&#xff1a;V1、V2、V3、V4、V5&#xff0c;每个版本都能实现对监控视频的智能识别和分析&#xff0c;支持抓拍、记录、告警等&#xff0c;每个版本在算法模型及性能配置上略有不同。硬件可实现的AI检测包括&am…

VMware虚拟机安装CentOS7设置静态ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33修改BOOTPROTO的值为static 增加最后那四项&#xff0c;参数在编辑&#xff0c;虚拟网络编辑器里面看

如何远程访问Linux MeterSphere一站式开源持续测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…