007-spring cloud gateway-GatewayAutoConfiguration核心配置-RouteDefinition初始化加载
一、RouteDefinitionLocator
在Spring-Cloud-Gateway的GatewayAutoConfiguration初始化加载中会加载RouteDefinitionLocator(路由定义信息加载器)信息。
//初始化配置路由定义加载器
@Bean
@ConditionalOnMissingBean
public PropertiesRouteDefinitionLocator propertiesRouteDefinitionLocator(GatewayProperties properties) {
return new PropertiesRouteDefinitionLocator(properties);
} //初始化存储路由定义加载器
@Bean
@ConditionalOnMissingBean(RouteDefinitionRepository.class)
public InMemoryRouteDefinitionRepository inMemoryRouteDefinitionRepository() {
return new InMemoryRouteDefinitionRepository();
} //初始化聚合路由定义加载器
@Bean
@Primary
public RouteDefinitionLocator routeDefinitionLocator(List<RouteDefinitionLocator> routeDefinitionLocators) {
return new CompositeRouteDefinitionLocator(Flux.fromIterable(routeDefinitionLocators));
}
查看RouteDefinitionLocator源码
/**
* 路由定义信息的定位器,
* 负责读取路由配置( org.springframework.cloud.gateway.route.RouteDefinition
* 子类实现类
* 1.CachingRouteDefinitionLocator -RouteDefinitionLocator包装类, 缓存目标RouteDefinitionLocator 为routeDefinitions提供缓存功能
* 2.CompositeRouteDefinitionLocator -RouteDefinitionLocator包装类,组合多种 RouteDefinitionLocator 的实现,为 routeDefinitions提供统一入口
* 3.PropertiesRouteDefinitionLocator-从配置文件(GatewayProperties 例如,YML / Properties 等 ) 读取RouteDefinition
* 4.DiscoveryClientRouteDefinitionLocator-从注册中心( 例如,Eureka / Consul / Zookeeper / Etcd 等 )读取RouteDefinition
* 5.RouteDefinitionRepository-从存储器( 例如,内存 / Redis / MySQL 等 )读取RouteDefinition
*/ public interface RouteDefinitionLocator { /** * 获取RouteDefinition */ Flux<RouteDefinition> getRouteDefinitions(); }
RouteDefinitionLocator接口只有一个方法getRouteDefinitions,此方法获取RouteDefinition的核心方法,返回Flux<RouteDefinition>
1.1、PropertiesRouteDefinitionLocator--从配置文件读取定义定位器
// 从Properties(GatewayProperties)中加载RouteDefinition信息
public class PropertiesRouteDefinitionLocator implements RouteDefinitionLocator { // 从appliccation.yml中解析前缀为spring.cloud.gateway的配置
private final GatewayProperties properties; public PropertiesRouteDefinitionLocator(GatewayProperties properties) {
this.properties = properties;
} @Override
public Flux<RouteDefinition> getRouteDefinitions() {
return Flux.fromIterable(this.properties.getRoutes());
}
}
- GatewayProperties 在GatewayProperties初始化加载,参看:
- Flux 响应式编程
1.2、CachingRouteDefinitionLocator--缓存路由定义定位器
// RouteDefinitionLocator 包装实现类,实现了路由定义的本地缓存功能
public class CachingRouteDefinitionLocator implements RouteDefinitionLocator { // 实际路由定义定位器
private final RouteDefinitionLocator delegate; private final Flux<RouteDefinition> routeDefinitions; // 路由定义的本地缓存
private final Map<String, List> cache = new HashMap<>(); public CachingRouteDefinitionLocator(RouteDefinitionLocator delegate) {
this.delegate = delegate;
routeDefinitions = CacheFlux.lookup(cache, "routeDefs", RouteDefinition.class)
.onCacheMissResume(() -> this.delegate.getRouteDefinitions()); }
}
1.3、DiscoveryClientRouteDefinitionLocator--配置中心路由定义定位器
public class DiscoveryClientRouteDefinitionLocator implements RouteDefinitionLocator {
//* 注册中心客户端
private final DiscoveryClient discoveryClient;
//* 本地配置信息
private final DiscoveryLocatorProperties properties;
//* 路由ID前缀
private final String routeIdPrefix;
public DiscoveryClientRouteDefinitionLocator(DiscoveryClient discoveryClient, DiscoveryLocatorProperties properties) {
this.discoveryClient = discoveryClient;
this.properties = properties;
if (StringUtils.hasText(properties.getRouteIdPrefix())) {
this.routeIdPrefix = properties.getRouteIdPrefix();
} else {
this.routeIdPrefix = this.discoveryClient.getClass().getSimpleName() + "_";
}
}
//* 通过注册中心查找服务组装路由定义信息
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
//...
}
}
1.4、CompositeRouteDefinitionLocator--各个定位器合并提供统一的getRouteDefinitions方法入口
// 组合多个 RouteDefinitionLocator 的实现,为 routeDefinitions提供统一入口
public class CompositeRouteDefinitionLocator implements RouteDefinitionLocator { /**
* 所有路由定义定位器实例集合
*/
private final Flux<RouteDefinitionLocator> delegates; public CompositeRouteDefinitionLocator(Flux<RouteDefinitionLocator> delegates) {
this.delegates = delegates;
} @Override
public Flux<RouteDefinition> getRouteDefinitions() {
//将各个RouteDefinitionLocator的getRouteDefinitions合并返回统一的Flux<RouteDefinition>
return this.delegates.flatMap(RouteDefinitionLocator::getRouteDefinitions);
}
}
综合上述

PropertiesRouteDefinitionLocator-->|配置文件加载初始化| 、RouteDefinitionRepository-->|存储器中加载初始化|、DiscoveryClientRouteDefinitionLocator-->|注册中心加载初始化|
最终提供通过CompositeRouteDefinitionLocator提供统一的getRouteDefinitions方法
其中GatewayDiscoveryClientAutoConfiguration如下
@Configuration
@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true)
@AutoConfigureBefore(GatewayAutoConfiguration.class)
@ConditionalOnClass({DispatcherHandler.class, DiscoveryClient.class})
@EnableConfigurationProperties
public class GatewayDiscoveryClientAutoConfiguration { //初始化注册中心路由定义定位器
@Bean
@ConditionalOnBean(DiscoveryClient.class)
@ConditionalOnProperty(name = "spring.cloud.gateway.discovery.locator.enabled")
public DiscoveryClientRouteDefinitionLocator discoveryClientRouteDefinitionLocator(
DiscoveryClient discoveryClient, DiscoveryLocatorProperties properties) {
return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties);
}
}
007-spring cloud gateway-GatewayAutoConfiguration核心配置-RouteDefinition初始化加载的更多相关文章
- 006-spring cloud gateway-GatewayAutoConfiguration核心配置-GatewayProperties初始化加载、Route初始化加载
一.GatewayProperties 1.1.在GatewayAutoConfiguration中加载 在Spring-Cloud-Gateway初始化时,同时GatewayAutoConfigur ...
- spring cloud gateway的stripPrefix配置
序 本文主要研究下spring cloud gateway的stripPrefix配置 使用zuul的配置 zuul: routes: demo: sensitiveHeaders: Access-C ...
- 利用spring的ApplicationListener实现springmvc容器的初始化加载--转
1.我们在使用springmvc进行配置的时候一般初始化都是在web.xml里面进行的,但是自己在使用的时候经常会测试一些数据,这样就只有加载spring-mvc.xml的配置文件来实现.为了更方便的 ...
- 利用spring的ApplicationListener实现springmvc容器的初始化加载
1.我们在使用springmvc进行配置的时候一般初始化都是在web.xml里面进行的,但是自己在使用的时候经常会测试一些数据,这样就只有加载spring-mvc.xml的配置文件来实现.为了更方便的 ...
- Spring Cloud Gateway(三):网关处理器
1.Spring Cloud Gateway 源码解析概述 API网关作为后端服务的统一入口,可提供请求路由.协议转换.安全认证.服务鉴权.流量控制.日志监控等服务.那么当请求到达网关时,网关都做了哪 ...
- Spring Cloud Gateway实战之二:更多路由配置方式
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- spring Cloud网关之Spring Cloud Gateway
Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...
- Spring Cloud Gateway应用篇(十三)
一.概述 在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成.其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能. ...
- Spring Cloud Gateway 全局通用异常处理
为什么需要全局异常处理 在传统 Spring Boot 应用中, 我们 @ControllerAdvice 来处理全局的异常,进行统一包装返回 // 摘至 spring cloud alibaba c ...
随机推荐
- JSP基本用法(二)隐含对象
一.摘要 在JSP容器中生成的Servlet类的_jspService()方法中,定义了几个对象,在编写JSP页面时我们可以使用这些隐含对象. PageContext pageContext = nu ...
- Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)
...
- 利用pdb获取未导出符号
BOOL InitSymHandler(HANDLE hProc) { CHAR SymPath[MAX_PATH], CurDir[MAX_PATH]; GetCurrent ...
- GitHub上整理的一些工具【转载】
技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...
- Makefile 链接静态库
Linux的静态库是以.a结尾的,要连接静态库有两种方法,一种是在编译命令最后直接加上库路径/库名称. 例如你的库在绝对目录/lib/libtest.a下面你就可以这样来编译$(CC) $(CFLAG ...
- sencha touch 在线实战培训 第一期 第七节
2014.1.13晚上8点过一点开的课 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内容: 非结构化数据传输 通过js调取phonegap实现图片采集.上 ...
- Javascript 变态题解析
读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了.... 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变 ...
- 2-3 vue配置介绍
一.通过vue-cli构建的项目的文件介绍 1.bulid文件夹 ==> 项目打包的配置文件夹 2.config文件夹 ==> 打包的配置 3.src文件夹 ==> 项目开发的源码 ...
- 23种设计模式之责任链模式(Chain of Responsibility)
责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受, ...
- 彻底关闭window10 专业版 企业版 windows defender
按照上面图中的,关闭windows defender 设置为已启用,这样就可以彻底关闭 windows defender了