【问题标题】:How to keep grpc service definitions in sync between server and clients?如何使服务器和客户端之间的 grpc 服务定义保持同步?
【发布时间】:2020-01-08 08:14:47
【问题描述】:

我打算使用grpc 来构建我的搜索API,但我想知道如何在服务器和客户端之间同步grpc 服务定义文件(例如.proto)(假设它们都使用不同的技术) .

此外,如果服务器更改了.proto 之一,将如何通知客户端根据这些更改重新生成它们的存根。

总结一下:如何与客户共享定义 (.proto),以及如果这些文件发生任何更改,如何通知客户?

【问题讨论】:

    标签: api version-control synchronization protocol-buffers grpc


    【解决方案1】:

    很简单:它们不是。这里的所有同步都是手动的,通常需要在您意识到更改并更新您的 .proto 文件之后重新构建和重新部署。

    如果不更新,你知道的字段和方法至少应该可以继续工作。你只是不会有新的位。

    另请注意:虽然您可以通过添加新字段和服务/方法来扩展模式,但如果您更改字段的含义、字段类型或服务上的消息类型:预计会出现非常严重的错误。

    【讨论】:

    • 所以这完全是手工作业,只能通过有纪律的工作流程来管理?
    • @adnanmuttaleb 是的;请记住,在许多平台上,工具作为编译时步骤工作,以目标语言生成代码,正如您所说:“假设所有平台都使用不同的技术”;更新您的 Java 服务器不会为您的 C++ 客户端做任何事情 - 需要使用更新的 .proto 重新构建 C++ 客户端,以生成处理它所需的额外 C++ 代码;一些库使用运行时元编程,因此理论上可以适应 .proto 更改,但这仍然不会使您的代码对其他字段执行任何操作,或使用新的服务方法
    • 这很可悲 :( 所以它实际上不是那么灵活。所有客户端必须由管理服务器的同一进程管理。这并不是真正的分配......
    • @GinoPane 这......坦率地说,这是一个非常糟糕的做法;几乎所有 API 都以这种方式工作 - xml、json 等;这是故意的,因为您的代码需要更新以正确使用以前不存在的新数据;现在,如果您真的想要,大多数实现都允许您接收和存储意外字段,但访问它们本质上不那么直接 - 显然您的代码不会只访问 obj.Foo 如果代码没有不知道.Foo 何时建成。但是:我真的很好奇,在一个完美的世界里,你会如何希望它起作用。严肃的问题,而不是修辞。
    • 嗯,经过再三思考,这似乎不是问题……如果 API 发生重大更改,除非客户端正确更新,否则您将无法使用它。
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 2018-01-11
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多