【深入解析spring cloud gateway】02 网关路由断言

这篇具有很好参考价值的文章主要介绍了【深入解析spring cloud gateway】02 网关路由断言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、断言(Predicate)的意义

断言是路由配置的一部分,当断言条件满足,即执行Filter的逻辑,如下例所示

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment}
        filters:
        - AddRequestHeader=X-Request-Red, Blue-{segment}

当请求路径满足条件/red/,即添加头信息:X-Request-Red,value为Blue-{segment},segment是路径里面带的信息。

gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分

Route(路由) 路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
Predicate(谓语、断言) 路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式
Filter(过滤器) 过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容

其中Route和Predicate必须同时申明
【深入解析spring cloud gateway】02 网关路由断言,深入解析析SpringCloud Gateway,spring cloud,gateway

以下内容,来自于SpringCloud Gateway官网,经过整理得来。

二、配置路由断言

注意:以下的配置,只写了routes配置的predicates的部分,实际上,predicates单独用没有意义,一般要配置filter来用。如上面的添加头信息的示例。

1.1 简写配置

由过滤器名称,后跟等号,后跟逗号分割的参数值

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

1.2 展开的写法

spring:
  cloud:
    gateway:
      routes:
      - id: test_cookie
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

以上两个写法,效果是一样的。
问题1:展开的predicates的展开写法为什么是这么写?
原因是,这个配置对应的配置类是这么写的
【深入解析spring cloud gateway】02 网关路由断言,深入解析析SpringCloud Gateway,spring cloud,gateway

问题2:name:Cookie是怎么来的?
根据类名来的,CookieRoutePredicateFactory,取的Cookie前缀,还有很多断言工厂,如下:
【深入解析spring cloud gateway】02 网关路由断言,深入解析析SpringCloud Gateway,spring cloud,gateway

问题3:为啥args下面是name和regexp?
【深入解析spring cloud gateway】02 网关路由断言,深入解析析SpringCloud Gateway,spring cloud,gateway

三、路由断言工厂示例

Spring Cloud Gateway 路由匹配作为Spring WebFlux HandlerMapping 基础设施的一部分。Spring Cloud Gateway内置了很多路由断言工厂。用于匹配HTTP请求的不同属性。
注意:以下的配置,只写了routes配置的predicates的部分,实际上,predicates单独用没有意义,一般要配置filter来用。如上面的添加头信息的示例。

2.1 The After Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

匹配2017-01-20T17:42:47.789-07:00之后的请求

2.2 The Before Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

匹配2017-01-20T17:42:47.789-07:00之前的请求

2.3 The Between Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

表示在第一个时间之后,第二个时间之前的请求才能正确匹配路由

2.4 The Cookie Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

接收两个参数,分别为name 和 regexp(Java正则表达式),表示cookie中携带的name值满足正则表达式regexp,则被路由

2.5 The Header Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

接收两个参数,header 和 regexp(Java正则表达式),表示header中携带的name值满足正则表达式regexp,则被路由

2.6 The Host Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

支持URI模板变量(如{sub}.myhost.org)。当Host 头的值为 www.somehost.org 或 beta.somehost.org 或 www.anotherhost.org 都能匹配该路由。
Predicate 会提取URI模板变量作为map集合,并放置在 ServerWebExchange.getAttributes() 中,key定义为 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE ,这些值能在 GatewayFilter工厂中使用。

2.7 The Method Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

上面示例表示匹配 GET ,POST请求

2.8 The Path Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

如果请求地址是 /red/1 或 /red/1/ 或 /red/blue 或 /blue/green ,那么路由将会被匹配。
如果 matchTrailingSlash 设置为 false ,那么 /red/1/ 不会被匹配。
Predicate 会提取URI模板变量作为map集合,并放置在 ServerWebExchange.getAttributes() 中,key定义
为 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE ,这些值能在 GatewayFilter 工厂中使用。
可以使用个实用法(调用get)来简化对这些变量的访问。下面的例示展示了如何使用get方法:

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);

String segment = uriVariables.get("segment");

2.9 The Query Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green

接收两个参数,分别是一个必须的param和一个可选的regexp。

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=red, gree.

red和gree两个参数都有才满足

2.10 The RemoteAddr Route Predicate Factory

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24.

接收⼀个sources列表(最小1个),CIDR表示法(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是
⼀个IP地址,16是⼀个⼦网掩码)。
如果请求的远程地址是 192.168.1.10 ,则此路由被匹配

2.11 The Weight Route Predicate Factory

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 。文章来源地址https://www.toymoban.com/news/detail-696391.html

到了这里,关于【深入解析spring cloud gateway】02 网关路由断言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Cloud Alibaba】8.路由网关(Gateway)

    接下来对服务消费者添加路由网关来实现统一访问接口,本操作先要完成之前的步骤,详情请参照【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0 , Spring Boot 2.0 和 Project Reactor 等技术开发的网关,该项目提供了一个库,用于在 Spring W

    2023年04月24日
    浏览(39)
  • Spring Cloud Gateway 监控、多网关实例路由共享 | Spring Cloud 18

    Actuator 是 Spring Boot 提供的用来对应用系统进行监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator 的核心是端点 Endpoint 。 Endpoint 可以让我们监视应用程序并与其交互。 Spring Boot 包含许多内置端点,并允许您添加自己的端

    2024年02月09日
    浏览(59)
  • 第八章 : Spring cloud 网关中心 Gateway (动态路由)

    第八章 : Spring cloud 网关中心 Gateway (动态路由) 前言 本章知识点:重点介绍动态网关路由的背景、动态路由与静态路由的概念,以及如何基于Nacos实现动态网关路由 的实战案例。 背景 前面章节介绍了Spring Cloud Gateway提供的配置路由规则的两种方法,但都是在Spring Cloud Ga

    2024年01月19日
    浏览(48)
  • 第七章 : Spring cloud 网关中心 Gateway (静态路由)

    第七章 : Spring cloud 网关中心 Gateway (静态路由) 前言 本章知识点:本章将会介绍什么是Spring Cloud Gateway、为什么会出现Spring Cloud Gateway,以及Spring Cloud Gateway的工作原理和实战用法,以及Spring Cloud Gateway 路由概念以及基于nacos注册中心Spring Cloud Gateway 静态路由的实战。 什么

    2024年02月02日
    浏览(57)
  • 【深入解析spring cloud gateway】05 gateway请求转发实验

    三个工程: eureka-server eureka-client gateway 实验目的:通过网关访问对应的微服务:eureka-client。gateway和eureka-client注册到eureka-server上 eureka-server略 eureka-client application.yml 提供一个接口 pom.xml application.yml 定义一个filter用于去掉路径中的/gateway 自定义一个GlobalFilter,用于去掉路径

    2024年02月10日
    浏览(50)
  • 【深入解析spring cloud gateway】06 gateway源码简要分析

    上一节做了一个很简单的示例,微服务通过注册到eureka上,然后网关通过服务发现访问到对应的微服务。本节将简单地对整个gateway请求转发过程做一个简单的分析。 主要流程: Gateway Client向 Spring Cloud Gateway 发送请求 请求首先会被HttpWebHandlerAdapter 进行提取组装成网关上下文

    2024年02月10日
    浏览(41)
  • 深入解析Spring Cloud Gateway的GlobalFilter

    本文将详细介绍Spring Cloud Gateway中的GlobalFilter,解释其作用以及如何使用。通过代码示例,读者将深入了解GlobalFilter在Spring Cloud Gateway中的应用,以及如何自定义和配置GlobalFilter来实现定制化的网关逻辑。 Spring Cloud Gateway是Spring Cloud生态系统中的一员,是基于Spring Framework 5、

    2024年04月10日
    浏览(48)
  • 【深入解析spring cloud gateway】04 Global Filters

    上一节学习了GatewayFilter。 回忆一下一个关键点: GateWayFilterFactory的本质就是:针对配置进行解析,为指定的路由,添加Filter,以便对请求报文进行处理。 GlobalFilter又是啥?先看一下接口定义 再看一下GatewayFilter 可以看到GatewayFilter和GlobalFilter方法签名是一模一样的,那为啥又

    2024年02月09日
    浏览(37)
  • 【深入解析spring cloud gateway】08 Reactor 知识扫盲

    1.1 背景知识 为了应对高并发服务器端开发场景,在2009 年,微软提出了一个更优雅地实现异步编程的方式——Reactive Programming,我们称之为响应式编程。随后,Netflix 和LightBend 公司提供了RxJava 和Akka Stream 等技术,使得Java 平台也有了能够实现响应式编程的框架。 在2017 年9 月

    2024年02月09日
    浏览(38)
  • 【深入解析spring cloud gateway】07 自定义异常返回报文

    Servlet的HttpResponse对象,返回响应报文,一般是这么写的,通过输出流直接就可以将返回报文输出。 在filter中如果发生异常(例如请求参数不合法),抛出异常信息的时候,调用方收到的返回码和body都是Spring Cloud Gateway框架处理来处理的。这一节我们分析一下,gateway的异常返

    2024年02月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包