猿问

如何维护原始文件?

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

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

http://img4.mukewang.com/6284a63800015fd602810265.jpg

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

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

http://img1.mukewang.com/6284a6450001c18903770212.jpg

当我go testservice1service2上运行时,它应该告诉我,Protofile2已更改或与 service2 文件夹中的 proto 文件没有相同的哈希:

http://img2.mukewang.com/6284a6570001d51704980429.jpg

我必须再次生成代码。

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


长风秋雁
浏览 123回答 2
2回答

杨__羊羊

这是我的建议:将您的原型(及其生成的 makefile)存储在单个 git 存储库中。为了简化导入,每个定义都应该在它们自己的目录中用版本标记 repo - 尤其是在潜在的重大更改上从您的微服务中导入特定的 proto defs,例如import "github.com/me/myproto/protodef2"使用 go modules(go v1.112019 年引入)确保微服务 X 获得兼容版本的 protobuf Y第 2 点 - 正如@PaulHankin 提到的 - 尽量不要破坏向后兼容性。可以删除 Protobuf 字段,但只要剩余的字段索引不变,旧的客户端调用仍将与较新的 proto defs 兼容。

慕尼黑的夜晚无繁华

通常会尝试使协议缓冲区向后兼容,以便依赖于 proto 文件的服务在 proto 文件更改时不一定需要更改。请参阅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您可以包含在测试中的协议缓冲区的预期结构属性 () 的文件的过程。
随时随地看视频慕课网APP

相关分类

Go
我要回答