栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【云原生&微服务>SCG网关篇五】Spring Cloud Gateway自定义网关路由Predicate

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【云原生&微服务>SCG网关篇五】Spring Cloud Gateway自定义网关路由Predicate

文章目录
  • 一、前言
  • 二、自定义PredicateFactory
    • 1、自定义参数配置类(TimeBetweenConfig)
    • 2、自定义谓词工厂(TimeBetweenRoutePredicateFactory)
    • 3、修改application.yml配置文件
  • 三、验证
  • 四、总结

一、前言

至此微服务网关系列文章已出:

  1. 【云原生&微服务>SCG网关篇一】为什么要有网关、生产环境如何选择网关
  2. 云原生&微服务>SCG网关篇二】生产上那些灰度发布方式
  3. 【云原生&微服务>SCG网关篇三】Spring Cloud Gateway是什么、详细使用案例
  4. 云原生&微服务>SCG网关篇四】Spring Cloud Gateway内置的11种PredicateFactory如何使用

聊了以下问题:

  1. 为什么要有网关?网关的作用是什么?
  2. 网关的分类?
  3. 网关的技术选型?
  4. 使用网关时常用的灰度发布方式有哪些?
  5. Spring Cloud Gateway是什么?详细使用案例?
  6. Spring Cloud Gateway内置的11种PredicateFactory

本文接着聊如何自定义PredicateFactory,实现网关早九晚六之间才提供路由服务。

PS:SpringCloud版本信息:


    2.4.2
    2020.0.1
    2021.1



    
        
            org.springframework.boot
            spring-boot-dependencies
            ${spring-boot.version}
            pom
            import
        
        
        
            org.springframework.cloud
            spring-cloud-dependencies
            ${spring-cloud.version}
            pom
            import
        
        
        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
            ${spring-cloud-alibaba.version}
            pom
            import
        
    

二、自定义PredicateFactory

路由谓词工厂的命令要求一定要以RoutePredicateFactory结尾。

这里谓词工厂要实现的效果是:限制每天的09:00 – 18:00才能访问路由;想要实现这一效果,需要一个实现自AbstractRoutePredicateFactory的工厂类、一个接收时间参数的配置类,并且需要在application.yml文件中配置这个谓词工厂。

1、自定义参数配置类(TimeBetweenConfig)
package com.saint.gateway.predicate;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalTime;


@Data
@NoArgsConstructor
@AllArgsConstructor
public class TimeBetweenConfig {

    private LocalTime start;

    private LocalTime end;
}
2、自定义谓词工厂(TimeBetweenRoutePredicateFactory)

自定义谓词工厂需要继承自AbstractRoutePredicateFactory,并需要将泛型替换为自己需要接收Yaml文件中参数的配置类;

package com.saint.gateway.predicate;

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;


@Component
public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory {

    public TimeBetweenRoutePredicateFactory() {
        super(TimeBetweenConfig.class);
    }

    
    @Override
    public Predicate apply(TimeBetweenConfig config) {
        LocalTime start = config.getStart();
        LocalTime end = config.getEnd();
        return serverWebExchange -> {
            // 当前时间再start 和 end之间,则允许匹配路由
            LocalTime now = LocalTime.now();
            return now.isAfter(start) && now.isBefore(end);
        };
    }

    
    @Override
    public List shortcutFieldOrder() {
        return Arrays.asList("start", "end");
    }
}
3、修改application.yml配置文件

在application.yml文件中添加TimeBetween 谓词;

server:
  port: 9999
spring:
  cloud:
    gateway:
      routes:
        - id: time_between_route
          uri: http://127.0.0.1:9001
          predicates:
            # 当且仅当请求时的时间在Between配置的时间范围内时,才会匹配到路由进行转发
            - TimeBetween=上午9:00, 下午6:00

这里表情请求仅在早上9点到下午6点之间提供服务,过时不给路由做匹配,全部休息。

三、验证

当前时间:早上7点;随便访问一个地址时,会报错“404 not found”;

假如我们把TimeBetween的时间放开成:上午7:00, 下午6:00,便可以进行路由匹配。

做个验证就行,赶紧改回去,要求是9点之前不提供服务;

四、总结

至此,Spring Cloud Gateway的 Predicate也就告一段落了,后面我们继续看Filter。

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016202.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号