Gateway After 路由断言工厂

After 路由断言工厂只有一个参数,即日期时间(java ZonedDateTime)。该断言会匹配指定日期时间后发生的请求。例如:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        # 看这里
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

上面配置,after_route 路由将匹配山地(Mountain)时间(Denver 丹佛) 2017 年 1 月 20 日 17:42 之后提出的任何请求相匹配。

注意:美国横跨西五区至西十区,共六个时区。每个时区对应一个标准时间,从东向西分别为东部时间(EST)(西五区时间)、中部时间(CST)(西六区时间)、山地时间(MST)(西七区时间)、太平洋时间(西部时间)(PST)(西八区时间)、阿拉斯加时间(AKST)(西九区时间)和夏威夷时间(HST)(西十区时间),按照“东早西晚”的规律,各递减一小时。如下图:

Gateway After 路由断言工厂

更多时区描述(大洲名/城市名)如下:

  • Asia/Chongqing 亚洲/重庆

  • Asia/Harbin 亚洲/哈尔滨

  • Asia/Kashgar 亚洲/喀什葛尔

  • Asia/Shanghai 亚洲/上海

  • Asia/Urumqi 亚洲/乌鲁木齐

  • Asia/Tokyo 亚洲/东京

  • America/Chicago 美国/芝加哥

  • America/Denver 美国/丹佛

  • America/Detroit 美国/底特律

  • America/Los_Angeles 美国/洛杉矶

  • America/New_York 美国/纽约

  • America/Shiprock 美国/新墨西哥州

  • Pacific/Honolulu 太平洋/檀香山

  • Europe/Vatican 欧洲/梵蒂冈

  • Asia/Ho_Chi_Minh 亚洲/胡志明

示例

将“Gateway 搭建网关服务”项目的配置文件 bootstrap.yml 内容使用如下配置替换:

server:
  # 网关端口
  port: 9000

spring:
  application:
    # 服务名称
    name: gateway-demo01
  cloud:
    # nacos
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        group: DEFAULT_GROUP

    # 网关路由配置
    gateway:
      # 网关路由配置
      routes:
        # 路由id,自定义,只要唯一集合
        - id: service-order
          # 路由的目标地址,lb 就是负载均衡,后面跟服务名
          # 需要集成 nacos 等服务注册中心
          uri: lb://service-order
          # 路由断言,也就是判断请求是否符合路由规则的条件
          predicates:
            # After 断言,将匹配上海(东八区)2023-12-09 21:00:00.000 之后的请求
            - After=2023-12-09T21:00:00.000-08:00[Asia/Shanghai]

分别启动用户服务、订单服务和网关服务,如下图:

Gateway After 路由断言工厂

此时我们通过 Postman 访问订单服务,如下图:

Gateway After 路由断言工厂

从上图可知,成功调用了订单接口。如果我们将 After 断言修改如下:

- After=2023-12-09T22:00:00.000-08:00[Asia/Shanghai]

重启网关服务,再次请求订单接口,如下图:

Gateway After 路由断言工厂

服务调用失败,返回了 404。

源码分析

下面是 After 路由断言工厂的源代码:

package org.springframework.cloud.gateway.handler.predicate;

//...

public class AfterRoutePredicateFactory extends AbstractRoutePredicateFactory<AfterRoutePredicateFactory.Config> {

    public static final String DATETIME_KEY = "datetime";

    public AfterRoutePredicateFactory() {
       super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
       return Collections.singletonList(DATETIME_KEY);
    }

    // 主要实现
    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
       // datetime 就是我们配置的日期
       ZonedDateTime datetime = config.getDatetime();
       return exchange -> {
          final ZonedDateTime now = ZonedDateTime.now();
          // 将配置的日期和当前日期比较
          return now.isAfter(datetime);
       };
    }

    public static class Config {
       // 配置信息
    }

}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号