一.断言的其他方式
在项目启动的时候可以发现,断言的方式不止path一种。
方式 | 例子 |
After | After=2021-01-20T17:42:47.789-07:00[America/Denver] |
Before | Before=2021-01-20T17:42:47.789-07:00[America/Denver] |
Between | 2021-01-20T17:42:47.789-07:00[America/Denver],2021-04-20T17:42:47.789-07:00[America/Denver] |
Cookie | Cookie=chocolate, ch.p |
Header | Header=X-Request-Id, \d+ |
Host | Host=**.somehost.org |
Method | Method=GET |
Path | Path=/foo/{segment} |
Query | Query=baz |
RemoteAddr | RemoteAddr=192.168.1.1/24 |
举例:
使用Method断言,使得post方法请求才能通过断言这是GET请求
这是POST请求
ps:时间的获取方法:
二.自定义断言
/**
* 这是一个自定义的路由断言工厂类,要求有两个
* 名字必须是 配置+RoutePredicateFactory 本类的配置字段是MoreThanAge
* 必须继承 AbstractRoutePredicateFactory <配置类>
*/
@Component
public class MoreThanAgeRoutePredicateFactory extends AbstractRoutePredicateFactory<MoreThanAgeRoutePredicateFactory.Config> {
public MoreThanAgeRoutePredicateFactory() {
super(MoreThanAgeRoutePredicateFactory.Config.class);
}
/**
* 读取配置文件的中参数值 给他赋值到配置类中的属性上
* @return 配置类的数据
*/
public List<String> shortcutFieldOrder() {
return Collections.singletonList("age");
}
/**
* 断言逻辑的具体内容
* @param config 当前断言的配置读取
* @return 断言结果
*/
public Predicate<ServerWebExchange> apply(MoreThanAgeRoutePredicateFactory.Config config) {
return new GatewayPredicate() {
public boolean test(ServerWebExchange serverWebExchange) {
String age = serverWebExchange.getRequest().getQueryParams().getFirst("paramaAge");
return Integer.valueOf(age).intValue()>config.getAge().intValue();
}
};
}
/**
* 读取配置文件中的配置,按顺序配置参数
*/
public static class Config {
private Integer age;
public Config() {
}
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
}
}
配置
自定义的属性名称 + RoutePredicateFactory 这个是固定用法
三.过滤器
(1) 过滤器的生命周期
Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那么丰富,它只有两个:“pre” 和 “post”。
PRE : 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择
请求的微服务、记录调试信息等。
POST :这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP
Header、收集统计信息和指标、将响应从微服务发送给客户端等。
( 2) 过滤器类型
Spring Cloud Gateway 的 Filter 从作用范围可分为另外两种GatewayFilter 与 GlobalFilter。
GatewayFilter :应用到单个路由或者一个分组的路由上。
GlobalFilter :应用到所有的路由上。
局部过滤器是针对单一路由的,并不经常使用,我们使用比较多的是全局过滤器。个人认为,gateway的本质就是一个过滤器链。因为其内部就是各种过滤器组合起来实现的。
例子
@Component
public class TokenFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String token = request.getHeaders().getFirst("token");
if(token==null || token.length()<=0){
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
/**
* 指定过滤器的执行顺序 , 返回值越小,执行优先级越高
*/
@Override
public int getOrder() {
return 0;
}
}
过滤器需要实现GlobalFilter, Ordered两个接口
其中getOrder方法返回值越小执行的优先级越高,类似@Order()注解