#protobuf #tonic #grpc

gin-tonic-core

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日

#2410编码

Download history 115/week @ 2024-06-08 464/week @ 2024-06-15 72/week @ 2024-06-22 12/week @ 2024-06-29 459/week @ 2024-07-06 24/week @ 2024-07-13 1/week @ 2024-07-20 358/week @ 2024-07-27 166/week @ 2024-08-03 6/week @ 2024-08-10

每月531 次下载
用于 gin-tonic

MIT 许可证

70KB
2K 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 特质来添加你自己的类型。

基准测试

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.7–1.4MB
~26K SLoC