05|get hands dirty:做一个图片服务器有多难?

223 阅读2分钟

正式开始

本节代码

如何学习

自定义编译protobuf

  1. 在项目根目录下,生成一个 abi.proto 文件,写入图片处理服务用到的数据结构
  2. 在项目根目录下,创建一个 build.rs,使用 prost 编译abi.proto生成protobuf
  3. build.rs 可以在编译 cargo 项目时,做额外的编译处理
  4. mkdir src/pb 创建文件夹
  5. 运行 cargo build,在 src/pb 下生成 abi.rs ,包含了从 protobuf 消息转换出来的 Rust 数据结构
  6. 创建 src/pb/mod.rs导出一些辅助函数。一个目录下的所有代码,可以通过 mod.rs 声明

链接

Python下的一个图片服务器

编译protobuf prost

Web服务器 rocket

Web服务器 actix-web

Web服务器 warp

Web服务器 axum

图像处理库 image

上层图像处理库 photon

图片引擎 opencv

图片引擎 piet

图片引擎 imagemagick

新鲜知识点

  1. 可以编辑 ~/.cargo/config,让所有项目的编译结果都放在同一个目录下(不过这样无法同时编译多个项目,cargo 有文件锁)

    [build] 
    target-dir = "/Users/tchen/.target" 
    
  2. Rust 下只要加了依赖,对应的依赖就可以访问,不存在 import 的过程。use 只是简化 namespace

精选问答

  1. prost这个依赖的tag是有什么作用?

    a. protobuf 在传统的用于网络协议定义可选字段的方法 TLV(Type/Tag Length Value)上发展了变长的编码方式,将这三者巧妙的融合在了protobuf的定义语言中,其实质还是 TLV

    b. uint32 x1 = 1; 的 uint32 确定了 length(以及对应的编程语言的类型),而 = 1 则声明了 tag。当你序列化一个 Crop struct 到 protobuf 二进制时,每个字段的值会带上 tag 和 length。这样别人就能通过这个信息反序列化出来。