Actix-web、Rocket、Poem 等框架支持这样的写法:

#[get("/users/{id}")]
async fn show(id: web::Path<i32>) -> impl Responder { /* ... */ }

很多人觉得这"很优雅"——一个属性宏挂在函数上方,路径、方法、参数一目了然,像 Spring MVC 的 @GetMapping,像 FastAPI 的 @app.get。每隔一段时间,就有人在 Salvo 的 issue 区问:能不能也加一个 #[get]

Salvo 故意没有采用。本文想认真解释这个决定背后的原因。

阅读全文

在 Rust 的 Web 框架江湖里,Axum 与 Salvo 常常被放在一起比较。两者都用 Rust 写成,都跑在 hyper 之上,都支持异步,但只要写过几个真实业务,你就会发现:它们其实是两种完全不同的"世界观"。本文不是要贬低任何一方——Axum 是一个优秀的框架——而是想说明:当抽象层次不同时,开发体验和表达能力会显著不同。

本文对比的 Axum 版本为 0.8.x。需要先澄清一点:Axum 0.8 跟随 matchit 0.8 把路径参数语法从 :name / *name 改成了 {name} / {*name},看起来与 Salvo 的占位符语法几乎一致。但真正的差异从来不在"花括号还是冒号"这种表层,而在抽象模型本身。

阅读全文

在 Rust Web 开发的酒肆江湖里,有一坛自 2019 年便封坛陈酿的佳酿,它不事张扬,却让懂行的开发者甘愿为之驻足 —— 这便是 Salvo。Salvo 这坛酒,也在近六年的时光里,酿出了独一份的厚重与绵长。

奇妙的是,这坛 “老酒” 却总被误作新酿。只因它从不停歇对新鲜的追求,如同技艺精湛的酿酒师,在坚守传统工艺的同时,总能敏锐捕捉风味的进阶可能。从原生支持 HTTP/2、HTTP/3 协议的前瞻布局,到路由系统的设计创新;从内存占用的持续优化,到中间件系统的革命性统一设计,Salvo 在岁月沉淀中不断焕发新生,每一次版本更新都像给陈酿注入了鲜活气息,既保有老框架的可靠底色,又藏着让人惊喜的新鲜口感。它从不是被时代淘汰的旧物,而是在时光里愈发鲜活的经典。

阅读全文

话说 Rust 本身确实是一门学习曲线陡峭的语言, 一时半会驾驭不了它. 相比于 Rust, 同期的 Go 语言似乎更受欢迎. Go 你随便花上两天就能追到手, 可是 Rust 你可能要花上两个月, 然后还不能流畅地书写. 感觉 Go 就是一个青楼女子的模样, 人人可上手. 而 Rust 像啥? 大家闺秀? 感觉更像性冷淡, 对你的追求也是视而不见. 不过呢, 你如果足够用心, 你会发现, 她是你的好妻子, 上得厅堂, 下得厨房. 啥事都能做, 而且运行速度快, 占用资源少. 在安全方面尤其地安全, 相比之下其他的语言多少有点浪, 放家里总觉得有那么点不安全, 而 Rust 的性冷淡特性决定了她非常安全, 完全不用胆小有西门庆上门搞出点啥个事情来.

废话说得有点多, 回归正题, 如何用 Rust 搞一个网站后端服务? 说实话, 相比 Golang 等语言下面的五颜六色的框架来说, Rust 下可供选择的网站后端框架有点寒碜. 现在最主流的解决方案是使用 Actix-web 和 Rocket 两个比较成熟的框架. 我感觉可能是我比较愚笨, Actix-web 觉得好难, Rocket 似乎也不能满足我需求, 也不觉得好用. 于是就有了 Salvo.

做 Salvo 这个框架的初衷就是简单, 尤其是路由要够好用. 我并不希望框架帮我干很多的事情, 比如, 像 Rocket 等会直接把传来的数据映射为本地的数据结构, 但是我并不想那么干, 我觉得这个是使用者自己的事情, 映射本身很简单, 而且我更希望在映射出错时提供自定义的错误提醒.

阅读全文

作者的图片

Chrislearn Young

Super bio with markdown support COOL

Your job title

China