我的开源项目的介绍和设计思路

发布日期:2019-05-03

首先放github地址:

 

https://github.com/yangfeixxx/chipsGateway.git

开源项目名:ChipsGateway  (因为我很爱吃薯条)

项目类型:网关

 

下面由本人精分一下自问自答的给大家大概介绍一下此项目吧

问:这个项目是干嘛的?

答:一个服务网关属于半框架半服务可以想象成netflix zuul.

问:此网关相比于其它网关的区别是什么?

答:网关的作用都大同小异不过我会尽量多的添加默认组件并达到最大的可配置化还有相比于Zuul我会尽量让服务对于开发人员更加友善更加侧重于框架的那部分.

 

OK上面是一个大概的介绍现在我再来给大家详细说说我开发这个服务的思路以及流程我会尽量的给大家说清楚我为什么要这样做非常期待大家可以给出建议.

首先关于开发这个网关的动机是我想通过写比较接近底层的开源项目的形式好好将自己学到的所有知识进行一个整合说白了就是练手因为本人从学习编程写第一行HelloWorld开始到现在为止差不多也才一年多的时间吧而这期间学习了非常非常大量的知识但是工作中的项目只能应用一小部分知识而大部分知识都缺少一个实操的环境所以我便想要写一个开源项目以此来学以致用至于我为什么以网关作为自己的第二个开源项目呢?(第一个是一个类加载器 https://github.com/yangfeixxx/hotLoad.git 其实之前也写过ORM框架但是因为单机环境实在是无聊所以写到一半就没写下去了)而因为网关是一个集高并发高性能高拓展三高为一体的服务可以说涉及到了高并发网络编程负载均衡算法等多个细分支知识链因此我选择写一个网关出来.

网关流程和架构涉及思路:

记得爱因斯坦曾说过 (额好像是他)当你想要解决一个问题的时候首先要去搞懂这个问题是什么.所以我们要先搞懂网关是什么它能做什么?

于是我搜索了N多资料最后总结出一条结论所谓的网关就是聚合请求分发请求聚合响应分发响应的一个中间件那么它能解决什么问题呢?这个如果你到网上搜的话保证能搜到一大堆像什么负载均衡动态路由方便配置统一的权限验证等巴拉巴拉的.

但是这些只是现象只是应用不是本质本质是什么?本质就是网关能拦截到多个客户端发送到多个服务端的请求多个服务端发送到多个客户端的响应并针对这些请求和响应进行一个处理.如下面这个图

当我在脑海里形成这样一幅图后我第一个想到的是LogStash没错就是那个ELK里的L不同的是LogStash是点对点的对两个数据源做数据传输的处理而网关则是多对多的做请求响应的处理(当然从一个请求对应一个响应来看也是点对点)

再思考一下像LogStash如果我要对数据进行处理的话我们怎么做呢?答:添加一个过滤器作为过滤链中的一环.

那么我们如果使用面向过滤链这样的思路来设计网关是否可行呢?

思考一下后这是完全可行的因为我完全可以将权限验证动态路由甚至是限流这些都作为过滤链中的一环来进行处理这样做有什么好处呢?

好处就是将处理逻辑完全原子化组件化了这样一样我的所有逻辑都是可插拔的实现了设计模式里提倡的类模块化.

在思考完这些后我便开始着手于流程架构图的制作下面试我第一个草图当然这个草图是有问题的我先不说大家自己思考一下

 

 这个草图的问题在哪呢?那就是我既然定义了FilterChain类那么我的过滤链就不应该直接与数据进行接触了所以我修改了一下

 当然大家如果现在看我的项目源码的话会发现我现在的项目结构并不是如我画的图这样具体是哪样我准备先等第一个版本发布后再画出来因为在开发的过程中我发现事情并没有这么简单实际上因为要考虑可拓展性问题所以我现在的项目架构比我画的图要复杂的多.这里心机一下还请大家关注下我的博客等我发布了第一个能正式运行的版本后会画出来并详细解释每个设计点

时间回到我当时画完第二个草图后当时的我在画完后并没有马上上手而是先观看了和我这个项目类型相同的Zuul网关的源码并分析了其架构设计的优点和缺点.下面是我总结的几点:

优点:使用了preFilterrouterFilterpostFilter 三个逻辑分类将过滤器进行了分类这种思路和我不谋而合

缺点:对于开发人员太不友好开发人员在添加过滤器的时候只能通过RequestContext拿到原生的RequestBodyResponseBody而且preFilter不能强制中断哪怕打上了中断标记也必须要把preFilter全部过完浪费资源没有必要还有就是本身提供的Filter组件并不太多

所以我们取其精华去其糟粕也就是同样使用上述三个逻辑分类并将RequestBody和ResponseBody进行一个包装并注入Filter过滤链在任何时候都可以强制中断并让开发可以拿到中断信息(比如在哪个过滤器被中断的为什么被中断)等....

好了上述这些就是我的大概思路针对于源码的具体设计这些大家可以先拉下我的代码看看等我正式发布第一个版本后会详细的跟大家进行分享.