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. Centos 7安装Docker镜像仓库-Harbor

    下载安装包并导入镜像 # 进入文件下载目录 cd /root/software/ # 下载安装文件 # 如果下载失败可以本地下载,下载后上传至服务器,https://github.com/goharb ...

  2. AcWing 4495. 数组操作题解

    思路 此题较为简单,简述一下思路. 从小到大排序,每次选取最小值,只要不为0即可 每次都为序列减去一个数字太慢,但每个数又减去的数字一样,所以可以用minus记录每个数要减去的数 C++代码 #inc ...

  3. Hexo、Typecho博客添加旅行足迹网页

    本文部署的足迹地图,地址如下: http://www.aomanhao.top/index.php/archives/183/ jVectorMap JVectorMap 是一个优秀的.兼容性强的 j ...

  4. Hexo博客Yilia主题添加相册功能,丰富博客内容,Next等其他主题可以参考

    实现思路 1.在主页上必须有一个可供点击的相册连接 2.要用 hexo 生成一个photos.html文件 3.photos.html中的图片数据来源?因为这是一个静态页面所有要有一个 json文件 ...

  5. Hexo博客Next主题阅读次数热度不能读取的问题,报错Counter not initialized! More info at console err msg.

    加入valine在线评论 设置效果: 设置方法: 首先要先去LeanCloud注册一个帐号.然后再创建一个应用. 拿到appid和appkey之后,打开themes/next/_config.yml主 ...

  6. idea专业版和idea社区版整合Tomcat,并将war包部署

    目录 一.idea专业版部署 二.idea社区版部署 三.错误案例 开发过程中,由于需要运用云平台,所以从新配置开发环境,其它或多或少有些许问题,但解决起来较为轻松.而对于部署注册中心Eureka时, ...

  7. Docker安装及镜像加速器配置

    Centos7安装 卸载旧版本(如果安装过旧版本的话) yum remove docker docker-common docker-selinux docker-engine 安装Docker依赖环 ...

  8. 通配符SSL证书自动续签自动部署方案

    最开始接触 https 的时候一直是使用的 阿里云和腾讯云的免费 SSL证书,免费的SSL证书用了几年后,慢慢的部署https证书的项目越来越多,时间久了发现每个网站都需要一个 SSL证书,每个SSL ...

  9. 根据图片搜索excel

    问题描述:在excel使用中,当我们用大量的excel记录图文信息的时候,如果excel过多,比如成百上千个,里面都是包含大量的图片.这个时候如果想要根据图片快速找到这张图片可能被哪些excel包含, ...

  10. 四 APPIUM GUI讲解(Windows版)(转)

    Windows版本的APPIUM GUI有以下图标或者按钮: ·Android Settings  - Android设置按钮,所有和安卓设置的参数都在这个里面 ·General Settings – ...