Spring Cloud Gateway 将路由匹配作为最基本的功能。而这个功能是通过路由断言工厂完成的。Spring Cloud Gateway 中包含了很多种内置的路由断言工厂。所有这些断言都可以匹配 HTTP 请求的不同属性,并且可以根据逻辑与状态,将多个路由断言工厂复合使用。

1、After路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-after-route-predicate-factory

该断言工厂的参数是一个 UTC 格式的时间。其会将请求访问到 Gateway 的时间与该参数时间相比,若请求时间在参数时间之后,则匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://www.baidu.com
predicates:
- After=2027-01-20T17:42:47.789-07:00

API式

    @Bean
public RouteLocator afterRouteLocator(RouteLocatorBuilder builder) {
//当前时间加3天,将系统的默认时区设置为当前时区
ZonedDateTime dateTime = LocalDateTime.now().plusDays(3).atZone(ZoneId.systemDefault()); return builder.routes().route("after_route", ps ->
ps.after(dateTime).uri("https://www.baidu.com"))
.build();
}

2、Before路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-before-route-predicate-factory

该断言工厂的参数是一个 UTC 格式的时间。其会将请求访问到 Gateway 的时间与该参数时间相比,若请求时间在参数时间之前,则匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://www.baidu.com
predicates:
- After=2027-01-20T17:42:47.789-07:00

API式

    @Bean
public RouteLocator beforeRouteLocator(RouteLocatorBuilder builder) {
//当前时间加3天,将系统的默认时区设置为当前时区
ZonedDateTime dateTime = LocalDateTime.now().plusDays(3).atZone(ZoneId.systemDefault()); return builder.routes().route("before_route", ps ->
ps.after(dateTime).uri("https://www.baidu.com"))
.build();
}

3、Between路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-between-route-predicate-factory

该断言工厂的参数是两个 UTC 格式的时间。其会将请求访问到 Gateway 的时间与这两个参数时间相比,若请求时间在这两个参数时间之间,则匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://www.baidu.com
predicates:
- Between=2021-01-20T17:42:47.789-07:00,2027-01-20T17:42:47.789-07:00

API式

    @Bean
public RouteLocator betweenRouteLocator(RouteLocatorBuilder builder) {
ZonedDateTime endTime = LocalDateTime.now().plusDays(3).atZone(ZoneId.systemDefault());
ZonedDateTime startTime = LocalDateTime.now().minusDays(3).atZone(ZoneId.systemDefault());
return builder.routes().route("between_route",
ps -> ps.between(startTime, endTime)
.uri("https://www.baidu.com"))
.build();
}

4、Cookie路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-cookie-route-predicate-factory

该断言工厂中包含两个参数,分别是 cookie 的 key 与 value。当请求中携带了指定 key 与 value的 cookie 时,匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://www.baidu.com
predicates:
- Cookie=name,robin

API式

    @Bean
public RouteLocator cookieRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("cookie_route",
ps -> ps.cookie("name", "robin").uri("https://baidu.com"))
.build();
}

5、Header路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-header-route-predicate-factory

该断言工厂中包含两个参数,分别是请求头 header 的 key 与 value。当请求中携带了指定 key与 value 的 header 时,匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://www.baidu.com
predicates:
- Header=X-Request-Id,\d+

API式

    @Bean
public RouteLocator headerRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("header_route", ps ->
ps.header("X-Request-Id", "\\d+")
.uri("https://baidu.com"))
.build();
}

6、Host路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-host-route-predicate-factory

该断言工厂中包含的参数是请求头中的 Host 属性。当请求中携带了指定的 Host 属性值时,匹配成功,断言为 true。

例如

修改\etc中的hosts文件,为127.0.0.1 这个 ip指定多个主机名。

在该文件中添加如下内容:

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://www.baidu.com
predicates:
- Host=myhost:8000,scootersoftware.com=8000

API式

    @Bean
public RouteLocator hostRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("host_route", ps ->
ps.host("myhost.com:8081","scootersoftware.com:8081")
.uri("https://baidu.com"))
.build();
}

7、Method路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-method-route-predicate-factory

该断言工厂用于判断请求是否使用了指定的请求方法,是 POST,还是 GET 等。当请求中使用了指定的请求方法时,匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://www.baidu.com
predicates:
- Method=GET,POST

API式

    @Bean
public RouteLocator hostRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("method_route", ps ->
ps.method("GET","POST")
.uri("https://baidu.com"))
.build();
}

8、Path路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-path-route-predicate-factory

该断言工厂用于判断请求路径中是否包含指定的 uri。若包含,则匹配成功,断言为 true,此时会将该匹配上的 uri 拼接到要转向的目标 uri 的后面,形成一个统一的 uri

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: order_route
uri: https://www.baidu.com
predicates:
- Path=/order/**
- id: product_route
uri: https://www.jd.com
predicates:
- Path=/product/**

API式

    @Bean
public RouteLocator pathRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("order_route", ps ->
ps.path("/order/**")
.uri("https://baidu.com"))
.route("product_route", ps ->
ps.path("/product/**")
.uri("https://jd.com"))
.build();
}

9、Query路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-query-route-predicate-factory

以上两个 Query 断言的关系是“与”,即只有请求中同时包含了 username 与 password 参数,且username 参数值必须是以 ro 开头的,并且password等于123456就可以访问到。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://www.baidu.com
predicates:
- Query=username,ro.+
- Query=password,123456

API式

    @Bean
public RouteLocator queryRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("query_route", ps ->
ps.query("username", "ro.+")
.and()
.query("password", "123456")
.uri("https://baidu.com"))
.build();
}

10、RemoteAddr路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-remoteaddr-route-predicate-factory

该断言工厂用于判断提交请求的客户端 IP 地址是否在断言中指定的 IP 范围或 IP 列表中。若在,匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: addr_route
uri: https://www.baidu.com
predicates:
- RemoteAddr=192.168.0.1/24

API式

    @Bean
public RouteLocator remoteAddrRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("addr_route", ps ->
ps.remoteAddr("192.168.0.1/24")
.uri("https://baidu.com"))
.build();
}

由于当前浏览器提交请求的主机 IP 是 192.168.0.110,属于 192.168.0 网段,所以是可以访问到。

11、Weight路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory

该断言工厂用于实现对同一组中的不同 uri 实现指定权重的负载均衡。路由中包含两个参数,分别是用于表示组 group,与权重 weight。对于同一组中的多个 uri 地址,路由器会根据设置的权重,按比例将请求转发给相应的 uri。

下面的路由用于指定对两个电商平台 taobao.com 与 jd.com 的访问权重为 8:2。以下两个路由都属于web-group组。

在大量请求的前提下,对于相同的请求,转发到 tabao 的机率占 8 成,转发到 jd 的机率占 2 成。但这不是一个绝对准确的访问比例,大体差不多。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: taobao_route
uri: https://www.taobao.com
predicates:
- Weight=web-group,8
- id: jd_route
uri: https://www.jd.com
predicates:
- Weight=web-group,2

API式

    @Bean
public RouteLocator weightRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("taobao_route", ps ->
ps.weight("web-group", 8)
.uri("https://taobao.com"))
.route("jd_route", ps ->
ps.weight("web-group", 2)
.uri("https://jd.com"))
.build();
}

12、XForwardedRemoteAddr路由断言工厂

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-xforwarded-remote-addr-route-predicate-factory

只要当前请求头中追加入 X-Forwarded-For 的 IP 出现在路由指定的 IP 列表中,则匹配成功,断言为 true。

配置式

server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: addr_route
uri: https://www.baidu.com
predicates:
- XForwardedRemoteAddr=192.168.0.1/24

API式

    @Bean
public RouteLocator xForwardedRemoteAddrRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("addr_route", ps ->
ps.xForwardedRemoteAddr("192.168.0.1/24")
.uri("https://baidu.com"))
.build();
}

13、优先级

当一个应用中对于相同的路由断言工厂,分别通过配置式与 API 式都进行了设置,且设置的值不同,此时它们的关系有两种:

  1. 或的关系:例如,Header 路由断言工厂、Query 路由断言工厂

  2. 优先级关系:例如,After、Before、Between 路由断言工厂。此时配置式的优先级要高于 API 式的。

Spring Cloud Gateway系列:路由断言工厂的更多相关文章

  1. Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂

    在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...

  2. 通过Nacos动态刷新Spring Cloud Gateway的路由

    通过Nacos动态刷新Spring Cloud Gateway的路由 一.背景 二.解决方案 三.实现功能 四.实现步骤 1.网关服务的实现 1.pom文件 2.bootstrap.yml配置文件 3 ...

  3. springcloud3(五) spring cloud gateway动态路由的四类实现方式

    写这篇博客主要是为了汇总下动态路由的多种实现方式,没有好坏之分,任何的方案都是依赖业务场景需求的,现在网上实现方式主要有: 基于Nacos, 基于数据库(PosgreSQL/Redis), 基于Mem ...

  4. spring cloud gateway网关路由分配

    1, 基于父工程,新建一个模块 2,pom文件添加依赖 <dependencies> <dependency> <groupId>org.springframewo ...

  5. Spring Cloud Alibaba学习笔记(16) - Spring Cloud Gateway 内置的路由谓词工厂

    Spring Cloud Gateway路由配置的两种形式 Spring Cloud Gateway的路由配置有两种形式,分别是路由到指定的URL以及路由到指定的微服务,在上文博客的示例中我们就已经使 ...

  6. Spring Cloud gateway 网关服务二 断言、过滤器

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  7. Spring Cloud Alibaba学习笔记(19) - Spring Cloud Gateway 自定义过滤器工厂

    在前文中,我们介绍了Spring Cloud Gateway内置了一系列的内置过滤器工厂,若Spring Cloud Gateway内置的过滤器工厂无法满足我们的业务需求,那么此时就需要自定义自己的过 ...

  8. Spring cloud gateway 如何在路由时进行负载均衡

    本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...

  9. 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

    SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...

  10. Spring Cloud Gateway服务网关

    原文:https://www.cnblogs.com/ityouknow/p/10141740.html Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gatewa ...

随机推荐

  1. 【技术积累】Mysql中的SQL语言【技术篇】【四】

    数据的连接与关联查询 INNER JOIN INNER JOIN是MySQL中的一种表连接操作,用于将两个或多个表中的行基于一个共同的列进行匹配,并返回匹配的结果集. 下面是一个案例,假设有两个表:o ...

  2. Linux 脚本:冒泡排序

    #!/bin/bash arr=(3 2 5 4 1) len=${#arr[@]} for i in $(seq 1 $len) ; do index=$(($len - $i - 1)) for ...

  3. Java的readBytes是怎么实现的?

    1.前言 众所周知,Java是一门跨平台语言,针对不同的操作系统有不同的实现.本文从一个非常简单的api调用来看看Java具体是怎么做的. 2.源码分析 从FileInputStream.java中看 ...

  4. 手动安装vur-router并引用

    安装并引用 安装 npm install vue-router 引用 步骤一:在src路径下,创建router文件夹, 其下创建index.js // router/index.js import V ...

  5. SQL 注入学习手册【笔记】

    SQL 注入基础 [若本文有问题请指正] 有回显 回显正常 基本步骤 1. 判断注入类型 数字型 or 字符型 数字型[示例]:?id=1 字符型[示例]:?id=1' 这也是在尝试闭合原来的 sql ...

  6. 使用.NET Jieba.NET 的 PosSegmenter 实现中文分词匹配

    ​ 目录 引言 1. 什么是中文分词 2. Jieba.NET简介 3. PosSegmenter介绍 4. 实现中文分词匹配 4.1 安装Jieba.NET库 4.2 创建PosSegmenter实 ...

  7. DORA指标:公司业务成果的“占卜师”

    2009 年,受 John Allspaw 和 Paul Hammonds 在 Velocity 上演讲的启发,Patrick Debois 组织了一次名为"DevOps Days" ...

  8. Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中三则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...

  9. WebStrom提交代码到GitLab报错Error: Cannot find any-observable implementation nor global.Observable.

    项目场景: 前端代码完成后,提交代码 问题描述 提交代码到GitLab时,因自动检测机制导致项目提交失败 C:\D\insper\inspur_works\custom-manage-front\no ...

  10. LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...