内容简介:网关 Spring-Cloud-Gateway 源码解析 —— 路由(1.3)之 RouteDefinitionRepository 存储器
摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/route-definition-locator-repository/ 「芋道源码」欢迎转载,保留摘要,谢谢!
本文主要基于 Spring-Cloud-Gateway 2.0.X M4
- 1. 概述
- 2. RouteDefinitionWriter
- 3. RouteDefinitionRepository
- 4. InMemoryRouteDefinitionRepository
- 5. GatewayWebfluxEndpoint
- 6. 自定义 RouteDefinitionRepository
- 666. 彩蛋
关注 微信公众号:【芋道源码】 有福利:
- RocketMQ / MyCAT / Sharding-JDBC 所有 源码分析文章列表
- RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
- 您对于源码的疑问每条留言 都 将得到 认真 回复。 甚至不知道如何读源码也可以请教噢 。
- 新的 源码解析文章 实时 收到通知。 每周更新一篇左右 。
- 认真的 源码交流微信群。
1. 概述
本文主要对 RouteDefinitionRepository 的源码实现 。
- 蓝色 部分 :RouteDefinitionRepository 。
本文涉及到的类图如下 :
- 下面我们来逐个类进行解析。
推荐 Spring Cloud 书籍:
- 请支持正版。下载盗版, 等于主动编写低级 BUG 。
- 程序猿DD —— 《Spring Cloud微服务实战》
- 周立 —— 《Spring Cloud与 Docker 微服务架构实战》
- 两书齐买,京东包邮。
2. RouteDefinitionWriter
org.springframework.cloud.gateway.route.RouteDefinitionWriter
,路由配置写入 接口 。该接口定义了 保存 与 删除 两个方法,代码如下 :
public interface RouteDefinitionWriter{ /** * 保存路由配置 * * @param route 路由配置 * @return Mono<Void> */ Mono<Void> save(Mono<RouteDefinition> route); /** * 删除路由配置 * * @param routeId 路由编号 * @return Mono<Void> */ Mono<Void> delete(Mono<String> routeId); }
- 该接口有什么用呢?我们继续往下看。
3. RouteDefinitionRepository
org.springframework.cloud.gateway.route.RouteDefinitionRepository
,存储器 RouteDefinitionLocator 接口 ,代码如下 :
public interface RouteDefinitionRepository extends RouteDefinitionLocator, RouteDefinitionWriter{ }
- 继承 RouteDefinitionLocator 接口 。
- 继承 RouteDefinitionWriter 接口 。
通过实现该接口,实现从 存储器 ( 例如,内存 / Redis / MySQL 等 )读取、保存、删除路由配置。
目前 Spring Cloud Gateway 实现了 基于内存为存储器 的 InMemoryRouteDefinitionRepository 。
4. InMemoryRouteDefinitionRepository
org.springframework.cloud.gateway.route.InMemoryRouteDefinitionRepository
, 基于内存为存储器 的 RouteDefinitionLocator ,代码如下 :
public class InMemoryRouteDefinitionRepository implements RouteDefinitionRepository{ /** * 路由配置映射 * key :路由编号 {@link RouteDefinition#id} */ private final Map<String, RouteDefinition> routes = synchronizedMap(new LinkedHashMap<String, RouteDefinition>()); @Override public Mono<Void> save(Mono<RouteDefinition> route){ return route.flatMap( r -> { routes.put(r.getId(), r); return Mono.empty(); }); } @Override public Mono<Void> delete(Mono<String> routeId){ return routeId.flatMap(id -> { if (routes.containsKey(id)) { routes.remove(id); return Mono.empty(); } return Mono.error(new NotFoundException("RouteDefinition not found: "+routeId)); }); } @Override public Flux<RouteDefinition> getRouteDefinitions(){ return Flux.fromIterable(routes.values()); } }
- 代码比较易懂,瞅瞅就好。
-
InMemoryRouteDefinitionRepository#getRouteDefinitions()
方法的调用,我们已经在 CompositeRouteDefinitionLocator 看到。 -
InMemoryRouteDefinitionRepository#save()
/InMemoryRouteDefinitionRepository#delete()
方法,下面在 GatewayWebfluxEndpoint 可以看到。
5. GatewayWebfluxEndpoint
org.springframework.cloud.gateway.actuate.GatewayWebfluxEndpoint
,提供 管理 网关的 HTTP API 。代码如下 :
@RestController @RequestMapping("${management.context-path:/application}/gateway") public class GatewayWebfluxEndpoint implements ApplicationEventPublisherAware{ /** * 存储器 RouteDefinitionLocator 对象 */ private RouteDefinitionWriter routeDefinitionWriter; // ... 省略代码 }
- 从注解
@RestController
我们可以得知,GatewayWebfluxEndpoint 是一个 Controller 。
GatewayWebfluxEndpoint 有 两个 HTTP API 调用了 RouteDefinitionWriter 的 两个 方法。
-
POST "/routes/{id}"
,保存路由配置,代码如下 :@PostMapping("/routes/{id}") @SuppressWarnings("unchecked") public Mono<ResponseEntity<Void>> save(@PathVariable String id, @RequestBody Mono<RouteDefinition> route) { return this.routeDefinitionWriter.save(route.map(r -> { // 设置 ID r.setId(id); log.debug("Saving route: " + route); return r; })).then(Mono.defer(() -> // status :201 ,创建成功。参见 HTTP 规范 :https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201 Mono.just(ResponseEntity.created(URI.create("/routes/"+id)).build()) )); }
-
例如,HTTP 请求如下 :
http POST :8080/application/gateway/routes/apiaddreqhead uri= http://httpbin.org:80 predicates:=’[“Host=**.apiaddrequestheader.org”, “Path=/headers”]’ filters:=’[“AddRequestHeader=X-Request-ApiFoo, ApiBar”]’
-
-
DELETE "/routes/{id}"
,删除路由配置,代码如下 :@DeleteMapping("/routes/{id}") public Mono<ResponseEntity<Object>> delete(@PathVariable String id) { return this.routeDefinitionWriter.delete(Mono.just(id)) .then(Mono.defer(() -> Mono.just(ResponseEntity.ok().build()))) // 删除成功 .onErrorResume(t -> t instanceof NotFoundException, t -> Mono.just(ResponseEntity.notFound().build())); // 删除失败 }
6. 自定义 RouteDefinitionRepository
使用 InMemoryRouteDefinitionRepository 来维护 RouteDefinition 信息,在网关实例重启或者崩溃后,RouteDefinition 就会丢失。此时我们可以实现 RouteDefinitionRepository 接口 ,以实现例如 MySQLRouteDefinitionRepository 。
通过类似 MySQL 等 持久化 、 可共享 的存储器,也可以带来 Spring Cloud Gateway 实例 集群 获得一致的、相同的 RouteDefinition 信息。
另外,我们看到 RouteDefinitionRepository 初始化的代码如下 :
// GatewayAutoConfiguration.java @Bean // 4.2 @ConditionalOnMissingBean(RouteDefinitionRepository.class) public InMemoryRouteDefinitionRepository inMemoryRouteDefinitionRepository(){ return new InMemoryRouteDefinitionRepository(); }
- 注解
@ConditionalOnMissingBean(RouteDefinitionRepository.class)
,当 不存在 RouteDefinitionRepository 的 Bean 对象时,初始化 InMemoryRouteDefinitionRepository 。也就是说,我们可以初始化自定义的 RouteDefinitionRepository 以 “注入” 。
666. 彩蛋
比较干爽( 水更 )的一篇文章。
胖友,分享一波朋友圈可好!
以上所述就是小编给大家介绍的《网关 Spring-Cloud-Gateway 源码解析 —— 路由(1.3)之 RouteDefinitionRepository 存储器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Clojure软件事务存储器
- 针对亚马逊云存储器S3 BUCKET的渗透测试
- 【Logisim实验】构建立即数-随机存储器-寄存器的传送
- 用go语言来做嵌入式-读写铁电存储器
- Soul 网关发布 2.2.0,让高性能网关变得如此简单!
- 远行API网关(200428)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据挖掘十大算法
(美)吴信东(Xindong Wu)、(美),库玛尔 ,(Vipin Kumar) / 李文波、吴素研 / 清华大学出版社 / 2013-5 / 39.00元
《世界著名计算机教材精选:数据挖掘十大算法》详细介绍了在实际中用途最广、影响最大的十种数据挖掘算法,这十种算法是数据挖掘领域的顶级专家进行投票筛选的,覆盖了分类、聚类、统计学习、关联分析和链接分析等重要的数据挖掘研究和发展主题。《世界著名计算机教材精选:数据挖掘十大算法》对每一种算法都进行了多个角度的深入剖析,包括算法历史、算法过程、算法特性、软件实现、前沿发展等,此外,在每章最后还给出了丰富的习......一起来看看 《数据挖掘十大算法》 这本书的介绍吧!