SpringCloudGateway源码阅读(一)核心概念及路由加载

《一线大厂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++)

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值