今天带大家看一下Spring Cloud Gateway的过滤器

过滤器分类

Spring Cloud Gateway根据作用范围划分为GatewayFilter和GlobalFilter,二者的区别如下GatewayFilter:网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上,也可以通过配置spring.cloud.default-filters让它作用于全局路由上。

GlobalFilter:全局过滤器,不需要再配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain能够识别的过滤器。

网关过滤器

网关过滤器用于拦截并链式处理web请求,可以实现横切与应用无关的需求,比如:安全、监控/埋点、限流访问超时设置、对请求和响应做出修改。Spring Cloud Gateway包含了许多内置的网关过滤器工厂,大概有30多个,具体用途大致可以分为以下几类Header过滤器

Parameter请求参数过滤器

Path路径过滤器

Body请求(响应)体过滤器

Status状态过滤器

Session会话过滤器

Redirect重定向过滤器

Retry重试过滤器

RateLimiter限流过滤器

Hystrix熔断过滤器。

如下图所示列出部分过滤器

接下来我们举例说明部分使用

Path路径过滤器

Path路径过滤器可以实现URL重写,通过重写URL可以实现隐藏实际路径提高安全性。

RewritePathGatewayFilterFactory

RewritePath网关过滤器工厂包括路径正则表达式参数和替换后的参数,使用正则表达式来灵活地重写请求路径。如下示例:spring: profiles: rewritePath cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api-gateway/**   # 匹配对应URL请求         filters:           - RewritePath=/api-gateway(?/?.*), $\{segment} # 路径重写, 如/api-gateway/product/重写为/product/1

将/api-gateway/**路径的所有请求重写为/**及去掉/api-gateway前缀发送给下游请求http://localhost:8892/api-gateway/product/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

PrefixPathGatewayFilterFactory

PrefixPath网关过滤器工厂可以在路径前统一增加前缀重写请求路径。如下示例:spring: profiles: prefixPath cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/**   # 匹配对应URL请求         filters:           - PrefixPath=/product # 在请求路径前统一增加product前缀, 如/1 重写为/product/1

将/product作为所有匹配请求的路径的前缀。因此,当请求/1将被重写为/product/1发送给下游。请求http://localhost:8892/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

StripPrefixGatewayFilterFactory

StripPrefix网关过滤器工厂可以从请求中分割掉部分路径。spring: profiles: stripPrefix cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/**   # 匹配对应URL请求         filters:           - StripPrefix=2 # 请求中分割掉前两部分路径, 如/abc/123/product/1 重写为/product/1

将请求中的前两个路径分割掉,因此,当请求/abc/123/product/1 重写为/product/1发动给下游。请求http://localhost:8892/abc/123/product/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

SetPathGatewayFilterFactory

setPath网关过滤器工厂采用路径模板参数,它提供了一种通过允许模板化路径来操作请求路径的简单方法,使用Spring Framework中的URI模板,允许多个匹配段spring: profiles: setPath cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api/{segment}   # 匹配对应URL请求,将匹配的请求追加到目标URI之后         filters:           - SetPath=/product/{segment} # 请求中分割掉部分路径, /api/1 重写为/product/1

对于请求路径/api/1,这会将路径设置为/product/1发出下游请求之前的路径请求http://localhost:8892/api/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

Parameter请求参数过滤器

AddRequestParameterGatewayFilterFactory

AddRequestParameter网关过滤器可以在请求中增加参数spring: profiles: addRequestParameter cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: lb://product-service  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api/{segment}   # 匹配对应URL请求,将匹配的请求追加到目标URI之后         filters:           - SetPath=/product/{segment} # 请求中分割掉部分路径, /api/1 重写为/product/1           - AddRequestParameter=flag, test  #在下游请求中增加flag参数值为test

修改下游product-service服务打印参数flag@RequestMapping("/{id}") public Product selectProductById(@PathVariable("id") Integer id, @RequestParam(value = "flag", required = false) String flag) {    log.info("flag的值为:{}", flag);    return service.selectProductById(id); }

请求http://localhost:8892/api/1 结果,flag结果为test

Status状态过滤器

SetStatusGatewayFilterFactory

修改响应状态码spring: profiles: setStatus cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: lb://product-service  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api/{segment}   # 匹配对应URL请求,将匹配的请求追加到目标URI之后         filters:           - SetPath=/product/{segment} # 请求中分割掉部分路径, /api/1 重写为/product/1           - SetStatus=404  #任何响应的HTTP状态将被设置为404

无论任何请求统一响应状态码为404

全局过滤器

全局过滤器不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它的请求业务以及路由的URI转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。

全局过滤器主要包括以下几个,如下图所示:

gateway中的局部过滤器_SpringCloud系列Gateway:过滤器总结相关推荐

  1. gateway中的局部过滤器_Spring Cloud Gateway中的过滤器工厂:重试过滤器

    Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新项目,该项目提供了一个构建在Spring 生态之上的API网关.本文基于的Spring Clou ...

  2. gateway中的局部过滤器_vue 过滤器

    vue 过滤器 1 关于 vue 过滤器 在vue1.0的时候其实是内置了过滤器的,但是考虑到好多过滤器并不一定会被开发所调用,所以把原本内置的过滤器就给去掉了,但是过滤器还是比较普遍的,所以我们从v ...

  3. Spring Cloud Gateway中session共享

    Spring Cloud Gateway中session共享 背景 在进行zuul切换到gateway时,需要重新实现session共享,本文主要分享一下自己实现的方案. zuul中的session共 ...

  4. spring cloud gateway中解决第一次请求失败的问题

    spring cloud gateway中解决第一次请求失败的问题 参考文章: (1)spring cloud gateway中解决第一次请求失败的问题 (2)https://www.cnblogs. ...

  5. Spring Cloud Gateway中异常处理

    Spring Cloud Gateway中异常处理 参考文章: (1)Spring Cloud Gateway中异常处理 (2)https://www.cnblogs.com/viaiu/p/1040 ...

  6. Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos /(非阿里组件))

    Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos)(非阿里组件) 回溯 Gateway 整合 nacos 方式一(复杂/灵活/常用) 方式 ...

  7. 大数据算法系列——布隆过滤器

    大数据算法系列--布隆过滤器 一.简介 Bloom filter介绍 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集 ...

  8. gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了

    前言 当我们的网关Gateway程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问,网关 ...

  9. java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序

    目录 #java中的构造方法 #构造方法简介 #构造方法实例 #例-1 #例-2 #java中的几种构造方法详解 #普通构造方法 #默认构造方法 #重载构造方法 #java子类构造方法调用父类构造方法 ...

  10. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)...

    ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) 原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过 ...

最新文章

  1. 循环冗余校验码CRC,求解步骤
  2. python 字典的值是列表_python实现求和python如何通过列表中字典的值对列表进行排序...
  3. Communications link failure
  4. 中国科学院计算机网络信息中心科学数据中心,中科院计算机网络信息中心发布系列可信共享科学数据公共服务...
  5. Scala数组和Java集合互转代码演示
  6. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第五章 课后答案
  7. Windows11安全中心打不开怎么办 Win11打不开安全中心解决方法
  8. Docker 安装 MongoDB教程
  9. 项目中AOP的使用-读写分离
  10. android bionic memcpy 汇编源码解析
  11. python爬虫下一页_Python爬虫怎么获取下一页的URL和网页内容?
  12. SPSS统计分析专题系列(一、认识SPSS)
  13. idea打包jar的多种方式(总结-共三种)
  14. php实现加密解密,PHP实现的加密解密处理类
  15. Kotlin基础2(持续更新)
  16. matlab矩阵按位取反,第二章matlab的理基本使用方法.ppt
  17. info setup 制作的安装程序 提示卸载程序出现内部错误找不到此版本的卸载程序的utCompiledCode记录
  18. 渗透测试 | UserInfo信息收集
  19. mysql通过字段值查询表名
  20. fm24c16c语言程序,单片机读写24C01~24C16程序

热门文章

  1. 用Python设置Excel样式
  2. ABP文档笔记 - 通知
  3. 安装office2007 1706错误
  4. 按关键字自动分类文件
  5. 拉卡拉服务器响应超时,拉卡拉传统POS机11个常见问题及解决方法
  6. 牛顿迭代法实现平方根函数
  7. 最强代码审查工具报告
  8. 浏览器存储cookie
  9. 按指定次数重复显示 Excel 单元格
  10. 转录组分析_20个必须知道的转录组知识点!