go夜读之httpRouter

大晚上的睡不着,看了下B站的go夜读52期,看见在讲httpRouter相关的内容,之前在写gin的时候看到有人说过gin的router就是基于HttpRouter演变过来的,于是看了下视频,发现还是挺受用的 于是写篇博文谈下感想(顺便吐槽下 写这篇文章的时候北京时间凌晨2点40左右 真的是名副其实的”夜读”了)
首先谈下起源,httpRouter算是go很经典的拓展之一了,go原生的http.HandleFunc很难满足restefulAPI的要求,当需要根据POST PATCH UPDATE GETURI来获取不同的方法以及参数的时候,原生的handleFunc无法满足取路由变量以及针对不同类型的请求返回不同的值的需求。于是httpRouter诞生了。
httpRouter根据GET HEAD OPTIONS POST PUT PATCH DELETE分别建立了基数树 大概解释下基数树的原理:基数树会根据文本来生成树结构,当只有一个文本来作为节点的时候,这个文本即是根节点,再添加节点会根据文本与根节点的文本重复度来生成子节点。这里借用wiki的一张图来说明

根节点为r节点 r节点有omcom两个子节点,在获取到romanne这个单词的时候,会先查找 r这个根节点,然后找到om开头的子节点,然后an->e节点 这样就能找到romanne这个节点对应的内容了。当需要插入新的节点的时候,比如插入一个名为romanee的节点,会先按照之前的步骤,查找到romane节点 然后在romane下建立一个新的e节点 在这里存储romanee的数据。

在go夜读的视频里还提到了一个问题,就是httpRouter只能支持最多256个节点,视频没有说原因,我看了下源码,在httpRouter的源码里,定义radixTree的节点:

1
2
3
4
5
6
7
8
9
10
type node struct {
path string
wildChild bool
nType nodeType
maxParams uint8
indices string
children []*node
handle Handle
priority uint32
}

这里定义了一个maxParams 也就是最大参数长度,每添加一个参数节点,便会自增1,最大长度便是2**8 =256

httpRouter的原理差不多就是这些,在我了解这块的知识点之前一直以为路由的实现原理是通过正则,(在djangoflask里似乎是这样的),没意识到go和python以及php是完全不同的Http原理,php·的yii2 thinkPhp phalcon都是使用了controller->action的方式 根据控制器->动作 的形式来查找相应方法,相对于httpRouter来说简单很多 也原始很多了。