一、概述

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,即保留第一个头

  1. RETAIN_FIRST:保留第一个值
  2. RETAIN_LAST:保留最后一个值
  3. 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 参数中。

  1. fromHeader 在 header 中不存在,那么没有什么影响。
  2. fromHeader 存在
  3.  toHeader 存在,那么往配置中 toHeader 对应的 header 中追加 fromHeader对应的值
    
  4. 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 的值,比如我们所有的经过网关的服务,到达下游服务时,都需要将 用户当前的用户名和数据权限传递下去,此时就可以使用这个。

需求:

修改原始服务的参数,增加usernameroles参数传递到下游服务。

路由配置,只可通过 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 过滤器详解相关推荐

  1. Spring Cloud Gateway配置详解-过滤器

    Spring Cloud Gateway-过滤器 本节将为大家详细介绍Spring Could Gateway 内置过滤器相关内容. Spring Cloud Gateway 过滤器为大家提供了修改特 ...

  2. 微服务网关spring cloud gateway入门详解

    1.API网关 API 网关是一个处于应用程序或服务( REST API 接口服务)之前的系统,用来管理授权.访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的 ...

  3. Spring Cloud限流详解(附源码)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

  4. Spring Cloud限流详解(内含源码)

    为什么80%的码农都做不了架构师?>>>    原文:http://www.itmuch.com/spring-cloud-sum/spring-cloud-ratelimit/ 在 ...

  5. Spring Cloud Gateway 过滤器执行顺序原理分析

    过滤器类型 GlobalFilter:全局过滤器,对所有路由生效.通过实现GlobalFilter接口创建 GatewayFilter:网关过滤器,也可以说是局部过滤器.自定义过滤器,只对配置了此过滤 ...

  6. Spring Cloud Feign使用详解

     通过前面两章对Spring Cloud Ribbon和Spring Cloud Hystrix的介绍,我们已经掌握了开发微服务应用时,两个重要武器,学会了如何在微服务架构中实现客户端负载均衡的服务调 ...

  7. spring cloud各组件详解

    一,Eureka 服务注册中心,特性有失效剔除.服务保护.健康检查. 二.Ribbon 客户端负载均衡,特性有区域亲和.重试机制. 三.Hystrix 客户端容错保护,特性有服务降级.服务熔断.请求缓 ...

  8. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解

    构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...

  9. Spring Cloud Feign原理详解

    目录 1.什么是Feign? 2.Open Feign vs Spring Cloud Feign 2.1.OpenFeign 2.2.Spring Cloud Open Feign 3.Spring ...

最新文章

  1. 从零开始在ubuntu上安装和使用k8s集群及报错解决
  2. linux基础(8)-颜色显示
  3. 谷歌李飞飞:我们依旧站在人工智能研究的起点
  4. Springmvc ajax请求400
  5. SNMP在企业网中应用
  6. HailStone序列
  7. 在VC中如何使用OCX控件 【来源:http://blog.csdn.net/wulang1114/article/details/4806089】
  8. ORACLE 外部表的简单使用
  9. javaweb学习总结(二十三):jsp自定义标签开发入门
  10. 项目复审——Beta阶段
  11. Comet OJ - Contest #11 题解赛后总结
  12. 3D版pix2pix来了,画一只猫就能抱起来吸丨github
  13. 【体系结构】Oracle段区块的个人理解
  14. Linux目录/usr/bin和 /usr/local/bin区别
  15. rpa打开浏览器_免费开源RPA财务机器人Taskt入门
  16. jdk优先级队列是如何实现的
  17. 2020最新版本js车牌号检验规则
  18. 单片机用c语言怎么把i/o数据显示到lcd1602上,单片机lcd1602程序,通用型51单片机lcd1602驱动代码...
  19. sg90舵机c语言编程,浅谈用单片机控制SG90舵机(原理+编程)
  20. 每日三思:优化微信小程序中倒计时占内存较大(19-0612-1917)

热门文章

  1. 结合阿里图标实现3/4五角星书写 css
  2. 推荐三个很赞的英语学习网
  3. 互联网金融平台——银行交易明细查询和报警机制
  4. 高速HDI电路板的设计挑战
  5. python winapi_在Python中使用win32api检测按键
  6. 支撑掩护式液压支架总体及推移千斤顶设计(论文+CAD图纸)
  7. 力扣 1816. 截断句子
  8. 360 safe.php,360safe/360webscan.php · 漫步者/quguoren - Gitee.com
  9. 华为note8鸿蒙,华为荣耀NOTE8综合评测:性价比如何看完就知道了
  10. 更新丨同屏互动上线,提供高效VR实时互动沟通平台!