Chrislearn's Blog
作者的图片

Chrislearn Young

Rust open-source maintainer. Author of Salvo and Palpo. Passionate about Rust, web frameworks, and clean abstractions.
  • 首页
  • 标签
  • 归档
  • 关于
  • GitHub
  • RSS

2026

    四月
  • Salvo vs. Axum: A Tale of Two Design Philosophies
  • Salvo 为什么不采用宏式路由
  • Salvo 与 Axum 的设计思想对比
  • Why Salvo Doesn't Embrace Macro-Style Routing
    二月
  • Salvo:六年陈酿的 Rust Web 框架

2018

    八月
  • Ubuntu-Server启动错误修复
    六月
  • 螺旋数的一个解法
  • 一个让Rust能简单写网站后端服务的的框架
  • 为什么都说生男生女是男人决定的
    五月
  • 如何解决前进过程中某些掉队队友的负面影响
    三月
  • 2018年刑侦科推理试题(附推理解答)
    二月
  • 博客改用 Hugo

2016

    三月
  • Javascript Array sort 在不同浏览器中的不同表现

2015

    十二月
  • [转]面试智力题(下)
  • [转]面试智力题(上)
    九月
  • Ubuntu 过期版本更新
  • go语言中string、int、int64互相转换
    七月
  • Ubuntu 上安装最新版本的 ffmpeg
    六月
  • 比AngularJS 更简单好用的前端框架Aurelia
  • Photoshop 中的生成器

2013

    十一月
  • 关于灵魂的一点思考
    五月
  • 很好的文件名批量替换工具
  • 为了性能,请用Canvas而不是IMG
  • 避免网页中直接使用IMG标签

2012

    十二月
  • [转]10道变态的逻辑题
    十一月
  • Ubuntu 下修改 Mysql 默认数据库路径
    十月
  • [转]难死人不偿命!苹果8大笔试题及答案
    九月
  • OpenGL学习-环境配置(Ubuntu+Eclipse)
    八月
  • [转] 看完这21个故事,百分之30的人都成了千万富翁,下一个会是你吗?
    三月
  • 多年前花了一堂课才做出来的智力题
    二月
  • 关于Photoshop中图层的批量导出

2011

    十月
  • [转]就让他们去告我吧 fucking-sue-me
  • 其实Firefox也不慢啊
    九月
  • 使用DeepLink的网站添加Facebook Like Button
    八月
  • Problem Opening .pbk file in windows 7
    五月
  • [转]不提拔你,就因为你只想把工作做好
  • [转] unexpected error creating debug information
    三月
  • Windows右键添加”使用CMD打开”
  • [转]桑叶蒲公英水煎服用清热去火治红眼病

2010

    十月
  • 可以上网但是不可以QQ的解决办法
  • [转]让Windows 7变无线WiFi基站或无线热点
  • 腾讯图片加载的诡计
    九月
  • [转]Android APK反编译
    八月
  • [转]迅雷API接口
  • Jquery UI Dialog 无法提交服务器解决方法
  • [转]前端人员如何模拟慢网速环境
  • Ubuntu中Java进程占CPU100%解决方法
    七月
  • Exception from HRESULT: 0x8007000B 异常的解决方法
  • 打架的最高境界就是快
  • 再次更换空间
  • 江苏电信好霸道哦
  • Flash中彩色图变黑白图
  • [转]Gappproxy 构建个人代理服务器(Linux)
    六月
  • Flash CS5的重大BUG?无法打开保存的文件
  • Adobe CS5 安装失败出现Exit Code: 7的解决方法
  • 九阳豆浆机坏了又好了
  • Mac OS X上好用的SVN客户端推荐
  • 使用Terminal获取MAC下文件路径
  • 再次遇到EXC_BAD_ACCESS错误
    五月
  • iPhone Simulator 无显示的解决方法
  • [转] 妻子决定你未来的事业高度
  • [转] 对付身体小毛病的80妙招
  • 速算,以后留着教孩子。
  • Silverlight中遮罩及其动画制作(Clip Path)
  • [转] 背完这444句,你的口语绝对不成问题了
  • 虚拟机下安装Mac OS X的几个注意点
  • Silverlight看上去是斗不过Flash的
  • MAC下获取文件路径的另一个方法
  • 快速设置Mac下的Web服务器
  • 低碳世博真低碳?
  • MAC下FTP客户端推荐
  • MAC下获取文件路径小技巧
  • 经典的Flash兔子跳铃铛游戏
  • Flash程序员常用软件及开源程序
  • 找回以前的博客
  • 查看Mac下隐藏文件
  • 还是老马的话对
  • 又要找房子租了
  • how to debug EXC_BAD_ACCESS on iPhone

2009

    十月
  • fancypantsi.com 网站上 American Design Awards
    七月
  • Reset Identity Column Value in SQL Server (转)
  • vs快捷键大全(转)
    六月
  • Android ERROR: unknown virtual device name: 'myavd'
  • FlashPlayer 9 与 10不同之处
    五月
  • Background Images and CSS in HTML Email
    四月
  • Adding .FLV MIME Type in IIS
    一月
  • ASP.NET Development Server Problems Under Vista

2008

    十二月
  • Fatal Execution Engine Error (716E7706) (80131506)
    十一月
  • 最近对鬼魂有了兴趣
  • SVN配置自动更新WEB服务器
    十月
  • 如何选出所有子类
    九月
  • div设置float后高度不自动增加
  • jsfl SyntaxError:unterminated string literal
  • Google浏览器Chrome使用初体验
    八月
  • Firefox下IFrame显示的BUG
  • Flash中显示HTML页面
  • 北大爆强失恋诗 [转][经典]
  • Flash远程调试
  • 实现AS3(Flash9)与AS2(Flash8)的相互通信
  • 两篇关于AS3 Loader内存泄漏的文章
  • 博客又换新皮肤
    七月
  • 诡异,Flash在Mac和PC的不一样的执行结果
  • 一个还蛮好玩的Flash多人在线游戏
  • 补间动画与补间形状之间的一个差别
  • MovieClip.addFrameScript又一个文档里面没写方法
  • SWFAddress使用中URL无法改变的问题
  • Blog升级到2.6
  • Blog终于又回来了
  • 博客换皮肤了
  • 掷骰子(Conqueror)游戏
  • Audition(Cool Edit)制作循环音乐的问题
  • Flex 3 编译Library的问题及解决方法
    六月
  • 关于游戏通信协议
  • 最近还真忙
  • Flash里的3D
    四月
  • 注册了一个呆头驴的域名
  • 今晚又在加班了
    三月
  • 我的第一博
by

Salvo vs. Axum: A Tale of Two Design Philosophies

Apr 4, 2026

In the Rust web framework world, Axum and Salvo are often put side by side. Both are written in Rust, both run on top of hyper, and both are async. But once you’ve built a few real services with each, you’ll realize they aren’t really competing on the same axis at all — they represent two genuinely different worldviews. This article isn’t about putting one above the other (Axum is an excellent framework); it’s about showing how a different abstraction layer leads to a noticeably different developer experience and expressive power.

The Axum version referenced here is 0.8.x. One quick clarification: Axum 0.8 followed matchit 0.8 in switching its path-parameter syntax from :name / *name to {name} / {*name}, which on the surface looks almost identical to Salvo’s. But the real difference has never been “braces vs. colons” — it’s the abstraction model itself.


Salvo 为什么不采用宏式路由

Apr 4, 2026

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

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

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

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


Salvo 与 Axum 的设计思想对比

Apr 4, 2026

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

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


Why Salvo Doesn't Embrace Macro-Style Routing

Apr 4, 2026

Frameworks like Actix-web and Rocket support writing routes like this:

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

Many people think this is “elegant” — an attribute macro sits right above the function, and the path, method, and parameters are all visible at a glance, much like Spring MVC’s @GetMapping or FastAPI’s @app.get. Every so often someone files a Salvo issue asking: can we have a #[get] too?

Salvo deliberately doesn’t. This article tries to seriously explain the reasoning behind that decision.


Salvo:六年陈酿的 Rust Web 框架

Feb 2, 2026

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

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


Ubuntu-Server启动错误修复

Aug 8, 2018

前两天服务器(Ubuntu 18.04.1)重启后出现了这个严重错误, 导致系统无法启动:


螺旋数的一个解法

Jun 6, 2018

题目是: 给定一个自然数n,将n*n个数字按顺时针方向填入一个二维数组, 比如: n=4, 则结果为:


一个让Rust能简单写网站后端服务的的框架

Jun 6, 2018

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

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

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


为什么都说生男生女是男人决定的

Jun 6, 2018

生男生女是有男人还是女人决定的? 有点知识的人肯定觉得这问题特别简单, 所有的教科书都会告诉你, 是由男人决定的. 但是我却觉得这个结论有点荒谬.


如何解决前进过程中某些掉队队友的负面影响

May 5, 2018

昨天, 老板问我一个问题, 大致内容是: “当你设立了公司的目标, 团队一起努力前进的时候, 总会有些队友因为某些挫折而产生消极的工作情绪, 而这种情绪又会很快影响周围的队友, 像传染病一样扩散, 如何化解这种负面影响?”


118 posts found