前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂

Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂

作者头像
小小工匠
发布2022-02-14 08:48:06
4490
发布2022-02-14 08:48:06
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

文章目录

在这里插入图片描述
在这里插入图片描述

需求

在这里插入图片描述
在这里插入图片描述

我们看了官方提供的几个例子,如果都不满足呢?

举个例子: 实现一个类似 12306订票管控的需求: 早上6点到23点,才允许业务进行。

三部曲

第一步 搞配置类

代码语言:javascript
复制
package com.artisan.custom;

import lombok.Data;

import java.time.LocalTime;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2022/2/14 0:21
 * @mark: show me the code , change the world
 */


@Data
public class CustomTimeBetweenConfig {

    private LocalTime startTime;

    private LocalTime endTime;
}

第二步 搞自定义谓词工厂

类名必须要以RoutePredicateFactory结尾,然后继承AbstractRoutePredicateFactory

代码语言:javascript
复制
package com.artisan.custom;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.time.LocalTime;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2022/2/14 0:20
 * @mark: show me the code , change the world
 */

@Component
@Slf4j
public class CustomTimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomTimeBetweenConfig> {

    public CustomTimeBetweenRoutePredicateFactory() {
        super(CustomTimeBetweenConfig.class);
    }


    /***
     *  真正的业务判断逻辑
     * @param config
     * @return
     */
    @Override
    public Predicate<ServerWebExchange> apply(CustomTimeBetweenConfig config) {

        LocalTime startTime = config.getStartTime();

        LocalTime endTime = config.getEndTime();

        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                LocalTime now = LocalTime.now();
                //判断当前时间是否在在配置的时间范围类
                return now.isAfter(startTime) && now.isBefore(endTime);
            }
        };

    }

    /**
     * 用于接受yml中的配置CustomTimeBetween=上午6:00,下午11:00
     *
     * @return
     */
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("startTime", "endTime");
    }

 
}

第三部 搞配置

在yml配置中谓词配置是以我们自定义类CustomTimeBetweenRoutePredicateFactory 去除了RoutePredicateFactory接受开头CustomTimeBetween

application-custom.yml

代码语言:javascript
复制
# 自定义谓词工厂
spring:
  cloud:
    gateway:
      routes:
        - id: custom-timeBetween #id必须要唯一
          uri: lb://artisan-cloud-gateway-order
          predicates:
            #当前请求的时间必须在早上6点到 晚上11点 http://localhost:8888/selectOrderInfoById/1
            #才会被转发
            #到http://artisan-cloud-gateway-order/selectOrderInfoById/1
            - CustomTimeBetween=上午06:00,下午11:00

激活profile

在这里插入图片描述
在这里插入图片描述

验证

代码语言:javascript
复制
   public static void main(String[] args) {
        System.out.println(LocalTime.now());
    }

现在是

在这里插入图片描述
在这里插入图片描述

访问肯定不行

debug走下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

改改时间 符合规则 试试能行吗

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

OK, 妥妥的实现了


源码

https://github.com/yangshangwei/SpringCloudAlibabMaster

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 需求
  • 三部曲
    • 第一步 搞配置类
      • 第二步 搞自定义谓词工厂
        • 第三部 搞配置
          • 验证
          • 源码
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档