在rust使用protobuf
2020-12-14 本文已影响0人
guonaihong
前言
最近打算熟悉下rust,先使用tcp stream+protobuf写个简单的TLV服务。发现rust处理生成代码的方式和go还有点不一样。比较符合rust的做法是写个build.rs脚本。
protobuf 配置
protobuf 是google开发的协议序列化,反序列化器,具备很高的性能。在内网的rpc通信中比较流行。message 定义数据结构用的,rfc定义应用层的数据包使用message术语,所以protobuf取名还是挺讲究的。
syntax = "proto3";
message HotWordRequest {
string hot_word_text=1;
string session_id = 2;
}
message HotWordResponse {
int64 errcode = 1;
string errmsg = 2;
string session_id = 3;
bytes hot_word_model=4;
}
build.rs内容
fn main() {
protobuf_codegen_pure::Codegen::new()
.out_dir("src/protos")
.inputs(&["protos/small-model.proto"])
.include("protos")
.run()
.expect("Codegen failed.");
}
依赖配置
rust 里面使用toml格式配置依赖,toml是一种很基础和广泛使用的配置文件格式,toml格式比较简单,一个比较基础的解析器用c可能40行可以实现。比较好奇的是为什么不使用yaml?唯一能想到的是,可能是想大家的依赖配置玩的不要那么花哨。
[build-dependencies]
protobuf-codegen-pure = "2.14"
运行命令
cargo build运行如果没有报错就大功告成。
cargo build
最后的目录结构
.
├── build.rs
├── Cargo.toml
├── protos
│ └── small-model.proto
└── src
├── main.rs
└── protos
└── small_model.rs