Spring Cloud Gateway网关工作原理、网关谓词和GatewayFilter工厂

2023-11-11

Spring Cloud Gateway:

官方文档地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
  Spring Cloud Gateway项目提供了一个在Spring生态系统之上构建的API网关,它指在提供一种简单而高效的方法来将请求路由到API,并未它们提供跨领域的关注,例如:安全性,监视/度量和弹性等。
微服务使用Gateway调用

Spring Cloud Gateway核心概念:

  路由:网关的基本构建组成,它由ID,目标URL,谓词集合和过滤器定义,如果聚合谓词为true,则匹配路由;
  谓词:这是Java 8函数谓词,输入类型是Spring Framework ServerWebExchange,可以匹配HTTP请求中的所有内容,例如请求头或者参数;
  过滤器:这些事使用了特定工厂构造的Spring Framework GatewayFilter实例。在这里,可以在发送给下游请求之前或之后修改请求和响应。

Spring Cloud Gateway特征功能:

1、建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上;
2、能够匹配任何请求上的路由;
3、谓词和过滤器特定于路由;
4、Hystrix断路器集成;
5、Spring Cloud DiscoveryClient集成;
6、易于编写的谓词和过滤器(可扩展性很高);
7、路径改写;

Spring Cloud Gateway工作原理:

Gateway工作原理
  客户端向Spring Cloud Gateway发出请求,如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序,该处理程序通过特定于请求的过滤器链运行请求,筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑,所有“前置”过滤器逻辑均被执行,然后发出代理请求,发出代理请求后,将运行“后”过滤器逻辑。

入门使用Spring Cloud Gateway:

1、添加gateway网关依赖:

		<!--spring-cloud-starter-gateway 网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- sentinel-spring-cloud-gateway-adapter -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
            <version>1.7.2</version>
        </dependency>

2、配置application.yaml文件(配置路由谓词工厂和网关过滤工厂)

#启动端口
server:
  port: 80

#spring boot actuator 监控端点
management:
  endpoint:
    health:
      show-details: always
  endpoints:
    jmx:
      exposure:
        include: '*'
    web:
      exposure:
        include: '*'
  health:
    sentinel:
      enabled: false


spring:
  application:
    #服务名字
    name: nacos-discovery-spring-cloud-gateway

  cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index

          filters:
            - AddRequestHeader=X-Request-red, blue
            - AddRequestHeader=X-Request-Id, 12345
            - AddRequestParameter=color, black
            - RequestLog=prefix, gatewaytest #自定义的filter

Netty started
  由于Spring Cloud Gateway启动的时候是Netty而不是tomcat,所有此时项目里面就不需要spring-boot-starter-web依赖

路由谓词工厂:

  Spring Cloud Gateway将路由匹配作为 WebFlux HandlerMapping基础架构的一部分,Spring Cloud Gateway包括许多内置的路由谓词工厂,所有这些谓词都与HTTP请求的不同属性匹配,可以将多个路由谓词工厂结合使用;有以下11个路由谓词工厂:

After路由谓词工厂:

  After route谓词工厂采用一个参数,即datetime(这是一个Java ZonedDateTime),该谓词匹配在指定日期时间之后发生的请求,以下示例配置了路由后谓词:
时间获取方式:时间通过获取:System.out.println(ZonedDateTime.now());

cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现
      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - After=2021-02-12T00:27:04.095+08:00[Asia/Shanghai]
#符合2021年02月12日00:27:04之后的请求

Before路由谓词工厂:

  Before路由谓词工厂采用一个参数,即datetime(这是一个Java ZonedDateTime),该谓词匹配在指定日期时间之前发生的请求,下面的示例配置路由之前谓词:

cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现
      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - Before=2021-01-12T00:27:04.095+08:00[Asia/Shanghai]
#符合2021年02月12日00:27:04之前的请求

Between路由谓词工厂:

  路由谓词之间的工厂使用两个参数datetime1和datetime2,它们是java ZonedDateTime对象,该谓词匹配在datetime1之后和datetime2之前发生的请求,datetime2参数必须在datetime1之后,以下示例配置了路由之间的谓词:

 cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - Between=2021-02-10T00:27:04.095+08:00[Asia/Shanghai], 2021-02-11T00:37:04.095+08:00[Asia/Shanghai]
#符合2021年02月12日00::27:04到2021年02月12日00:37:04之间的请求

Cookie 路由谓词工厂:

  Cookie路由谓词工厂采用两个参数,即cookie名称和一个regexp(这是Java正则表达式),该谓词匹配具有给定名称且其值与正则表达式匹配的cookie,以下示例配置Cookie路由谓词工厂:

  cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - Cookie=token, ch.p
#此路由匹配具有名称为token与ch.p正则表达式匹配的cookie的请求。

Header 路由谓词工厂:

  header 路由谓词工厂使用两个参数,header 名称和一个regexp(这是Java正则表达式),该谓词与具有给定名称的header 匹配,该header 的值与正则表达式匹配,以下示例配置标头路由谓词:

  cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - Header=X-Request-Id, \d+
#如果请求具有名为X-Request-Id的标头,且其值与\ d +正则表达式匹配(值为一个或多个数字),则此路由匹配;

Host 路由谓词工厂:

  Host路由谓词工厂使用一个参数:主机名模式列表,以下示例配置主机路由谓词:

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org
#如果请求的Host标头值为www.somehost.org或beta.somehost.org,则此路由匹配www.anotherhost.org。

Method 路由谓词工厂:

  方法路由谓词工厂使用方法参数,该参数是一个或多个参数,要匹配的HTTP方法,以下示例配置方法route谓词:

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST
#如果请求方法是GET或POST,则此路由匹配;

Path路由谓词工厂:

  路径路由谓词工厂使用两个参数:Spring PathMatcher模式列表和一个称为matchOptionalTrailingSeparator的可选标志,以下示例配置路径路由谓词:

  cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index
#如果请求路径为例如/test2或/notFound-feign或/index,则此路由匹配;

Query路由谓词工厂:

  查询路由谓词工厂采用两个参数:必需的参数和可选的regexp(这是Java正则表达式),以下示例配置查询路由谓词:

  cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - Query=token
#如果请求包含token查询参数,则前面的路由匹配;
  cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - Query=color,red
#如果请求包含值与red匹配的color查询参数,则上述路由匹配;

RemoteAddr 路由谓词工厂:

  RemoteAddr路由谓词工厂使用源列表(最小大小为1),这些源是标记(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,而16是子网掩码)),下面的示例配置RemoteAddr路由谓词:

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24
#如果请求的远程地址为,则此路由匹配192.168.1.10;

Weight 路由谓词工厂:

  权重路由谓词工厂采用两个参数:group和weight(一个int),权重是按组计算的,以下示例配置权重路由谓词:

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2
#这条路线会将大约80%的流量转发到weighthigh.org,将大约20%的流量转发到weightlow.org。

GatewayFilter 工厂:

  路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应,Spring Cloud Gateway包括许多内置的GatewayFilter工厂(总共有31个 GatewayFilter 工厂);一下就举一个例子想了解更多去熟系下官方文档

AddRequestHeader GatewayFilter工厂:

 cloud:
    #配置网关
    gateway:
      discovery:
        locator:
          enabled: true #启用DiscoveryClient网关集成,可以实现服务的发现

      #配置网关路由转发规则
      routes:
        - id: route1
          uri: lb://29-nacos-discovery-customer
          predicates: #谓词:判断,是不是?对不对?是否匹配?
            - Path=/test2, /notFound-feign, /index, /echo
            - Token=123456

          filters:
            - AddRequestHeader=X-Request-red, blue
#此清单将X-Request-red:blue标头添加到所有匹配请求的下游请求头中。
#AddRequestHeader了解用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时扩展。
#以下示例配置了AddRequestHeader GatewayFilter使用变量的:
#System.out.println("X-Request-red = " + request.getHeader("X-Request-red"));
#X-Request-red = blue

Spring Cloud Gateway入门了解工作原理、11种网关谓词和GatewayFilter工厂

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Cloud Gateway网关工作原理、网关谓词和GatewayFilter工厂 的相关文章

  • 基于STM32CubeMX+FreeRTOS的Proteus仿真LCD1602

    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块 它是由字符型液晶显示屏 LCD 控制驱动主电路HD44780及其扩展驱动电路HD44100 以及少量电阻 电容元件和结构件等装配在PCB板上而组成 一 LCD1602技术参数 显示
  • docker 无法访问web

    出于安全考虑 Linux系统默认是禁止数据包转发的 所谓转发即当主机拥有多于一块的网卡时 其中一块收到数据包 根据数据包的目的ip地址将数据包发往本机另一块网卡 该网卡根据路由表继续发送数据包 这通常是路由器所要实现的功能 要让Linux系
  • PaddleDetection使用教程

    详细的使用教程可以参考官方文档 一 安装说明 在安装PaddleDetection之前要先安装依赖项PaddlePaddle 你可以将其看作一个内核 有了它才可以安装PaddleDetection 首先 我们可以新建一个虚拟环境 命名为pa

随机推荐

  • python每日一题(leetcode/atcoder/nowcoder)

    背景 用leetcode每日一题 正好练一练python的一些写法吧 2021年2月28日 896 单调队列 判断数组是单增的或者是单减的 学习到一个sorted的用法 还有倒序的切片 class Solution def isMonoto
  • 微信小程序java+ssm+uniapp个人理财消费收支系统

    利用Java语言 SSM框架和mysql数据库等知识点 结合相关设计模式 以及软件工程的相关知识 设计一个ssm微信小程序的个人消费系统 来进行记录用户的信息 以及小程序信息的增删改查的功能 根据实现需求 小程序需完成这些基本功能 1 系统
  • C++ 多态(一) : 多态的构成条件、final、override、协变、析构函数的重写、抽象类

    文章目录 1 多态的定义和实现 多态的浅层理解 多态的构成条件 2 虚函数 虚函数的重写规则 虚函数重写条件的两个例外 1 协变 返回值不同 2 析构函数的重写 函数名不同 3 C 11 override 和 final override
  • JQ开发中遇到的问题(一)

    目录 目录 1 收藏与取消收藏切换 2 使用layui插件下拉选择渲染问题 1 收藏与取消收藏切换 说明 从接口中获取收藏状态 单击切换状态 如下图所示 开始状态 点击后状态 代码实现 1 全局定义一个变量 记录状态 var collect
  • wps 云文档的服务器地址,在WPS云文档保存、管理文件

    云文档上传和获取服务端调用 目录 1 获取APP剩余空间 获取APP剩余空间 接口说明 获取APP剩余空间 请求说明 参数说明参数参数类型是否必须说明access tokenstringrequiredaccess token appids
  • 相关系数和p值的含义

    相关系数就是两个变量之间的相关程度 1 lt 0负相关 r gt 0正相关 r2越接近1表示越相关 P值即概率 反映某一事件发生的可能性大小 统计学根据显著性检验方法所得到的P 值 一般以P lt 0 05 为显著 P lt 0 01 为非
  • [Unity] Unity 3D 中的旋转

    Unity 3D 中的旋转 一 Unity 3D 中 Rotation 在Unity中 旋转通常可以用一个三维向量 x y z 表示 实际上这是欧拉角 三个分量分别是绕x轴 y轴和z轴的旋转角度 要对一个GameObject进行旋转 可以直
  • HTCvive官方开发插件介绍

    相信各位小伙伴们在使用SteamVR Unity Plugin的过程中应该都遇到过这样的问题 获取设备很麻烦 设备在重启后indexID会改变从而导致设置好的左右手设备出现交错 无法与UGUI的事件系统连接导致无法使用UGUI等等很多问题
  • 关于windows本机开放端口后,同一个网络下的其他电脑telnet不通的解决办法

    前提 电脑A与电脑B均在同一个wifi下 本地电脑A 启动了一个kong网关 不管是什么应用 只要开启了一个监听端口就行 并且将docker里面的8000端口映射到本机的8000端口 此时在电脑A上的命令行运行 telnet 10 xxx
  • Java url转MultipartFile inputStream转File file转multipartFile

    Java url转MultipartFile inputStream转File file转multipartFile url转MultipartFile param url return throws Exception public st
  • linux kerne新版本编号?

    今天看到linux内核版本号都到3 4了 心中非常惊讶 为什么现在版本飞这么快了 于是一番google 终于找到了两篇文章 大家可以看看 Linux kernel version bumped up to 3 0 as 20th birth
  • VirtualBox 安装 增强功能

    在VirtualBox中安装好系统后 一般建议安装增强功能 因为一开始左上方的 视图 菜单中无缝模式和自动调整显示尺寸功能不可用 屏幕分辨率不够 无法与原系统共享剪贴板等 安装过程如下 点击VirtualBox的 设备 安装增强功能 此时桌
  • 解决 PHP Mysql 和 UTF8的问题

    http sixpoint me 443 solving php mysql utf8 issue 1 数据库 CREATE DATABASE db name CHARACTER SET utf8 DEFAULT CHARACTER SET
  • 【vue】页面缓存回跳后 侧边栏z-index层级导致页面快闪

    问题描述 公司使用的帆软报表页面没有加keepAlive缓存 在从一个弹框页面跳转到子报表后 切换路由回到当前页面是会继续展示弹框页面 但是页面由于z index层级问题会闪一下 问题排查 经过代码查看是因为导航栏小箭头使用了定位 z in
  • vue 的酒店⺠宿⽹站毕业设计源码250910

    基于Springboot的酒店民宿网站 摘 要 随着互联网和宽带上网的普及 Internet 网站在中国异军突起 并日益渗透到人们的日常生活中 网站是运用现代通信技术 计算机和网络技术进行的一种社会形态 其目的是通过互联网满足人们的需求 在
  • sql查询条件:闭区间和开区间(>=和>)效率分析

    A select from T Info Passengers where id gt 3245B select from T Info Passengers where id gt 3245 A 返回结果46956条 占用时间 毫秒 读取
  • bigdecimal加减乘除运算

    1 加法 Test public void testAdd 用double类型初始化BigDecimal对象 BigDecimal numA new BigDecimal 0 05 BigDecimal numB new BigDecima
  • 【数据结构】排序算法大总结

    文章目录 1 排序的概念及运用 2 常见排序算法的实现 2 1 插入排序 2 1 1 直接插入排序 2 1 2 希尔排序 2 2 选择排序 2 2 1 直接选择排序 2 2 2 堆排序 2 3 交换排序 2 3 1 冒泡排序 2 3 1 快
  • 图解redis五种数据结构底层实现(动图版)

    redis有五种基本数据结构 字符串 hash set zset list 但是你知道构成这五种结构的底层数据结构是怎样的吗 今天我们来花费五分钟的时间了解一下 目前redis版本为3 0 6 动态字符串SDS SDS是 simple dy
  • Spring Cloud Gateway网关工作原理、网关谓词和GatewayFilter工厂

    Spring Cloud Gateway 官方文档地址 https docs spring io spring cloud gateway docs current reference html Spring Cloud Gateway项目