gRPC protobuf 绑定:对 fileDescriptor 的更改是否会破坏更改?

gRPC protobuf bindings: Are changes to fileDescriptor breaking changes?

我目前正在使用 gRPC 网关作为 HTTP 代理在 Go 中开发 gRPC 服务。我正在从我的 .proto 文件生成 .pb.go 绑定,但我注意到我的绑定在两个独立但相关的情况下发生了细微的变化,这是我意想不到的。每个绑定文件都有一个神秘的字段 var fileDescriptorX = byte[]{.....} 其中 X 实际上是一个数字。此字段和仅此字段都会发生意想不到的更改。

我的大问题:这些绑定是否相互兼容,或者对该字段的更改是否被视为破坏性更改,导致不同版本的绑定不兼容?

首先,如果我将另一个 proto 文件添加到同一个文件夹,并且它按字母顺序排在现有 proto 之前,当我重新生成我的 Go 绑定时,fileDescriptor 字段将被重命名。字段名称末尾的数字 X fileDescriptorX 对应于它与文件夹中其他文件相比的顺序。明确地说,如果我有一个包含 b.protob.pb.go 的文件夹,那么我会添加 a.proto,然后重新运行我的编译器以创建 a.pb.gob.pb.go的文件描述符将从 0 增加到 1,并且 a.pb.go 将获得新的 filedescriptor0.

其次,因为我使用的是 gRPC 网关,所以我想更改 HTTP 选项中的路径。假设我在 a.proto:

中有一个 RPC
rpc GetFoo(GetFooRequest) returns (Foo) {
    option (google.api.http) = {
        get: "/v1alpha1/foo"
    };
}

当我将上面的路径更改为 "/api/foo/v1alpha1/foo" 时,a.pb.gw.go 发生了可以理解的变化,但是 a.pb.gofileDescriptor0 字段中的字节也发生了变化。

似乎没有任何文档讨论如何使用这些字段以及它们中的更改是否不兼容,是否会破坏与其他绑定的更改。任何帮助表示赞赏。谢谢!

这些 "file descriptors" 实际上是 .proto 文件中所有内容的二进制编码。该格式由 Protobuf 源代码中的 descirptor.proto 定义。您对 .proto 文件所做的任何更改都将导致文件描述符发生更改。

这没有记录,因为这是生成代码的内部实现细节。您无需担心生成的代码中发生了什么变化。只要您的 .proto 更改遵循记录的向后兼容性规则,您的协议就会兼容。