【问题标题】:gRPC / Protobuf interface versioninggRPC / Protobuf 接口版本控制
【发布时间】:2017-03-24 00:13:39
【问题描述】:

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

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

最简单的实现是让界面版本等于应用版本。 但由于使用了多种语言,在所有语言中实现应用版本控制并非易事。

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

来自 AppName v.version [使用接口 v.version] 的 DATETIME 连接

【问题讨论】:

  • 可能我需要看的是全局拦截器
  • 类似于groups.google.com/forum/#!topic/grpc-io/LPsPg5ctQd4 人们是否实现了“GetVersion()”方法?问题
  • 我建议对方法进行版本化并维护两个最新版本。结果是有DoSmth7()DoSmth8(),有点丑,但我买了这个。

标签: protocol-buffers versioning grpc proto3


【解决方案1】:

在即将发布的 gRPC 版本中,将有一个名为 Server Reflection 的新功能。这将允许客户端向服务器询问描述正在使用的 proto 文件的描述符。与其让服务器知道客户端正在运行的版本,不如让客户端知道服务器正在运行什么。如果服务器描述符与客户端已经拥有的描述符匹配,那么它将知道他们正在使用相同的版本。

这将在版本1.1发布。

请注意,Protobuf 的设计目的是让您不必这样做!如果您正确设置了原型,则新旧版本的客户端和服务器应该可以一起工作。

【讨论】:

  • > "请注意,Protobuf 的设计目的是让您不必这样做!如果您正确设置了您的 proto,新旧版本的客户端和服务器应该可以一起工作。"你这是什么意思?
  • 现在可以进行服务器反射。有没有地方演示如何使用它来指示版本或从客户端查询版本?
  • @carl,你的答案已经有将近 5 年的历史了,你会更新它以反映当前的 gRPC 版本吗?
【解决方案2】:

如果您使用的是协议缓冲区版本 2,则可以使用默认值来实现这一点。协议缓冲区 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标签..所以我想这个答案对你毕竟没有用。

【讨论】:

  • 这个主意不错。但是 optional 不是 proto3 的关键字/支持。也需要添加到每个消息和界面。
【解决方案3】:

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

option (my_app.version) = 3;

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

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2021-07-14
    • 2021-02-08
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多