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

本文深入剖析SpringCloudGateway的路由加载机制,从RouteDefinition类开始,涵盖PredicateDefinition(断言定义)、FilterDefinition(过滤器定义)以及如何通过RouteDefinitionLocator和RouteLocator获取和处理路由。重点讲解了CachingRouteLocator如何缓存和刷新路由,以及RouteDefinitionRouteLocator如何将RouteDefinition转化为实际路由。
摘要由CSDN通过智能技术生成

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++) {

this.args.put(NameUtils.generateName(i), args[i]);

}

}

}

复制代码

获取路由定义RouteDefinitionLocator

============================

RouteDefinitionLocator具有获取路由定义的能力。

public interface RouteDefinitionLocator {

Flux getRouteDefinitions();

}

复制代码

最后对外暴露的实际是CompositeRouteDefinitionLocator,他组合了所有RouteDefinitionLocator。

![](https://img-blog.csdnimg.cn/img_convert/b075e72cebbb8c 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 da7634379b698c2012.png)

获取路由RouteLocator

================

RouteLocator具有获取路由R

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值