在微服务架构中组织protobuf文件

ant*_*ham 6 protocol-buffers microservices grpc

在我的公司中,我们有一个由微服务组织的系统,每个服务都有专用的git存储库。我们想介绍gRPC,我们想知道如何共享protobuf文件并为我们的各种语言构建库。根据我们收集到的一些示例,我们最终决定在内部存放所有protobuf的单个存储库,这似乎是最常见的存储方式,并且维护和使用起来也更加容易。

我想知道您是否有一些例子?您是否有一些相反的例子,说明公司做相反的事情,即以分布式方式托管protobuf?

Vit*_*aev 7

我们有一个独特的原型文件存储库(称为schema),并为每个微服务提供多个存储库。此外,我们从不存储生成的代码。服务器和客户端文件是在 CI 上的每次构建期间从头开始生成的protoc

事实上,这种方法很有效,并且非常适合我们的需求。但有两个潜在的陷阱:

  1. 微服务存储库之间不一致schema。提交到两个不同的 git 存储库不是原子的,因此,在schema更新时,总是有一个更新的时间段schema,而微服务的存储库还没有。
  2. 如果您使用Go,则迁移到 Go 1.11 中引入的 Go 模块可能会出现问题。我们还没有对其进行全面的研究。

  • API 版本是 `schema` 存储库上的 semver git 标签。每次我们更改 API 时,我们都会发布新的 git 标签并使用“proto”文件构建工件(实际上是 RPM 包)。更改可能是向后兼容的,也可能是破坏性的(这反映在主要版本和次要版本中)。微服务之间的依赖关系?我不确定你的意思,基本上依赖项被描述为“proto”文件中的导入。 (2认同)

Opt*_*tio 3

我们的每个微服务都有自己的 API(protobuf 或多个 protobuf 文件)。对于每个 API,我们都有单独的存储库。此外,我们还有 CI 工作,将原型类构建到 jar 中(不仅适用于 Java,也适用于其他语言)并将其发布到我们的中央存储库中。您只需将依赖项添加到您需要的 API 即可。

例如,我们有微服务A,我们还有存储库a-api(仅包含原型文件),它通过作业构建到 jar 中(以及其他语言)com.api.a-service.<version>