前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那些年我做的开源项目之web篇

那些年我做的开源项目之web篇

作者头像
太白技术
发布2022-09-01 14:33:31
4980
发布2022-09-01 14:33:31
举报
文章被收录于专栏:太白技术太白技术

你好,我是太白。

今天和你聊聊我做过的开源项目的那些事。本文是web篇。

  • 前言
  • 1 Tastphp
    • 背景
    • 架构设计
  • 2 Tastjava
  • 3 Gorouter
    • 开发动机
    • 支持的特性
    • 设计思路
    • 值得提的

前言

本文将按照笔者开发的时间线分享给你,分别是Tastphp、Tastjava、Gorouter,他们分别是用PHP、Java、Go开发,也是笔者在不同时间段对不同语言的使用以及尝试。

本文是笔者对过去web方向做的开源项目的一个总结。

1 Tastphp

背景

这个项目是一个PHP框架。目前我已经没有在维护。当时我做PHP研发已经3年左右,接触过不少框架,包括Codeigniter、Symfony、Laravel、Thinkphp等。当时觉得主流的框架,大而全,很多组件都用不到,并尝试开发自己的框架,想不到仅仅几天就开发了第一版,命名成Tastphp,并在公司内部又迭代了几个版本。并于2017年1月份开源(当然开源只是框架,剥离了业务部分的)。虽然是PHP写的,但是很多思路是共通的。

这个项目我还设计了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月开源的。

它是基于Jersey[3]。其实本质上和Tastphp是同一个东西,只是当时在自学Java,有了这个项目。它的核心组件是iocaop,对应Tastphp就是DImiddleware。所以我就不展开了,只是时间线上我开发了这个项目,提一下。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 太白技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1 Tastphp
    • 背景
      • 架构设计
      • 2 Tastjava
      • 3 Gorouter
        • 开发动机
          • 支持的特性
            • 设计思路
              • 值得提的
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档