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. 【技术实战】Vue技术实战【一】

    需求实战一 组件来源 ant-design-vue Button 按钮 Progress 进度条 效果展示 代码展示 <template> <ARow> <ACol> ...

  2. 微服务探索之路06篇k8s配置文件Yaml部署Redis使用Helm部署MongoDB和kafka

    1 安装Redis 1.1创建配置文件redis.conf 切换到自己的目录下如本文是放在/home/ubuntu下 cd /home/ubuntu vim redis.conf bind 0.0.0 ...

  3. Linux 概念:存储

    块存储 (略) 文件存储 基于文件系统的本地文件存储: 基于网络的共享文件存储:NFS.Samba.Windows文件共享: 基于网络的分布式文件存储:HDFS... 对象存储 一种Key(对象ID) ...

  4. F-Beta-Score

    F1-Score相关概念 F1分数(F1 Score),是统计学中用来衡量二分类(或多任务二分类)模型精确度的一种指标.它同时兼顾了分类模型的准确率和召回率. F1分数可以看作是模型准确率和召回率的一 ...

  5. [selenium]点击元素出现的obscure问题

    前言 我们一般使用如下方式点击元素: elem = driver.find_element(...) elem.click() # 或者使用带等待条件的方式 elem = WebDriverWait( ...

  6. [ABC141E] Who Says a Pun?

    2023-02-17 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 dp,字符串 解题思路 看到求两个完全相同的子串时,我们可以发现其与求最长 ...

  7. Api接口如何防止被刷?

    ​ 当今,越来越多的应用程序和服务都提供了API接口,使得开发人员可以方便地与这些应用程序和服务进行交互.但是,由于API接口是公开的,因此很容易被黑客利用,对系统造成损害.为了确保API接口的安全性 ...

  8. 一文解锁vue3中hooks的使用姿势

    vue3 中的 hooks 是什么? 简单来说如果你的函数中用到了诸如 ref,reactive,onMounted 等 vue 提供的 api 的话,那么它就是一个 hooks 函数,如果没用到它就 ...

  9. KRPano最新官方文档中文版

    KRPano最新官方文档中文版: KRPano作为VR全景开发中常用的工具软件,深受广大开发者喜爱,但由于软件本身是国外软件,因此官方的文档都是以英文为主,对于一些国内不太熟悉英文的开发者来说比较不友 ...

  10. Python网络编程——操作系统基础、网络通信原理、.网络通信实现、DNS域名解析、 网络通信流程

    文章目录 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络协议 2.2 osi七层协议 2.3 tcp/ip五层模型讲解 2.3.1 物理层 2.3.2 数据链路层 2.3.3 ...