fiber 使用自研基数树(radix tree)组织路由节点,按路径段共享前缀、区分静态/参数(:id)/通配(*path)节点,查找复杂度接近o(k);参数节点不阻断前缀共享但同级同类型参数会覆盖,通配节点仅允许末尾出现且覆盖同级其他节点。

Radix Tree 在 Fiber 中如何组织路由节点
Fiber 的 Engine 内部使用自研的基数树(radix tree)管理 HTTP 路径,不是标准库的 http.ServeMux 那种线性匹配,也不是基于正则的暴力遍历。它的每个节点只存公共前缀,分支按字符(非通配符)或特殊标记(如 :、*)切分,路径查找时间复杂度接近 O(k),k 是路径长度。
比如 /api/users、/api/posts、/api/v2/users 会共享 /api 节点,而 /api/:id 和 /api/*path 会被识别为参数节点和通配节点,不参与纯字符串匹配,而是延迟到运行时解析。
关键点:
-
node.children是一个[]*node切片,但实际查找时用的是node.childPool+ 索引映射(小写字母/数字优先哈希),不是遍历 - 通配符
*节点永远是子节点中最后一个,且仅允许出现在路径末尾(/static/*filepath✅,/a*b/c❌) -
:参数节点(如/user/:id)不阻断前缀共享,但会阻止同级静态路径共存(/user/new和/user/:id可共存;/user/:id和/user/:name不会合并,后者会覆盖前者)
为什么 GET /user/123 匹配到了 GET /user/:id 而不是报 404
匹配过程分两步:先走 radix 树做前缀导航,再在命中节点上处理参数提取。当请求路径进入 /user/ 子树后,引擎发现当前节点有 :id 子节点,且剩余路径 123 满足“非斜杠非空”条件,就将其绑定到 c.Params().Get("id")。
常见误解:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 以为
:id是正则 —— 实际只是占位符,不做任何格式校验(/user/abc也能匹配成功) - 以为路径必须完全一致才匹配 —— 其实 radix 树允许“路径段级”回溯:若静态子节点未命中,会尝试参数节点;参数节点也不匹配,才查通配节点
- 忽略大小写敏感性 —— Fiber 默认区分大小写(
/User≠/user),除非显式启用engine.StrictRouting = false
router.Add("GET", "/v1/:version/info", handler) 的底层节点插入逻辑
调用 Add 时,Fiber 把路径按 / 拆成段("", "v1", ":version", "info"),逐段构建或复用节点。关键行为:
- 空段(开头的
"")对应根节点,所有路由从这里开始 -
"v1"是静态节点,直接挂到根节点的 children 中(若不存在) -
":version"被识别为参数段,生成一个类型为param的子节点,其prefix是空字符串(它不贡献路径内容) -
"info"是静态段,挂在参数节点下 —— 这意味着/v1/anystring/info都能匹配,且anystring绑定到version
注意:"/v1/*all" 这类通配注册后,其节点类型为 catchAll,且会清空该位置原有子节点(防止歧义),所以 /v1/:id 和 /v1/*all 不能同时注册在同一父路径下。
自定义 radix 树行为的风险点
Fiber 不开放 radix 树的直接操作接口,所有路由增删必须走 app.Get/app.Post 或 app.Add。试图绕过框架直接修改 engine.trees 内部结构会导致:
- 节点引用错乱(
parent、children、wildcard字段不同步) - 参数绑定失效(
c.Params()依赖节点的ps缓存和indices映射,手动改树不会更新这些) - 并发 panic(
engine.trees无读写锁,多 goroutine 直接写会触发 data race)
如果真要深度定制(例如加路径黑白名单、动态加载路由),唯一安全方式是封装一层中间件,在 c.Path() 解析后做二次判断,而不是碰 radix 树本身。
真正容易被忽略的是:Fiber 的 radix 树在启动时不做路径冲突检测(比如重复注册 GET /user/:id 两次),后注册的会静默覆盖前一个 —— 日志里也不会警告,只有压测时发现 handler 行为异常才可能暴露。










