SpringCloud 组件Gateway服务网关【断言工厂过滤器工厂】

news2024/11/29 12:41:31

目录

1:断言工厂

2:过滤器工厂

2.1:路由过滤器的种类

2.2:请求头过滤器

2.3:默认过滤器

2.4:总结


1:断言工厂

路由断言工厂Route Predicate Factory

路由配置包括:

1. 路由id:路由的唯一标示

2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

3. 路由断言(predicates):路由断言,判断请求是否符合要求,符合则转发到路由目的地

4. 路由过滤器(filters):路由过滤器,请求或响应做处理

示例:

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

例如Path=/consumer/**是按照路径匹配的一种规则,这个规则是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来

处理的,像这样的断言工厂在SpringCloudGateway还有十几个:

名称说明示例
After是某个时间点后的请求- After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before是某个时间点之前的请求- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含某些cookie- Cookie=chocolate, ch.p
Header请求必须包含某些header- Header=X-Request-Id, \d+
Host请求必须是访问某个host(域名)- Host=.somehost.org,.anotherhost.org
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须符合指定规则- Path=/red/{segment},/blue/**
Query请求参数必须包含指定参数- Query=name, Jack或者- Query=name
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

在官方网站的示例中可以找到Spring Cloud Gateway 

像示例中的Path,用到的是官网中5.8的路由断言工厂的规则

演示一下5.1中的断言工厂中的After规则

示例1:在2031年之后可访问,那当前时间肯定是不符合时间规则,所以无法通过判断进行了路由跳转,找不到报错404

        predicates:                      #断言,也就是判断请求是否复合路由规则的条件
          - Path=/consumer/**            #这个是按照路径匹配,只要以/consumer/开头就符合要求
          - After=2031-01-20T17:42:47.789-07:00[Asia/Shanghai]

 

演示一下5.2中的断言工厂中的Before规则

示例2:在2031年之前可访问,那当前时间是符合时间规则,即可通过路由的跳转

 示例3:通过请求参数匹配

spring:
  cloud:
    gateway:
      routes:
        - id: query
          uri: http://www.czxy.com
          predicates:
            - Query=my,123
#访问路径,有参数my将转发到www.czxy.com
http://localhost:10010/?my=123

PredicateFactory的作用是什么呢?

断言工厂,读取配置中使用的是哪种断言工厂的规则,而后解析成对应的条件,将来请求进来了进行判断!

Path=/user/**是什么含义呢?

 判断请求路径是否为user开头的规则条件,只要符合user开头就是符合了条件!

注意:

  • 各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。

  • 一个请求满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发

2:过滤器工厂

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

 

 

  • 路由过滤器允许以某种方式修改传入的HTTP请求或传出HTTP响应。对请求或者响应进行增强

2.1:路由过滤器的种类

链接:spring

Spring提供了31种不同的路由过滤器工厂,可到官网查看。例如:

 

过滤规则实例说明
PrefixPath- PrefixPath=/app对所有的请求路径添加前缀app
RedirectTo- RedirectTo=302, 首页 - 传智专修学院重定向,配置包含重定向的返回码和地址
RemoveRequestHeader- RemoveRequestHeader=X-Request-Foo去掉某个请求头信息
RemoveResponseHeade- RemoveResponseHeader=X-Request-Foo去掉某个响应头信息
RemoveRequestParameter- RemoveRequestParameter=red去掉某个请求参数信息
RewritePath- RewritePath=/where(?<segment>/?.), /test(?<segment>/?.)改写路径 /where/... 改成 /test/...
SetPath- SetPath=/{segment}设置请求路径,与RewritePath类似
SetRequestHeader- SetRequestHeader=X-Request-Red, Blue设置请求头信息
SetStatus- SetStatus=401设置响应状态码
StripPrefix- StripPrefix=2跳过指定路径
RequestSize- name: RequestSize args: maxSize: 5000000请求大小

实例1:跳过指定路径(yml文件配置方法)

spring:
  cloud:
    gateway:
      routes:
        - id: consumer
          uri: lb://service-consumer  
          predicates:
            - Path=/consumer/**       
          filters:
            - StripPrefix=1

 实例2:添加前缀(yml文件配置方法)

#rest  --> http://localhost:10010/consumer/echo/123
#fegin --> http://localhost:10010/consumer/feign/echo/123

spring:
  cloud:
    gateway:
      routes:
        - id: PrefixPath
          uri: lb://service-consumer
          predicates:
            - Path=/consumer/**
          filters:
            - StripPrefix=1
            - PrefixPath=/feign

#feign  --> http://localhost:10010/consumer/echo/123

实例3:改写路径(yml文件配置方法)

#rest --> http://localhost:10010/consumer/echo/123

spring:
  cloud:
    gateway:
      routes:
        - id: RewritePath
          uri: lb://service-consumer
          predicates:
            - Path=/consumer/**
          filters:
            - RewritePath=/consumer(?<segment>/?.*), $\{segment}

# 正则表达式详解:

# ?<segment> --> 名称为 segment 的组
# /?		 --> /出现0次或1次
# .*		 --> 任意字符出现0次或多次
# 总结:将 /?.*匹配到的结果捕获到名称为segment的组中

# $\{segment} --> 将名称为 segment 的分组捕获到的文本置换到此处
## 注意,\的出现是由于避免 yaml 语法认为这是一个变量

2.2:请求头过滤器(示例官网过滤器工厂6.1程序演示)

下面我们以AddRequestHeader 为例。

需求:给所有进入service-consumer的请求添加一个请求头:Truth=I can succeed

只需要修改gateway服务的application.yml文件,添加路由过滤即可:

#端口号
server:
  port: 10010
spring:
  application:
    name: test-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   #nacos服务地址
    gateway:
      routes:   # 网关路由配置
      - id: consumer                  #自定义,路由id,只要唯一即可
        uri: lb://service-consumer     #访问路径,路由的目标地址 lb是负载均衡,后面跟着服务名称
        predicates:                      #断言,也就是判断请求是否复合路由规则的条件
          - Path=/consumer/**            #这个是按照路径匹配,只要以/consumer/开头就符合要求
          - Before=2031-01-20T17:42:47.789-07:00[Asia/Shanghai]
        filters:                      #过滤器
          - AddRequestHeader=qx,I can succeed ! #添加请求头
          - StripPrefix=1  #跳过前缀进行访问,这里即使把请求参数中consumer跳过,发送请求

 编写controller测试方法用来测试请求头中是否携带

@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 测试过滤器工程,添加请求头
     * @param
     * @return
     */
    @GetMapping("/test")
    public String test(@RequestHeader("qx") String qx){
        return qx;
    }

 

当前过滤器写在service-consumer服务路由下,因此仅仅对访问service-consumer的请求有效。

2.3:默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

#端口号
server:
  port: 10010
spring:
  application:
    name: test-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   #nacos服务地址
    gateway:
      routes:   # 网关路由配置
      - id: consumer                  #自定义,路由id,只要唯一即可
        uri: lb://service-consumer     #访问路径,路由的目标地址 lb是负载均衡,后面跟着服务名称
        predicates:                      #断言,也就是判断请求是否复合路由规则的条件
          - Path=/consumer/**            #这个是按照路径匹配,只要以/consumer/开头就符合要求
          - Before=2031-01-20T17:42:47.789-07:00[Asia/Shanghai]
      default-filters: # 默认过滤项
          - AddRequestHeader=qx,I can succeed ! #添加请求头

2.4:总结

过滤器的作用是什么?

① 对路由的请求或响应做加工处理,比如添加请求头

② 配置在路由下的过滤器只对当前路由的请求生效

defaultFilters的作用是什么?

① 对所有路由都生效的过滤器

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

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

相关文章

C++_串口编程_官方示例:监视通信事件

这是微软官方的一个例子&#xff0c;这个例子中&#xff0c;如果不做修改&#xff0c;那么他是可以异步运行的&#xff0c;会出现一个错误&#xff1a;官方也说了一下&#xff0c;但是不太好懂&#xff0c;我拷贝过来放在这里&#xff0c;作为参考。 如果无法立即完成重叠的操作…

1_MyBatis入门

原生JDBC实现CURD的问题 1 编码繁琐 2 需要我们自己将结果集映射成对象 3 性能不太好 连接池 缓存 4 SQL语句和java代码的耦合度特别高 5 … … MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code&#xff0c;且改名为…

python学习笔记(10)

目录 第八章 函数 1.模块化程序设计&#xff08;模块化---封装、复用、可替代&#xff09; 2.定义函数 3.函数调用 4.return语句 5.函数参数 6.变量作用域 7.函数的递归调用 8.匿名函数 9.迭代器 10.生成器 11.装饰器 第八章 函数 1.模块化程序设计&#xff08;…

【线性表】—不带头单向非循环链表的增删查改

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…

dns网络服务器未响应是什么原因(如果各自方法都尝试后无法使用,请尝试重启猫)

事件起因&#xff1a;周六晚上&#xff0c;看法国对丹麦世界杯&#xff0c;突然网页浏览器无法工作。 1.然后尝试修改dns路由修改为114.114.114.114&#xff0c;又还原system32/driver/hosts仍然无法使用 2.查看是否有浏览器代理&#xff0c;查询无 3.查看是否有可疑进程&…

游戏开发24课 cocoscreator scrollview优化

分享一个 ScrollView 优化组件 增加一个 在线演示地址 显得高大上一点 image.png32762116 263 KB 目前支持的功能 水平/垂直滑动 可变尺寸动态更新 平滑滚动到底部 Grid 正序排列、倒序排列 无限循环滚动 单向、双向 下拉刷新 &#xff08;只是这么叫 实际上就是两种类型…

深度学习第四课——卷积神经网络(week 2)

目录 二、深度卷积网路 2.1 经典网络结构 2.1.1 LeNet - 5 2.1.2 AlexNet 2.1.3 VGG - 16 2.2 残差网络&#xff08;ResNets - Residual Networks&#xff09; 2.3 残差网络为什么有用 2.4 网络中的网络及11卷积 2.5 Inception网络 2.5.1 介绍 2.5.2 应用 2.6 使用…

24. [Python GUI] PyQt5中的模型与视图框架-表格部件QTableWidget

PyQt5的表格部件QTableWidget QTableWidget 类继承自 QTableView&#xff0c;该类是一个由 Qt 实现的标准的表格部件&#xff0c;该类的数据项由 QTableWidgetItem 类管理。 当前单元格(或当前项目)与当前索引或当前选择是相同的&#xff0c;即可以同时选择多个单元格&#x…

Spark 3.0 - 7.LR 多分类实现影评预测电影评分与指标评测

目录 一.引言 二.LR 多分类分析 三.LR 多分类实战 1.数据准备 Comment -> RDD -> DF 2.数据处理 JieBaTokenizer -> HashingVector 3.模型训练 LR 4.模型评估 Metrics 5.人工校验 DIY 四.总结 一.引言 Spark 3.0 - 5.ML Pipeline 实战之电影影评情感分析 通…

浅析数据采集工具Flume

title: Flume系列 第一章 Flume基础理论 1.1 数据收集工具产生背景 Hadoop 业务的一般整体开发流程&#xff1a; 任何完整的大数据平台&#xff0c;一般都会包括以下的基本处理过程&#xff1a; 数据采集 数据 ETL 数据存储 数据计算/分析 数据展现 其中&#xff0c;数据…

Nacos注册中心和服务方式

目录 一、服务治理介绍 常见的注册中心 二、Nacos注册中心介绍 三、运用Nacos搭建环境 四、DiscoveryClient实现负载均衡 五、Ribbon实现负载均衡 六、基于Feign实现服务调用 七、Feign传参 一、服务治理介绍 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调…

【Android +Tensroflow Lite】实现从基于机器学习语音中识别指令讲解及实战(超详细 附源码)

需要源码和配置文件请点赞关注收藏后评论区留言~~~ 一、基于机器学习的语音推断 Tensorflow基于分层和模块化的设计思想&#xff0c;整个框架以C语言的编程接口为界&#xff0c;分为前端和后端两大部分 Tensorflow框架结构如下图 二、Tensorflow Lite简介 虽然Tensorflow是一…

WMS类图结构分析-android12

为什么要分析类图&#xff1f; WMS是一个复杂的模块&#xff0c;就像一个很大的家族&#xff0c;里面有各种角色&#xff0c;认识类图就像是认识WMS模块中的各个角色&#xff0c;不先把人认清楚了&#xff0c;怎么更好的理解他们之间的交互&#xff1f; 我觉得&#xff0c;这…

【MATLAB教程案例47】基于双目相机拍摄图像的三维重建matlab仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 本课程学习成果预览: 目录 1.软件版本 2.基于双目相机拍摄图像的三维重建原理概述

GII全球创新指数2013-2020

1、数据来源&#xff1a;世界知识产权组织发布的《2021年全球创新指数报告》 2、时间跨度&#xff1a;2013-2020 3、区域范围&#xff1a;全球 4、指标说明&#xff1a; 全球创新指数&#xff08;Global Innovation Index&#xff0c;GII&#xff09;是世界知识产权组织、康…

20221127-1Spring_day01(资料来自黑马程序)

Spring_day01 今日目标 掌握Spring相关概念完成IOC/DI的入门案例编写掌握IOC的相关配置与使用掌握DI的相关配置与使用 1&#xff0c;课程介绍 对于一门新技术&#xff0c;我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring来说: 1.1 为什么要学? …

Reactive UI -- 反应式编程UI框架入门学习(一)

反应式编程 反应式编程是一种相对于命令式的编程范式&#xff0c;由函数式的组合声明来构建异步数据流。要理解这个概念&#xff0c;可以简单的借助Excel中的单元格函数。 上图中&#xff0c;A1B1C1&#xff0c;无论B1和C1中的数据怎么变化&#xff0c;A1中的值都会自动变化&a…

Kafka - 08 Kafka Broker工作流程 | 节点服役 | 节点退役

文章目录1. Kafka Broker 工作流程2. Kafka 节点服役1. 增加一个Kafka节点2. 执行负载均衡操作3. Kafka 节点退役1. Kafka Broker 工作流程 Kafka上下线时Zookeeper中的数据变化&#xff1a; [zk: localhost:2181(CONNECTED) 9] ls / [zookeeper, kafka_cluster][zk: localhost…

使用nw.js快速开发一个基于浏览器的小型桌面端(适用于高校学生实验作业)

首先讲下退坑事项&#xff0c;节约读者时间 生成的exe会依赖SDK文件夹下的一些dll&#xff0c;所以不能简单的交付这个exe&#xff0c;需要使用额外的软件进行打包&#xff0c;如Enigma Virtual Box、inno setup自定义可执行文件的icon也要额外软件&#xff0c;如Resource Hac…

SCDM 实例教程:基本几何建模

作者 | 张杨 ANSYS SpaceClaim Direct Modeler&#xff08;简称 SCDM&#xff09;是基于直接建模思想的新一代3D建模和几何处理软件。SCDM可以显著地缩短产品设计周期&#xff0c;大幅提升CAE分析的模型处理质量和效率&#xff0c;为用户带来全新的产品设计体验。 本文将主要…