当前位置: 首页 > 工具软件 > HttpRouter > 使用案例 >

HttpRouter源码分析

封飞
2023-12-01

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
 类似资料: