《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
@Override
public Publisher apply(T t) {
return Mono.from(left.apply(t)).flatMap(
result -> result ? Mono.just(true) : Mono.from(right.apply(t)));
}
}
}
复制代码
路由过滤器GatewayFilter
==================
针对于路由的过滤器,无法离开Route而存在。
public interface GatewayFilter extends ShortcutConfigurable {
Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
复制代码
全局过滤器GlobalFilter
=================
全局的过滤器,所有路由都必须执行的过滤器。后续Bean实例化的时候,会适配成GatewayFilter被使用。
public interface GlobalFilter {
Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
复制代码
过滤器链GatewayFilterChain
======================
GatewayFilterChain过滤器链允许GatewayFilter过滤器按顺序,挨个执行。
public interface GatewayFilterChain {
Mono filter(ServerWebExchange exchange);
}
复制代码
路由定义RouteDefinition
===================
类似于Spring的BeanDefinition,Route的一种构建方式就是通过RouteDefinition,比如从properties文件中解析得到的路由规则定义。
public class RouteDefinition {
// 唯一id
private String id;
// 断言定义
private List predicates = new ArrayList<>();
// 过滤器定义
private List filters = new ArrayList<>();
// 跳转uri
private URI uri;
// 元数据
private Map<String, Object> metadata = new HashMap<>();
// Spring优先级
private int order = 0;
}
复制代码
断言定义PredicateDefinition
=======================
从配置文件加载的断言定义,构造Route时,会用RoutePredicateFactory#applyAsync转换成AsyncPredicate。
public class PredicateDefinition {
private String name;
private Map<String, String> args = new LinkedHashMap<>();
public PredicateDefinition() {
}
// predicates:
// - Path=/echo // 解析’Path=/echo’放入args
public PredicateDefinition(String text) {
int eqIdx = text.indexOf(‘=’);
// 设置name
setName(text.substring(0, eqIdx));
String[] args = tokenizeToStringArray(text.substring(eqIdx + 1), “,”);
// 设置args
for (int i = 0; i < args.length; i++) {
this.args.put(NameUtils.generateName(i), args[i]);
}
}
}
复制代码
路由过滤器定义FilterDefinition
=======================
从配置文件加载的路由过滤器定义,构造Route时,会用GatewayFilterFactory#apply转换为GatewayFilter。
public class FilterDefinition {
private String name;
private Map<String, String> args = new LinkedHashMap<>();
public FilterDefinition() {
}
// 解析配置文件 PrefixPath=/httpbin
public FilterDefinition(String text) {
int eqIdx = text.indexOf(‘=’);
if (eqIdx <= 0) {
setName(text);
return;
}
setName(text.substring(0, eqIdx));
String[] args = tokenizeToStringArray(text.substring(eqIdx + 1), “,”);
for (int i = 0; i < args.length; i++)