你好,我是太白。
今天和你聊聊我做过的开源项目的那些事。本文是web篇。
- 前言
- 1 Tastphp
- 背景
- 架构设计
- 2 Tastjava
- 3 Gorouter
- 开发动机
- 支持的特性
- 设计思路
- 值得提的
前言
本文将按照笔者开发的时间线分享给你,分别是Tastphp、Tastjava、Gorouter,他们分别是用PHP、Java、Go开发,也是笔者在不同时间段对不同语言的使用以及尝试。
本文是笔者对过去web方向做的开源项目的一个总结。
1 Tastphp
背景
Tastphp
这个项目我还设计了logo:
架构设计
Tastphp框架分为骨架部分 Tastphp skeleton[1]+内核部分 Tastphp framework core[2]
主要讲下内核部分,骨架只是根据需要做了二次封装,加了一些代码分层的目录和console控制台的部分。
核心组件包括DI(依赖注入)、Event(事件)、Router(路由)、Logger(日志)、DBAL(数据抽象层)、Cache(缓存)、Queue(队列)等。
核心思路
DI(依赖注入)Event-driven(事件驱动)
一个完整的HTTP生命周期,本质上是接受Request请求,对于请求的处理,再返回Response。所以框架的设计是基于事件驱动的,而依赖注入为了解决依赖其他组件服务的耦合问题。
核心流程图如下:
2 Tastjava
这个项目是Java开发的Web框架,是2017年8月开源的。
iocaopDImiddleware
3 Gorouter
gorouter[4]是Go开发的一个简单高性能的HTTP router。是在2018年1月开源的,当天就上了Github Go趋势榜。(项目情况:这个项目API稳定,已经很久没有更新)
下面截图是我自己blog上截取的:
开发动机
这个是我在项目的README中写的motivation(动机)
I wanted a simple and fast HTTP GO router, which supports regexp. I prefer to support regexp is because otherwise it will need the logic to check the URL parameter type, thus increasing the program complexity. So I did some searching on Github and found the wonderful julienschmidt/httprouter: it is very fast,unfortunately it does not support regexp. Later I found out about gorilla/mux: it is powerful as well,but a written benchmark shows me that it is somewhat slow. So I tried to develop a new router which both supports regexp and should be fast. Finally I did it and named xujiajun/gorouter. By the way, this is my first GO open source project. It may be the fastest GO HTTP router which supports regexp, and regarding its performance please refer to my latest Benchmarks.
大致意思:
我想要一个简单而快速并且支持regexp正则表达式的HTTP GO路由器。
我喜欢路由支持regexp,因为否则它将需要逻辑来检查URL参数类型,从而增加了程序的复杂性。
所以我在Github上做了一些搜索,发现了很棒的julienschmidt/httprouter[5]:它非常快,不幸的是它不支持regexp。后来我发现了gorilla/mux[6]:它也很强大,但是一个编写的基准测试显示它有点慢。
因此,我试图开发一个既支持regexp又应该速度很快的新路由器。最后我做到了,并命名为xujiajun/gorouter[7]。顺便说一下,这是我的第一个GO开源项目。它可能是最快的GO HTTP路由器支持regexp,关于它的性能,请参考我最新的基准。
支持的特性
基本上常用路由功能都实现了,包括参数匹配、路由组、反向路由等。(具体参考gorouter features)
设计思路
我发现把"/" 作为分割,形成每一个段,正好可以当做树的一个节点,然后要支持正则,每个段也可以自定义规则。类似压缩版本的 trie[8]。标准版本的trie,每个字符都要存节点,比较浪费空间,而且分支比较多。还有一种作法是Radix_tree[9],又叫紧凑前缀树,也是一种压缩trie的实现。
下图摘自wiki百科,对trie的演示:
下面图帮大家演示路由的存储结构:
值得提的
1、首先感谢那些贡献者,来贡献这个项目
详见:https://github.com/xujiajun/gorouter/graphs/contributors,感谢
2、一些Issure:
特地来说一声感谢[10]
这位网友专门来感谢我,很开心
Benchmark is not (only) measuring the routing cost[11]
httprouter作者julienschmidt给我提了个issure关于benchmark的问题。关于这个我想到一个很好的标题,叫《万星大佬给我提了一个issue》,这个标题怎么样?
3、外部发声
"Go夜读"做了分享。第 19 期 2018-11-08 如何开发一个简单高性能的 http router 及 gorouter 源码分析[12]
4、外界评价
Golang教科书般的web router框架[13]
我很怀疑这位同学是我的托,这个标题写的,给我的项目说的这么好。不过话说回来,做为练手项目gorouter还是比较适合学习的。 参考资料
[1]Tastphp skeleton: https://github.com/tastphp/tastphp
[2]TastPHP framework core: https://github.com/tastphp/framework
[3]Jersey: https://eclipse-ee4j.github.io/jersey/
[4]Gorouter: https://github.com/xujiajun/gorouter
[5]julienschmidt/httprouter: https://github.com/julienschmidt/httprouter
[6]mux: https://github.com/gorilla/mux
[7]xujiajun/gorouter: https://github.com/xujiajun/gorouter
[8]Trie: https://en.wikipedia.org/wiki/Trie
[9]Radix_tree: https://en.wikipedia.org/wiki/Radix_tree
[10]特地来说一声感谢: https://github.com/xujiajun/gorouter/issues/55
[11]Benchmark is not (only) measuring the routing cost: https://github.com/xujiajun/gorouter/issues/24
[12]第 19 期 2018-11-08 如何开发一个简单高性能的 http router 及 gorouter 源码分析: https://talkgo.org/t/topic/38
[13]Golang教科书般的web router框架: https://cloud.tencent.com/developer/news/342586