【问题标题】:How to Maintain Proto Files?如何维护原始文件?
【发布时间】:2020-02-29 10:56:34
【问题描述】:

我创建了 3 个 proto 文件并希望将其保存在 git repo 中:

与所有其他文件分开。 存储库仅包含 .proto 文件。我有 3 个微服务,每个微服务都有自己的存储库,使用这些 proto 文件相互通信:

您可以在上图中看到,proto 文件正在从不同的微服务中使用。

假设,我要更改 Protofile2 并将更改推送到 proto 存储库,记住 proto 文件存储库与微服务存储库分开:

当我在 service1service2 上运行 go test 时,它应该告诉我,Protofile2 已更改或没有相同service2 文件夹中的类似于 proto 文件的哈希值:

我必须再次生成代码。

是否存在任何解决问题的工具?或者应该怎么解决?

【问题讨论】:

  • 提交挂钩对你有用吗?每次提交 proto 更改都会触发其他项目的构建服务器?
  • 是的,那太棒了。

标签: git go microservices protocol-buffers grpc


【解决方案1】:

这是我的建议:

  • 将您的原型(及其生成的 makefile)存储在单个 git 存储库中。为简化导入,每个定义都应位于各自的目录中
  • 使用版本标记 repo - 尤其是在潜在的重大更改时
  • 从您的微服务中导入特定的 proto defs,例如import "github.com/me/myproto/protodef2"
  • use go modules(2019年与go v1.11一起引入)确保微服务X获得兼容版本的protobuf Y

至第 2 点 - 正如@PaulHankin 所提到的 - 尽量不要破坏向后兼容性。可以删除 Protobuf 字段,但只要剩余的字段索引不变,旧的客户端调用仍将与新的 proto defs 兼容。

【讨论】:

  • 嘿,这太好了,这个导入到底是如何工作的?我正在尝试查找任何类型的文档但找不到。 proto文件中有这样的导入吗?我找到了jbrandhorst.com/post/go-protobuf-tips,他谈到了使用 go_package 选项。任何有用的指针我都是新手。
  • 等等,你的意思是repo有proto文件和生成的.pb.go文件吗?然后在单独的 repo 中提供服务并导入生成的 pb.go 文件的正确版本?
  • @YehudaMakarov 是的。一旦服务成熟 - .proto 文件将很少更改 - 并且 go 服务(编译)依赖于 *.pb.go 文件,因此任何 CI/CD 过程都没有必要包含 protobuf 编译步骤。并且使用go.mod 在单个存储库中维护proto.pb.go 允许客户端/服务器代码拉入他们需要的精确发布版本(通过semver git 发布标签)。
【解决方案2】:

通常会尝试使协议缓冲区向后兼容,以便依赖于原始文件的服务在原始文件更改时不一定需要更改。见https://developers.google.com/protocol-buffers/docs/proto3#updating

但是,如果您想检查,可以使用proto.GetProperties(msgType) 编写测试。将预期的结构属性放入文字中,并使用reflect.DeepEqual 将其与通过在原型的动态类型上调用proto.GetProperties 获得的动态结构属性进行比较。像这样的:

func TestMyProtoStructVersion(t *testing.T) {
    gotProps := proto.GetProperties(reflect.TypeOf(&mypb.MyProtoStruct{}))
    if !reflect.DeepEqual(gotProps, wantMyProtoStructProps) {
        t.Errorf("MyProtoStruct proto has changed")
    }
}

您可以使用go generate 自动创建一个文件,该文件包含您可以包含在测试中的协议缓冲区的预期结构属性 (wantMyProtoStructProps)。

【讨论】:

  • 我更新了我的帖子。现在应该更清楚了,我正在努力实现什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2020-07-19
  • 1970-01-01
  • 2011-06-19
  • 2018-01-02
相关资源
最近更新 更多