spring |
您所在的位置:网站首页 › gateway设置cookies › spring |
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=路径1exmaple: 请求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服务 综上,便是路径谓词工厂的使用了,一般也是微服务使用最多的路由谓词 (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服务 当系统时间大于设置的后路由时间时(即满足条件),才会将我们的请求转发到demo-product服务。 与后路径谓词工厂一样,一样是支持一个时间点设置,当当前请求时间小于设置的路由时间时,才会将请求进行路由 - 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服务 当请求时间大于设置的前路由时间,不会触发路由 这个时间段路由谓词呢,实际就是 前时刻 后时刻 两个路由谓词的综合,其配置需要设置两个时间点,当请求时间在这两个时间点之间,则会触发路由,反之则不进行路由。 - 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 请求时间小于设置的时间段时访问: 请求时间满足于设置的时间段时访问: 请求时间超过设置时间段时访问: 哎,这个时候呢,可能有小伙子不信这个邪,你Between 设置两个时间,你说前一个时间点满足 后时刻谓词,后一个时间点满足前时刻谓词 ,你说是就是吗? 来,实践走着!我们把前一个时间点设置大点,后一个时间点设置小一点 - Between=2020-10-13T22:32:33.993+08:00[Asia/Shanghai],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 |