首先放 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 网关的源码, 并分析了其架构设计的优点和缺点. 下面是我总结的几点:
优点: 使用了 preFilter,routerFilter,postFilter 三个逻辑分类将过滤器进行了分类, 这种思路和我不谋而合
缺点: 对于开发人员太不友好, 开发人员在添加过滤器的时候只能通过 RequestContext 拿到原生的 RequestBody,ResponseBody, 而且 preFilter 不能强制中断, 哪怕打上了中断标记, 也必须要把 preFilter 全部过完, 浪费资源, 没有必要, 还有就是本身提供的 Filter 组件并不太多
所以我们取其精华去其糟粕, 也就是同样使用上述三个逻辑分类, 并将 RequestBody 和 ResponseBody 进行一个包装并注入, Filter 过滤链在任何时候都可以强制中断, 并让开发可以拿到中断信息 (比如在哪个过滤器被中断的, 为什么被中断) 等....
好了, 上述这些就是我的大概思路, 针对于源码的具体设计这些大家可以先拉下我的代码看看, 等我正式发布第一个版本后, 会详细的跟大家进行分享.
来源: https://www.cnblogs.com/yangfeiORfeiyang/p/9621909.html