Spring 学习SpringCloud

spring-cloud-gateway之架构设计

2019-04-25  本文已影响124人  Lance_Xu

spring-cloud-gateway作为cloud体系的一员,其设计思想非常巧妙,项目leader是spring开源主要作者之一的Spencer Gibb

一、项目pom依赖

我们首先从gateway的dependencies查看其所依赖项,gateway本身对spring-boot-starter有依赖,gateway在微服务架构体系当中也是以Java 进程的方式而存在,这样我们在做二次元开发时可以不需要再次依赖此项;gateway-core的源码采用流表达式编码,这里要求我们的jdk保持在1.8版本以上以及对reactor异步模型有初步认知;其次对eureka的引入,默认采用eureka为服务注册中心;还有其他的引入比如redis、hystrix等均为功能功能性必要依赖。

spring-cloud-gateway-core 依赖项截图

二、工程结构解读

如图工程代码结构非常的清晰和明确,这得益于作者的优秀设计思想,采用工厂模式、门面模式等优秀的代码设计。

spring-cloud-gateway 工程结构
  1. actuate
    actuate 包下GatewayControllerEndpoint.java是一个内嵌endpoint监控api管理类,方便通过api来观察当前的routes配置和filter配置信息;其中有个POST(/routes/{id})可以运行时添加route配置。spring-boot和spring-cloud内嵌的管理类api的设计初衷便是为了方便与管理类平台集成,比如spring-cloud-admin。


  2. config
    config包下是gateway工程配置类或者项目启动初始化类, 分类和命名都非常的清晰,通过类名便可知道其中的内部作用,其包内类图如图所示:


  1. discovery
    discovery包其实跟config包作用很类似,主要是服务发现方面的配置以及服务发现逻辑实现。


    image.png
  1. event
    此包定义进程的事件封装,所有类都继承至ApplicationEvent抽象类,这是spring框架的内部标准,这个标准也是继承了jdk的EventObject,至于集成spring开发的应用如果需要采用事件发布订阅或者观察者模式等最好也实现该抽象类;抽象类没有抽象方法的约束,只有一个时间戳的mark字段,对具体实现没有任何影响。


    image.png
  1. filter
    filter包是gateway的核心实现(代码解读放在后续文章)。
    filter包一级目录是全局过滤器的实现,均实现了GlobalFilter接口和Ordered接口;
    factory包下是基于工厂模式实现的工厂过滤器,为可配置的过滤器,可针对服务粒度进行可选配置,或者在代码中能够实现api级别的过滤;
    headers包针对Http header层面的过滤器,这正常情况运用不到;
    retelimit包下是基于redis+lua scriptde的限流实现。


    image.png
  2. handler
    此包下主要是Predicate类工厂声明,在配置路由设置断言的时候常用来断言path、header、method等(源码解读放在后续文章)。


    image.png
  1. route
    路由层的抽象与定义,这个与下游服务配置深度绑定,可以想象将一个服务实例抽象为一个RouteDefinition,然后为此route增加其predicate和filter等抽象配置。


    image.png image.png
  1. support
    工具包,里面有各种filter逻辑和配置初始化所用的工具类,等同于我们平常的util包。


    image.png

三、结语

本篇文章旨在剖析spring-cloud-gateway-core工程下的结构,总结下来其实我觉得最大的收获是开源作者对于代码的合理设计使得包结构非常的简洁清晰,值得广大Java爱好者学习,能够深化行为和命名注释至自己的code当中;其次对于actuate、config、discovery、event简单包下的源码做了解读,后续章节将会重点专注与filter、handler和route下源码的解读,也是gateway框架架构设计精华部分。

附:基于spring-cloud-gateway增强实现参考enhance-gateway

上一篇 下一篇

猜你喜欢

热点阅读