spring

您所在的位置:网站首页 gateway设置cookies spring

spring

2024-07-13 00:18| 来源: 网络整理| 查看: 265

spring-cloud-Hoxton.SR6 (十一)GateWay强大的路由谓词(断言)功能

本文spring-cloud 版本为:hoxton.sr6

本文spring-boot版本为:2.2.x-2.3.x

路由谓词:Spring Cloud Gateway将路由匹配作为Spring WebFluxHandlerMapping基础架构的一部分。Spring Cloud Gateway包括许多内置的路由谓词工厂。所有这些谓词都与HTTP请求的不同属性匹配。您可以将多个路由谓词工厂与逻辑and语句结合使用。

说人话就是:请求匹配机制(触发路由条件)即符合Predicate的条件,就使用该路由的配置,否则对请求不做任何处理

例如我们前方配置的:

spring: cloud: gateway: routes: #最普通的路由 - id: easy-order uri: http://localhost:9002/ predicates: - Path=/order/**

-Path=/order/** 即是我们前边配置的一种路由谓词,这个配置的意思呢即是当我们的请求url路径中包含了/order/** 则会将请求转发到 http://localhost:9002/

-Path 方式的谓词呢,被称为路径路线谓词工厂

接下来呢,咱们进行系统的梳理梳理gateway所支持的路由谓词工厂

(1)路径-谓词工厂

路径谓词,即当请求(请求url包含某路径时触发路由),例如前边讲的 - Path=/product/**,则要求请求url中包含/product/** 时触发路由

- Path=路径1

exmaple: 请求Url包含/product/**时触发路由 ,将请求转发到 demo-product服务中

具体配置如下:

spring: cloud: gateway: routes: #服务名路由 负载均衡 - id: server-product uri: lb://demo-product predicates: - Path=/product/**

需要注意的是Path是可以配置多个的,例如这样:

- Path=路径1,路径2,路径3..... spring: cloud: gateway: routes: #服务名路由 负载均衡 - id: server-product uri: lb://demo-product predicates: - Path=/product/**,/zs/{a}

那么,当我们请求url中包含 /product/**或/zs/{a} (这里不要被{xxx}误解了,其实际与/zs/* 一致,仅仅只能匹配一级目录 即 /zs/li、/zs/aaaa)时都会将请求转发到 demo-peoduct服务

image-20201012223253597

image-20201012223413881

综上,便是路径谓词工厂的使用了,一般也是微服务使用最多的路由谓词

(2)后时刻-谓词工厂

可以设置一个时间点,当系统时间大于设置时间点时才会将请求进行路由

- After=时刻

具体配置如下:

spring: cloud: gateway: routes: #服务名路由 负载均衡 - id: server-product uri: lb://demo-product predicates: # [Asia/Shanghai] 为时间所对应的时区 - After=2020-10-13T21:57:33.993+08:00[Asia/Shanghai]

这样设置后谓词工厂后呢,即是当系统时间(上海时区)大于2020年10月13日21点57分30秒后 ,才会将请求进行路由

当请求时间小于设置的路由时间时 接口请求404 ,为何呢,因为网关并未将我们的请求转发到demo-product服务

image-20201013215643027

当系统时间大于设置的后路由时间时(即满足条件),才会将我们的请求转发到demo-product服务。

image-20201013215923708

(3)前时刻-谓词工厂

与后路径谓词工厂一样,一样是支持一个时间点设置,当当前请求时间小于设置的路由时间时,才会将请求进行路由

- Before=时刻

配置如下:

spring: cloud: gateway: routes: #服务名路由 负载均衡 - id: server-product uri: lb://demo-product predicates: # [Asia/Shanghai] 为时间所对应的时区 - Before=2020-10-13T22:12:33.993+08:00[Asia/Shanghai]

小于设定的前路由时间,可以正常访问,请求也路由到了demo-product服务

image-20201013221144242

当请求时间大于设置的前路由时间,不会触发路由

image-20201013221300239

(4)时间段-谓词工厂

这个时间段路由谓词呢,实际就是 前时刻 后时刻 两个路由谓词的综合,其配置需要设置两个时间点,当请求时间在这两个时间点之间,则会触发路由,反之则不进行路由。

- Between=时刻1,时刻2

配置如下:

spring: cloud: gateway: routes: #服务名路由 负载均衡 - id: server-product uri: lb://demo-product predicates: # [Asia/Shanghai] 为时间所对应的时区 - Between=2020-10-13T22:24:33.993+08:00[Asia/Shanghai],2020-10-13T22:26:33.993+08:00[Asia/Shanghai]

从我的配置中,大家可以看到,一个时间点是2020-10-13T22:24:33.993+08:00,一个时间点是2020-10-13T22:26:33.993+08:00

前一个时间点,是触发后时刻路由(即时间大于此时刻则进行路由)

后一个时间点,是触发前时刻路由(即时间小于此时刻则进行路由)

即请求时间在 2020-10-13-22:24:33 请求时间> 2020-10-13-22:24:33

请求时间小于设置的时间段时访问:

image-20201013222409414

请求时间满足于设置的时间段时访问:

image-20201013222457248

请求时间超过设置时间段时访问:

image-20201013222646812

哎,这个时候呢,可能有小伙子不信这个邪,你Between 设置两个时间,你说前一个时间点满足 后时刻谓词,后一个时间点满足前时刻谓词 ,你说是就是吗?

来,实践走着!我们把前一个时间点设置大点,后一个时间点设置小一点

- Between=2020-10-13T22:32:33.993+08:00[Asia/Shanghai],2020-10-13T22:28:33.993+08:00[Asia/Shanghai]

修改后启动试一试,直接启动报错

image-20201013223139965

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: 2020-10-13T22:32:33.993+08:00[Asia/Shanghai] must be before 2020-10-13T22:28:33.993+08:00[Asia/Shanghai] Caused by: java.lang.IllegalArgumentException: 2020-10-13T22:32:33.993+08:00[Asia/Shanghai] must be before 2020-10-13T22:28:33.993+08:00[Asia/Shanghai]

错误提示很明显,要求2020-10-13T22:32:33.993+08:00[Asia/Shanghai] 必需要小于2020-10-13T22:28:33.993+08:00[Asia/Shanghai]

所以呢,这个Between 设置的两个时刻呢,必须前时刻小于后时刻,即必须时刻1



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3