目录

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. lora发射和接收原理_四个要点,帮你搞定LoRa天线匹配电路
  2. C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针
  3. 雌性激素过高怎么办?
  4. 常用计算机网络技术缩写词和术语,网络技术缩写词和术语
  5. 设置DVWA出现Could not connect to the MySQL service. Please check the config的解决方法,默认登录账号
  6. Jquery Mobile 画面导航栏共用的实现方法
  7. Ubuntu下安装nginx支持rtmp和http流媒体方案
  8. Python3----- assert(断言)
  9. [剑指offer] 7. 斐波那契数列 (递归 时间复杂度)
  10. bzoj1814: Ural 1519 Formula 1 动态规划 插头dp
  11. (转载)黑白帽子思路
  12. 中景园0.96寸 OLED 显示屏 学习笔记
  13. 在java中获取全年的节假日(包含周末和法定节假日及调休日)
  14. 爱心的数学函数方程_数学里有哪些可以示爱的图像?它们的函数方程又是什么?...
  15. build constraints exclude all Go file GOland 导入“github.com/gin-gonic/gin“ 报红,
  16. 小学生的游戏 FZU - 1575
  17. Uncaught Error: Syntax error, unrecognized expression: |117的js错误
  18. 阿里云RDS数据库备份恢复【取证】教程
  19. [任务书+论文+PPT+源码]基于Android与多媒体的英文学习APP的设计与实现
  20. 百度map的简单例子

热门文章

  1. [分布式]-Raft论文研读
  2. 通过demo学习OpenStack开发所需的基础知识 -- 单元测试
  3. 如果你太在意别人对你的看法,你将一事无成
  4. 卖客星球 自己点击下载数据
  5. 解决:org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request;
  6. telnet 不成功的症状及原因
  7. 女神之美不设限,祝各位女神节日快乐
  8. 零基础CSS入门教程(9)——背景颜色和背景图片
  9. World Mobile与Chainlink达成战略技术合作
  10. 解决js函数replace禁止输入框输入非法字符,光标回到文字最后问题(兼容ie、谷歌)