router
topcoat-router 是整个工作区最大的 crate,src/ 下 2.3 万行(含测试),请求主线和发现主线都落在这里。它不建在 axum 上:服务器用 hyper 1 和 hyper-util 的 auto::Builder,路径匹配用 matchit 0.9,中间件是自己的 Layer trait,handler 拿到的是自己的上下文 Cx。后面每一章讲到请求、响应、上下文、交互时都会链回这里。
五章按「请求进来的顺序」排:
- 从连接到分发:
start/serve/serve_until;accept 循环、三个watch通道「靠关闭传信号」的优雅关停(实测:宽限期 2 秒,1 秒的请求正常完成,5 秒的请求在 2 秒后被切断,端口立刻释放);accept 出错时整个服务停止(ulimit -n 24复现);0.10.0 没给 hyper 配计时器,读请求头的超时不生效;catch_unwind为什么包在每一次 poll 上;rewrite 循环;分发顺序与 404、405、HEAD。 - 路由表与 layer 链:
RouterBuilder::build把 page、layout、route、layer 编成Endpoints和Routes两张表;Next是「剩余 layer 切片加终点」;没有路径的 layer 连 404 也包、有路径的只包匹配上的路由;layout 按路径前缀嵌套;尾斜杠默认 308 重定向;BodyLimit默认 2 MiB,本身也是一个 layer;建表时的四种 panic。 - 模块路由与发现:inventory 在链接期收集,
module_path!()决定 URL;_group、kebab-case、segment!、module_param!、catch-all、./相对路径;href!按 Rust 名字反查 URL;展开一个#[page]逐段对照;0.10.0 里根模块之外的 handler 会让启动 panic。 - 请求、响应与错误:
FromRequest与IntoResponse同一组类型两用;content/下各种内容类型;not_found、redirect、rewrite都是Error,靠downcast识别;未识别的错误变成 500 且原因被丢掉;流式开始之后的重定向变成一段脚本。 - tower 互操作与可信代理:
TowerRoute把 axum 应用挂进来、TowerLayer用一条 mpsc 通道把 tower 中间件和 topcoat 的 layer 链接起来、TowerService把 topcoat 交给 axum 当 fallback;TrustedProxies的networks与nearest;为什么压缩在所有 layer 之外。
flowchart TB serve["从连接到分发:accept、关停、catch_unwind、rewrite"] --> table["路由表与 layer 链:Endpoints、Routes、Next"] module["模块路由与发现:inventory、module_path"] --> table table --> resp["请求、响应与错误:FromRequest、IntoResponse、Error"] table --> tower["tower 互操作与可信代理"]
src/ 下主要文件的分工(行数含文件内测试):
| 文件 | 行数 | 管什么 | 章 |
|---|---|---|---|
router.rs | 2 113 | Router、handle_with、rewrite 循环、dispatch | 1 |
service.rs、listener.rs | 587 | RouterService、internal_serve、Listener | 1 |
builder.rs、endpoint.rs、route.rs、layer.rs、page.rs | 2 142 | 路由表与 layer 链 | 2 |
trailing_slash.rs、body_limit.rs、layer/strip_prefix.rs | 835 | 三个内置的路由行为 | 2、5 |
module/、path.rs、path_param.rs、href.rs | 约 4 100 | 模块路由、路径、路径参数、反查 URL | 3 |
content/、error/、request.rs、response.rs 与 response/、body.rs、urlencoded.rs | 约 8 800 | 请求与响应 | 4 |
tower.rs、proxy.rs、compression.rs、origin.rs | 3 330 | 互操作、代理、压缩、Origin 检查 | 5、07 章 |
💬 关联讨论
发起讨论加载中...