至此微服务网关系列文章已出:
聊了以下问题:
- 为什么要有网关?网关的作用是什么?
- 网关的分类?
- 网关的技术选型?
- 使用网关时常用的灰度发布方式有哪些?
- 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
路由谓词工厂的命令要求一定要以RoutePredicateFactory结尾。
这里谓词工厂要实现的效果是:限制每天的09:00 – 18:00才能访问路由;想要实现这一效果,需要一个实现自AbstractRoutePredicateFactory的工厂类、一个接收时间参数的配置类,并且需要在application.yml文件中配置这个谓词工厂。
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
@AllArgsConstructor
public class TimeBetweenConfig {
private LocalTime start;
private LocalTime end;
}
自定义谓词工厂需要继承自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
*/
@Component
public 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");
}
}
在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。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦