#protobuf #tonic #grpc

gin-tonic-derive

gin-tonic的衍生宏

15个版本 (4个破坏性更新)

0.5.3 2024年8月3日
0.5.2 2024年8月2日
0.5.1 2024年7月31日
0.4.8 2024年7月10日
0.1.0 2024年6月11日

#grpc中排名第276

Download history 120/week @ 2024-06-08 482/week @ 2024-06-15 70/week @ 2024-06-22 11/week @ 2024-06-29 456/week @ 2024-07-06 23/week @ 2024-07-13 1/week @ 2024-07-20 343/week @ 2024-07-27 166/week @ 2024-08-03 6/week @ 2024-08-10

每月下载量516
用于gin-tonic

MIT许可协议

48KB
1K SLoC

crates.io

gin-tonic

gin-tonic提供

  • 一个protobuf的编解码(类似于prost
  • 一个prost-build的替代品
  • 一个tonic编解码器实现
  • 一个tonic-build的包装器,增加了额外的功能

虽然所有这些都可以使用提到的crate实现;gin-tonic还提供了将任何Rust类型转换为protobuf网络类型的特性。你可能会问为什么?

如果你想要通过protobuf传递一个UUID,你很可能会这样做

message Foo {
  string my_uuid = 1;
}

使用prost-buildtonic-build,这将生成以下Rust结构体

struct Foo {
    my_uuid: String,
}

如你所见,这里的Rust类型是String,但在你的实际代码中,你想使用实际的uuid::Uuid。现在你需要在代码中进行一个容错转换。

gin-tonic通过添加选项到protobuf文件来解决这个问题

import "gin/proto/gin.proto";

message Foo {
  string my_uuid = 1 [(gin_tonic.v1.rust_type) = "uuid::Uuid"];
}

使用gin-tonic代码生成器,这将生成以下Rust代码

struct Foo {
    my_uuid: uuid::Uuid,
}

对于UUID情况,gin-tonic提供了两个特性

  • uuid_string => proto传输是string,解析错误在网络类型转换中处理
  • uuid_bytes => proto传输是bytes,这不需要额外的错误处理

你可以通过为你的类型实现PbType trait来自定义类型。

基准测试

gin tonic

decode                  time:   [699.72 ns 700.71 ns 701.81 ns]
encode                  time:   [451.35 ns 453.22 ns 455.56 ns]

prost

decode                  time:   [778.30 ns 782.24 ns 788.19 ns]
encode                  time:   [622.77 ns 623.87 ns 625.02 ns]

依赖关系

~0.6-1MB
~24K SLoC