Spring Cloud Gateway 过滤器详解
一、概述
Spring Cloud Gateway根据作用范围划分为:GatewayFilter和GlobalFilter
1、filter的作用和生命周期
由filter工作流程点,可以知道filter有着非常重要的作用,在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等
作用
网关过滤器用于拦截并链式处理Web请求,可以实现横切与应用无关的需求,比如:鉴权、限流、日志输出等
生命周期
Spring Cloud Gateway同zuul类似,有“pre”和“post”两种方式的filter。客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,比如上图中的user-service,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。filter从作用范围可分为另外两种,一种是针对于单个路由的gateway filter,它在配置文件中的写法同predict类似;另外一种是针对于所有路由的global gateway filer
二、网关过滤器 GatewayFilter
过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。过滤器可以限定作用在某些特定请求路径上。可以实现横切与应用无关的需求,比如:安全、访问超时的设置等。修改传入的HTTP请求或传出HTTP响应。Spring Cloud Gateway 包含许多内置的网关过滤器工厂,一共22个。包括头部过滤器、路径过滤器、Hystrix过滤器和重写请求URL的过滤器,还有参数和状态码等其他类型的过滤器。根据过滤器工程的用途来划分,可以分为以下几种:Header、Parameter、Path、Body、Status、Session、Redirect、Retry、RateLimiter 和 Hystrix。 Spring Cloud Gateway包含许多内置的GatewayFilter工厂。
GatewayFilter工厂同上一篇介绍的Predicate工厂类似,都是在配置文件application.yml中配置,遵循了约定大于配置的思想,只需要在配置文件配置GatewayFilter Factory的名称,而不需要写全部的类名,比如AddRequestHeaderGatewayFilterFactory只需要在配置文件中写AddRequestHeader,而不是全部类名。在配置文件中配置的GatewayFilter Factory最终都会相应的过滤器工厂类处理。
1、AddRequestHeader
描述
1、用于向下游服务 添加
请求头,
2、支持 uri variables
参数
1、name
:向下游服务传递请求头的 key
2、value
:向下游服务传递请求头的 value
示例
1、方式一、添加一个固定的请求头
spring:cloud:nacos:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- AddRequestHeader=x-token,xxxxx
表示会向下游服务传递一个 x-token
的请求头,值是 xxxxx
2、配合 uri variables 添加动态请求头
spring:cloud:gateway:routes:- id: product-provider-02uri: lb://product-providerpredicates:- Path=/product/findOne/{productId}filters:- AddRequestHeader=x-token,xxxxx-{productId}
表示会向下游服务传递一个 x-token
的请求头,值是 xxxxx-匹配上的productId的值
2、AddRequestParameter
描述
用于向下游服务 添加一个请求参数
参数
name
:添加的参数 key
value
:添加的参数 value,可以支持 Path或Host 中的 uri variables
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- AddRequestParameter=username,zhangsan
向下游服务增加一个 username
= zhangsan
的请求参数
3、AddResponseHeader
描述
向下游的响应中增加一个 响应头。
参数
1、name
:添加的响应头的 key
2、value
:添加的响应头的 value,可以支持 Path或Host 中的 uri variables
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- AddResponseHeader=encryption,false
向下游服务响应增加一个 encryption
= false
的响应头
4、DedupeResponseHeader
描述
移除重复的请求头
参数
1、name
:需要移除的重复的响应头,多个以 空格
分隔
2、strategy
:重复时,移除的策略,默认是RETAIN_FIRST
,即保留第一个头
- RETAIN_FIRST:保留第一个值
- RETAIN_LAST:保留最后一个值
- RETAIN_UNIQUE:保留所有的不重复的值
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- DedupeResponseHeader=x-token Access-Control-Allow-Credentials Access-Control-Allow-Origin,RETAIN_FIRST
移除上方指定的重复的响应头,并且保留第一个出现的。
5、MapRequestHeader
描述
将 fromHeader
参数的值 追加到 toHeader
参数中。
- fromHeader 在 header 中不存在,那么没有什么影响。
- fromHeader 存在
toHeader 存在,那么往配置中 toHeader 对应的 header 中追加 fromHeader对应的值
toHeader 不存在,那么往 header 中增加一个header ,key: 配置中的toHeader的值,value: fromHeader 在header中的值
参数
1、fromHeader
:从请求参数中获取header
的值
2、toHeader
:向header
中设置一个 header, key是toheader的值,value 是 fromHeader的值
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- MapRequestHeader=from-header,x-token
即会向 request 中增加一个 key 为 x-token
的header ,值为 header 中 from-header
对应的值。(存在多种情况,参考描述)
6、Prefix
描述
为匹配到的路由,在转发到下游服务时,增加一个前缀prefix
参数
1、prefix
:需要增加的路径前缀
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/findOnefilters:- PrefixPath=/product
访问 http://网关ip:port/findOne ⇒ 转发到下游服务地址 http://product-provider/product
/findOne 增加了一个前缀。
7、PreserveHostHeader
描述
它表示在Spring Cloud Gateway转发请求的时候,保持客户端的Host
信息不变,然后将它传递到下游服务器中。
参数
没有参数
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- PreserveHostHeader
8、RemoveRequestHeader
描述
移除请求头中的参数
参数
1、name
:需要移除的请求头
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- RemoveRequestHeader=x-token
9、RemoveResponseHeader
描述
移除响应头
参数
1、name
:需要移除的响应头
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- RemoveResponseHeader=x-token
9、RemoveRequestParameter
描述
移除请求参数,往下游服务传递时,此参数就没有来
参数
1、name
:需要移除的请求参数
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- RemoveRequestParameter=password
10、RewritePath
描述
根据正则表达式,执行路径重写
参数
1、regexp
:匹配的正则表达式
2、replacement
:需要替换成的字符串
注意:
1、在yml
配置中 $
需要写成 $\
2、路径替换规则是: path.replaceAll(regexp,replacement)
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/admin/product/findOnefilters:- RewritePath=/admin(?<segment>/?.*), $\{segment} # 当访问/admin/product/findOne 将会替换成 /product/findOne
页面上访问 /admin/product/findOne ⇒ 到达下游服务的路径是 /product/findOne
11、StripPrefix
描述
移除路径前缀,比如访问: /admin/aa/bb/cc 实际的下游服务器地址是 /bb/cc 则可以使用这个实现
参数
1、parts
:请求的路径按照/
分隔后,需要跳过的部分,从1开始。
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/admin/product/findOnefilters:- StripPrefix=1 # 当访问/admin/product/findOne 将会替换成 /product/findOne
页面上访问 /admin/product/findOne ⇒ 到达下游服务的路径是 /product/findOne
12、RequestSize
描述
配置请求体的大小,当请求体过大时,将会返回 413 Payload Too Large
。
参数
1、maxSize
:请求体的大小
示例
spring:cloud:gateway:routes:- id: product-provider-01uri: lb://product-providerpredicates:- Path=/product/findOnefilters:- name: RequestSizeargs:maxSize: 1B
此处需要通过 filters[index].args.maxSize
配置,否则不生效。
13、ModifyRequestBody
描述
修改传递到下游服务 RequestBody
的值,比如我们所有的经过网关的服务,到达下游服务时,都需要将 用户当前的用户名和数据权限传递下去,此时就可以使用这个。
需求:
修改原始服务的参数,增加username
和roles
参数传递到下游服务。
路由配置,只可通过 Java 代码来配置
@Configuration
public class RouteConfig {@Beanpublic RouteLocator routes(RouteLocatorBuilder builder) {return builder.routes().route("product-provider", predicateSpec -> predicateSpec.path("/product/modifyRequestBody").filters(gatewayFilterSpec -> gatewayFilterSpec.modifyRequestBody(String.class, Map.class, MediaType.APPLICATION_JSON_VALUE, (exchange, s) -> {Map<String, Object> params = new HashMap<>(16);params.put("old", s);params.put("username", "v_huan");params.put("roles", "ROLE_ADMIN");return Mono.just(params);})).uri("lb://product-provider")).build();}
}
三、全局过滤器
全局过滤器不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,它是请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。
当某个请求被路由匹配时,那么所有的全局过滤器(GlobalFilter)和路由匹配到的 GatewayFilter会组合成一个过滤器链,排序规则是通过 Spring 的 Ordered 来排序。
GlobalFilter有pre和post2个执行阶段,优先级越高 pre 阶段执行越早, post阶段执行越迟。
编写一个全局过滤器需要实现 GlobalFilter 接口
下面这些是Gateway内置的全局过滤器,已经在所有路由生效
Spring Cloud Gateway根据作用范围划分为GatewayFilter和GlobalFilter,二者区别如下:
- GatewayFilter : 需要通过spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过spring.cloud.default-filters配置在全局,作用在所有路由上
- GlobalFilter : 全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,系统初始化时加载,并作用在每个路由上。
欢迎来到Doker,欢迎点赞和评论!或者加微信进入技术群聊!
参考资料:https://www.jianshu.com/p/394e11981692 Spring Cloud Gateway
Spring Cloud Gateway 过滤器详解相关推荐
- Spring Cloud Gateway配置详解-过滤器
Spring Cloud Gateway-过滤器 本节将为大家详细介绍Spring Could Gateway 内置过滤器相关内容. Spring Cloud Gateway 过滤器为大家提供了修改特 ...
- 微服务网关spring cloud gateway入门详解
1.API网关 API 网关是一个处于应用程序或服务( REST API 接口服务)之前的系统,用来管理授权.访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的 ...
- Spring Cloud限流详解(附源码)
在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...
- Spring Cloud限流详解(内含源码)
为什么80%的码农都做不了架构师?>>> 原文:http://www.itmuch.com/spring-cloud-sum/spring-cloud-ratelimit/ 在 ...
- Spring Cloud Gateway 过滤器执行顺序原理分析
过滤器类型 GlobalFilter:全局过滤器,对所有路由生效.通过实现GlobalFilter接口创建 GatewayFilter:网关过滤器,也可以说是局部过滤器.自定义过滤器,只对配置了此过滤 ...
- Spring Cloud Feign使用详解
通过前面两章对Spring Cloud Ribbon和Spring Cloud Hystrix的介绍,我们已经掌握了开发微服务应用时,两个重要武器,学会了如何在微服务架构中实现客户端负载均衡的服务调 ...
- spring cloud各组件详解
一,Eureka 服务注册中心,特性有失效剔除.服务保护.健康检查. 二.Ribbon 客户端负载均衡,特性有区域亲和.重试机制. 三.Hystrix 客户端容错保护,特性有服务降级.服务熔断.请求缓 ...
- SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...
- Spring Cloud Feign原理详解
目录 1.什么是Feign? 2.Open Feign vs Spring Cloud Feign 2.1.OpenFeign 2.2.Spring Cloud Open Feign 3.Spring ...
最新文章
- 从零开始在ubuntu上安装和使用k8s集群及报错解决
- linux基础(8)-颜色显示
- 谷歌李飞飞:我们依旧站在人工智能研究的起点
- Springmvc ajax请求400
- SNMP在企业网中应用
- HailStone序列
- 在VC中如何使用OCX控件 【来源:http://blog.csdn.net/wulang1114/article/details/4806089】
- ORACLE 外部表的简单使用
- javaweb学习总结(二十三):jsp自定义标签开发入门
- 项目复审——Beta阶段
- Comet OJ - Contest #11 题解赛后总结
- 3D版pix2pix来了,画一只猫就能抱起来吸丨github
- 【体系结构】Oracle段区块的个人理解
- Linux目录/usr/bin和 /usr/local/bin区别
- rpa打开浏览器_免费开源RPA财务机器人Taskt入门
- jdk优先级队列是如何实现的
- 2020最新版本js车牌号检验规则
- 单片机用c语言怎么把i/o数据显示到lcd1602上,单片机lcd1602程序,通用型51单片机lcd1602驱动代码...
- sg90舵机c语言编程,浅谈用单片机控制SG90舵机(原理+编程)
- 每日三思:优化微信小程序中倒计时占内存较大(19-0612-1917)
热门文章
- 结合阿里图标实现3/4五角星书写 css
- 推荐三个很赞的英语学习网
- 互联网金融平台——银行交易明细查询和报警机制
- 高速HDI电路板的设计挑战
- python winapi_在Python中使用win32api检测按键
- 支撑掩护式液压支架总体及推移千斤顶设计(论文+CAD图纸)
- 力扣 1816. 截断句子
- 360 safe.php,360safe/360webscan.php · 漫步者/quguoren - Gitee.com
- 华为note8鸿蒙,华为荣耀NOTE8综合评测:性价比如何看完就知道了
- 更新丨同屏互动上线,提供高效VR实时互动沟通平台!