Protocol buffers gRPC/Protobuf接口版本控制

Protocol buffers gRPC/Protobuf接口版本控制,protocol-buffers,versioning,grpc,proto3,Protocol Buffers,Versioning,Grpc,Proto3,假设我们使用gRCP/Protobuf连接许多应用程序。 这些应用程序由他们自己的团队以自己的速度开发和发布。随着时间的推移,同一应用程序的不同版本(例如,安装在用户PC上的桌面应用程序)将在定义的界面上使用不同的版本 虽然Protobuf旨在允许向后兼容,但有没有办法知道在不同点运行的是什么版本的接口? 最简单的实现是使接口版本等于应用程序版本。 但是,由于使用了许多语言,所以在所有语言中实现应用程序版本控制并非易事 那个么,版本接口如何让服务器知道客户端版本呢 我认为服务器应该能够登录 来自

假设我们使用gRCP/Protobuf连接许多应用程序。 这些应用程序由他们自己的团队以自己的速度开发和发布。随着时间的推移,同一应用程序的不同版本(例如,安装在用户PC上的桌面应用程序)将在定义的界面上使用不同的版本

虽然Protobuf旨在允许向后兼容,但有没有办法知道在不同点运行的是什么版本的接口?

最简单的实现是使接口版本等于应用程序版本。 但是,由于使用了许多语言,所以在所有语言中实现应用程序版本控制并非易事

那个么,版本接口如何让服务器知道客户端版本呢 我认为服务器应该能够登录

来自AppName v.version的日期时间连接[使用接口v.version]


如果您使用的是协议缓冲区版本2,则可以使用默认值来实现此功能。Protocol buffers 3已删除对默认值的支持,因此此答案在那里不起作用

在定义接口的.proto文件中,有如下内容:

message MyLoginMessage
{
    ... normal login fields ...

    // Increment this number when you make new releases
    // of this .proto.
    optional int32 protocol_version [default=55];
}
这样,任何客户端都会自动包含从.proto获取的版本号


编辑:啊,刚刚注意到proto3标签。。所以我猜这个答案对你来说根本没有用。

一种方法是在.proto文件的顶部添加一个并设置该选项,如下所示:

option (my_app.version) = 3;

然后,在每种语言中,您都可以检查该选项的值,并将其指示为您的版本号。

在即将推出的gRPC版本中,将有一个称为服务器反射的新功能。这将允许客户机向服务器请求描述所使用的原型文件的描述符。与服务器知道客户端正在运行的版本不同,客户端将知道服务器正在运行的是什么。如果服务器描述符与客户机已有的描述符相匹配,那么它将知道它们使用的是同一版本

这将以
1.1版发布


请注意,Protobufs的设计是为了让您不必这样做!如果您正确地设置了proto,旧版本和新版本的客户端和服务器应该可以协同工作

可能我需要了解的是,全局拦截器与人们实现“GetVersion()”方法类似吗?问题I建议使用版本方法并维护两个最新版本。它的结果是有
DoSmth7()
DoSmth8()
,这有点难看,但我买这个。这个主意不错。但是,proto3不支持关键字/可选的
。此外,还需要将其添加到每个消息和接口中。>“请注意,Protobufs的设计使您不必这样做!如果您正确设置了proto,新旧版本的客户端和服务器应该协同工作。”这是什么意思?