HttpRouter源码分析
- 简单来说, httprouter 的 router 维护了⼀个 trees(树) ,它是⼀个map。这个map的 key 就是各种HTTP请求⽅法,对应的值就是⼀个 node(节点) 。也就是路由器为每个请求⽅法管理⼀个单独的树。
httprouter路由原理
- 路由器依赖于⼤量使⽤通⽤前缀的树结构,它基本上是⼀个紧凑的前缀树(或只是基数树)。具有公共前缀的节点也共享⼀个公共的⽗节点。
举例:
router := httprouter.New()
router.GET("/search/", func1)
router.GET("/support/", func2)
router.GET("/blog/:post/", func3)
router.GET("/about-us/", func4)
router.GET("/about-us/team/", func5)
router.GET("/contact/", func6)
路由树:
Priority Path Handle
9 \ *<1>
3 !s nil
2 |!earch\ *<2>
1 |"upport\ *<3>
2 !blog\ *<4>
1 | ":post nil
1 | "\ *<5>
2 !about-us\ *<6>
1 | "team\ *<7>
1 "contact\ *<8>
- 路由器为每个请求⽅法管理⼀个单独的树,它⽐在每个节点中保存⼀个⽅法(>句柄映射)更节省空间,它还允许我们在开始查找前缀树之前极⼤地减少路由问题。
- 为了获得更好的可伸缩性,每个树级别上的⼦节点都按Priority(优先级) 排序,其中优先级(最左列)就是在⼦节点(⼦节点、⼦⼦节点等等)中注册的句柄的数量。
为什么不用哈希
- 因为URL中存在不确定的字符串,不是一个确定的URL