目录

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: queryuri: http://www.czxy.compredicates:- 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: consumeruri: 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/123spring:cloud:gateway:routes:- id: PrefixPathuri: lb://service-consumerpredicates:- Path=/consumer/**filters:- StripPrefix=1- PrefixPath=/feign#feign  --> http://localhost:10010/consumer/echo/123

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

#rest --> http://localhost:10010/consumer/echo/123spring:cloud:gateway:routes:- id: RewritePathuri: lb://service-consumerpredicates:- 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-gatewaycloud: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-gatewaycloud: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的作用是什么?

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

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

  1. 微服务01SpringCloud Eureka Ribbon Nacos Feign Gateway服务网关

    微服务技术栈导学 SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.0.学 ...

  2. Spring cloud Gateway 服务网关 实战

    Spring cloud Gateway 服务网关 一.简介 优点: 特性: 总结: 二.核心概念 三.路由规则 1.Path 2.Query 3.Method 4.Datetime 5.Romote ...

  3. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  4. 【Spring Cloud Alibaba】Gateway 服务网关

    [Spring Cloud Alibaba]Gateway 服务网关 1 架构图 2 Predicate 断言 3 路由 3.1 静态路由 3.2 动态路由 3.3 Nacos 配置 4 过滤器 4. ...

  5. Spring Cloud入门-Gateway服务网关(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Gateway 简介 相关概念 创建 api-gateway模块 在pom.xml中添加相关依赖 两种不同的配置路由方式 使用yml配置 使用Ja ...

  6. SpringCloud Gateway 服务网关,过滤器

    SpringCloud Gateway 过滤器有 pre 和 post 两种方式,请求首先经过 pre 过滤器处理,成功后被转发到对应的服务,然后经过 post 过滤器处理,将结果返回客户端.这种机制 ...

  7. SpringCloud Gateway 服务网关,断言

    SpringCloud Gateway 是SpringCloud 生态系中的网关,不仅提供统一路由功能,通过 Filter 过滤链实现网关的基本功能,比如用户验证,鉴权,限流等功能.它使用非阻塞模式, ...

  8. SpringCloud - GateWay服务网关

    文章目录 一. Gateway概述 1.Gateway是什么 2. Gateway作用 3. 微服务架构中网关的位置 4. SpringCloud Gateway概念 5. SpringCloud G ...

  9. SpringCloud Gateway 服务网关,限流

    SpringCloud Gateway 提供了基于Redis 和lua脚本实现的令牌桶算法进行限流,即 RequestRateLimiterGatewayFilterFactory类,通过设置过滤器实 ...

最新文章

  1. hocon配置文件_GitHub - Himmelt/Hocon: Simple Hocon Configuration Library [轻量 Hocon 配置库]...
  2. C语言进制转换时自动扩展位?(原码、反码、补码)(打印%o、%x时会自动扩展到32位【负数先得到其十进制真实数值,再根据其真实数值得到八进制、十进制补码】)
  3. 查阅文献时向原作者发邮件要文献的简单模板
  4. .NET高级调试 | 通过JIT拦截无侵入调试 C# Emit 生成的动态代码
  5. 看似毫无规律的各种现象
  6. C++/C--删除string末尾字符的方法【转载】
  7. h5在Android里文字位置偏下,【CSS】如何解决安卓上按钮文字偏上的问题
  8. 关于python字符编码_关于python文件的字符编码
  9. wgs84坐标系拾取工具_百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具...
  10. ANSYS 2020R2 workbench汉化的方法
  11. 数据结构总结(线性结构,树型结构,图型结构,顺序结构,链式结构)
  12. Matplotlib绘图库入门(一):pyplot绘图基础
  13. Python测试习题
  14. 渗透测试 对头像上传漏洞检测与修复
  15. 线性代数学习笔记——第五十四讲——非齐次方程组解的性质
  16. JS如何阻止浏览器缓存
  17. 【摘录】Installing Openproj on Ubuntu
  18. 经典的蓝色CSS下拉菜单
  19. Redis 6.0 多线程重磅发布!来了解一下吧
  20. Matlab中绘制Bode图与单位阶跃响应图

热门文章

  1. 后端面试八股文骚套路之Java基础
  2. BIOS设置U盘启动为第一启动方式
  3. simulink永磁直驱风机PMSG联合飞轮储能或者电化学电池储能抑制风速波动导致的频率变化
  4. 云3.0时代,个性化的云服务将成主流
  5. php 把多维数组中,某值相同的项合并,重组数据(不用再愁postgres中无mysql中的group_concat()功能)
  6. C++实验6 改造实验5中的Player类、自行设计字符串类
  7. 复制pdf文字到word中产生的错误(遇到不会的催我更)+解决
  8. mac上idea断点调试的快捷键
  9. python微信红包_python 微信红包
  10. php lfi,LFI via SegmentFault