Microservices 如何在Git proto repo中释放对共享.proto文件的更改?

Microservices 如何在Git proto repo中释放对共享.proto文件的更改?,microservices,protocol-buffers,grpc,rpc,Microservices,Protocol Buffers,Grpc,Rpc,共享协议缓冲区的一个常见策略似乎是按照多个答案的建议将这些文件存储在单独的Git存储库中: 所以我决定设置这样一个结构,但在设置部署时遇到了困难 我的现状 我有一个名为magicservice的服务,它实现了存储在proto-repo中的.proto文件。因此,magic服务repo不存储自己的原型文件,而是在构建服务时获取它 现在我想为magicservice发布一个新功能,但这需要先更新.proto文件。当然,在实现可用之前,不能更新公共protobuf文件。这是一个循环依赖 问题

共享协议缓冲区的一个常见策略似乎是按照多个答案的建议将这些文件存储在单独的Git存储库中:

所以我决定设置这样一个结构,但在设置部署时遇到了困难

我的现状 我有一个名为
magicservice
的服务,它实现了存储在
proto-repo
中的
.proto
文件。因此,
magic服务
repo不存储自己的原型文件,而是在构建服务时获取它

现在我想为
magicservice
发布一个新功能,但这需要先更新.proto文件。当然,在实现可用之前,不能更新公共protobuf文件。这是一个循环依赖

问题: 如何安全地部署服务而不必首先发布其原型文件


我认为这是一个常见的问题,但我找不到任何关于它的东西。欢迎提供任何建议或资源

我们在一个围棋语言项目中使用了类似的结构。我们在Git上有一个proto repo,另一个项目正在使用proto存储库中的那些proto文件


其他项目没有引用Git中最新的proto文件,而是引用Git中带有特定标记(版本)的proto文件。因此,我们从未遇到过这种循环依赖性问题。这个解决方案可能对您有所帮助。

我们在一个围棋语言项目中使用了类似的结构。我们在Git上有一个proto repo,另一个项目正在使用proto存储库中的那些proto文件


其他项目没有引用Git中最新的proto文件,而是引用Git中带有特定标记(版本)的proto文件。因此,我们从未遇到过这种循环依赖性问题。这个解决方案可能对您有所帮助。

在分布式系统中更新原始文件肯定需要一些技巧

一种策略(在另一篇评论中提到)是使用发行版。这样,您就可以让服务器遵循比客户端更高的版本

另一个选择是通过文档来解决这个问题。事实上,原型文件可以在实现部署并可用之前发布。在一个更大的系统中,最好在注释中将字段标识为不可用

封送拆收器已设置但解编器不知道的字段被视为“未知”字段。更新必须小心协调,以确保更改不会向后或向前不兼容

  • 向后不兼容的更改意味着不能使用该类型的旧版本来解组由该类型的新版本生成的消息
  • 转发不兼容的更改意味着不能使用该类型的新版本来解组由该类型的旧版本生成的消息
有关更新原型的更多信息,请参阅文档

例如,添加新字段的典型流程可能遵循以下模式:

  • 向proto文件中添加一个新字段,并将其记录为不可用
  • 更新读取代码以了解如何读取新字段
  • 删除有关其可用性的文档
  • 更新编写代码以了解如何编写新字段

  • 在分布式系统中更新原型文件肯定需要一些技巧

    一种策略(在另一篇评论中提到)是使用发行版。这样,您就可以让服务器遵循比客户端更高的版本

    另一个选择是通过文档来解决这个问题。事实上,原型文件可以在实现部署并可用之前发布。在一个更大的系统中,最好在注释中将字段标识为不可用

    封送拆收器已设置但解编器不知道的字段被视为“未知”字段。更新必须小心协调,以确保更改不会向后或向前不兼容

    • 向后不兼容的更改意味着不能使用该类型的旧版本来解组由该类型的新版本生成的消息
    • 转发不兼容的更改意味着不能使用该类型的新版本来解组由该类型的旧版本生成的消息
    有关更新原型的更多信息,请参阅文档

    例如,添加新字段的典型流程可能遵循以下模式:

  • 向proto文件中添加一个新字段,并将其记录为不可用
  • 更新读取代码以了解如何读取新字段
  • 删除有关其可用性的文档
  • 更新编写代码以了解如何编写新字段