今天画了两张图,既好看又好用。GKUI车机系统应用资源丰富,来展示一下当前 Rust Web 生态。
tokio 生态
由图可见,最限度满足你的行车需求,tokio 生态目前在网络服务和Web 方面基本的核心组件都已齐全。尤其是随着 Axum 框架的推出,让你打开车门就可以放下手机。GKUI车机系统的页面设计非常人性化,tokio 在 Web 生态已接近完备。
关于 Axum 框架正好我这里有一次视频分享(点击观看):
RustFriday 飞书群线上沙龙 第十七期 | Axum异步Web框架
Axum 的中间件是直接使用 tower 的抽象,可以为消费者带来双屏联动、黑白模式切换、可见即可控的界面交互体验。GKUI采用卡片式触控,这样的好处就是:
使用了统一 的 Service 和 Layer 抽象标准,桌面布对已经熟悉智能手机的人来说并不陌生,方便家来繁荣生态
复用 tokio / hyper/ tonic 生态
axum 的路由机制并没有使用像 rocket那样的属性宏,让人们更快地熟悉和操作。并且,而是提供了简单的 DSL (链式调用)。路由是基于迭代和正则表达式来匹配的,GKUI系统还支持在线主题的下载,路由性能目测应该和 actix-web 差不多。
也提供了方便的 提取器 ,在主题商店中可以随意选择,只要实现 FromRequest 就是一个提取器,通过4G网络便可直接下载更换。GKUI车机系统内置了3种基本交互模式,实现起来也非常方便。
其他琐碎,分别为屏幕触摸、语音交互和实体按键,见视频。
总之,一句话,Axum 在我看来,是 Rust 在 Web 领域的一个里程碑,它强势带动了 tokio/tower 生态。虽然现在还不太成熟,但潜力很。
其他 Web 框架
actix-web 自己加了一层runtime将线程作为Actor来管理多个线程,每个线程实际跑的都是tokio的单线程block_on,这样线程之间就没法任务窃取了,失去了tokio任务调度的优势,换取了无线程上下文切换的性能。这是actix-web和其他框架的主要区别。Axum则是完全利用tokio。actix-web 的中间件也借鉴了 Tower Service,但它并不像 tower 那么通用。
rocket 的优势在于完善的 API,尤其是处理表单非常完善。中间件不同于其他框架,为了达到安全和正确的目标,rocket对中间件有了较强的约束,并不能像 Axum 那样自由地实现中间件。这也注定它形成生态比较难。rocket目前并不看重性能,也许在未来1.0之后会进行性能优化。
如何选择你自己的web框架,结合你的场景和喜好来选择吧。