timzaak / blog

8 stars 1 forks source link

rust 网络编程库汇总 #53

Closed timzaak closed 3 years ago

timzaak commented 4 years ago

序列化

json: 官方 serde

异步+ socket编程

明星项目 tokio,十分出名。 futures 提供 future 封装,其他异步都可用。 async-std tokio 成员新写的,无历史包袱。 crossbeam 无锁并发数据结构+功能库,自成一套体系。 actix 基于actor 模型。目前看会更适用于底层,很多东西,尚不可定制。

目前最稳定、使用率最高的运行时实现就是 tokio,看到的大部分框架都是基于它。

协议与加密

rusttls等,rust 社区,会把项目拆分的十分细小。需要有足够的时间,去了解发掘,然后组装。 也有 openssl 封装。

WEB 框架

可参考 flosse / rust-web-framework-comparison,但有点老旧了,基于 hyper 的 warp,已经支持 websocket, 并且 warp 也是基于 tokio,其核心 API:Filter 比较适合 Scala 转过来的我。 目前观察下来, warp 会是我的首选 web 框架。

grpc

tonic,首选。另外两个 tower-grpc ,和基于c wrapper 的,可以不考虑。

ORM

sqlx 异步,但是需要手工写SQL语句,麻烦。 diesel 虽然有很方便的 api,但非异步。

队列

marvinguo/rocketmq-client-rust 好久没更新了。其他的,TODO。 第三方客户端对接,不是十分出名的,太少

缓存

TODO

timzaak commented 3 years ago

最近用 Rust 写了个堡垒机,快写完了。中间经历了不少关于 Rust 的知识点/坑。写下来记录一下。 先下一个结论: Rust 距离完全体还有很长远的距离。目前我所觉的很重要特性如下

struct 自引用 /inner struct ref outer struct

刚开始,写了一堆的自引用,导致一些需要多个可变性传递参数的时候, 各种double mut ref,虽然后来把这些属性拆出来,全改成 lazy_static 全局初始化,但还是觉得自引用在一些地方会更合适一些。

async 函数 in trait

这个用 async_trait crate 来临时性解决(PS:不知道为什么官方不直接采纳进去)。但还有一个更深入的问题是如何给库使用者暴露含有异步函数方法的trait,Box<Pin<dyn Future>> 作为返回值既不优雅也不方便构造和调用。

DI

dyn 动态分发,在实际编写代码的时候,很不好用,网上有一篇关于不要在 struct 使用 Box 作为属性的文章。另外,一旦有类似 struct<T:??>{t:T} 结构, impl 等,很多地方就要强制写范型。

我是不知道如何写一个能(优雅)支持用户注入各种方法钩子的第三方库出来。

Dependency Inject 对我而言,很重要。

Enum Field 类型

Enum 内的 struct 等,不能作为函数的参数类型。这就导致不太好写专门针对某一个 Enum 属性的语法糖/方法拓展。Scala 的 sealed 多棒啊,Kotlin也有,Java 后续也有类似的实现,期望 Rust 跟进。

Struct无法自动拥有 Field Struct 的方法

可以用 Dref/DrefMut 来隐式转换,但这个方案是 anti pattern,社区不推荐。

总而言之,应用程序,我就应该用Scala/Kotlin 来写!