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

网友投稿 274 2022-11-28

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

文章目录

​​一、前言​​​​二、自定义PredicateFactory​​

​​1、自定义参数配置类(TimeBetweenConfig)​​​​2、自定义谓词工厂(TimeBetweenRoutePredicateFactory)​​​​3、修改application.yml配置文件​​

​​三、验证​​​​四、总结​​

一、前言

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

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

聊了以下问题:

为什么要有网关?网关的作用是什么?网关的分类?网关的技术选型?使用网关时常用的灰度发布方式有哪些?Spring Cloud Gateway是什么?详细使用案例?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;/** * time parameter config * * @author Saint */@Data@NoArgsConstructor@AllArgsConstructorpublic 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;/** * Customized time between route predicate factory * * @author Saint */@Componentpublic class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory { public TimeBetweenRoutePredicateFactory() { super(TimeBetweenConfig.class); } /** * 控制路由的条件 * * @param config * @return */ @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); }; } /** * 用来配置控制类和yaml配置文件的映射关系 * * @return */ @Override public List shortcutFieldOrder() { return Arrays.asList("start", "end"); }}

3、修改application.yml配置文件

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

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

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

三、验证

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

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

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

四、总结

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MEMS麦克风市场及专利态势分析
下一篇:【云原生&微服务>SCG网关篇一】为什么要有网关、生产环境如何选择网关
相关文章

 发表评论

暂时没有评论,来抢沙发吧~