为了账号安全,请及时绑定邮箱和手机立即绑定

如何维护原始文件?

如何维护原始文件?

Go
长风秋雁 2022-05-18 15:54:01
我创建了 3 个 proto 文件,并希望将其保存在 git repo 中:与所有其他文件分开。存储库仅包含.proto文件。我有 3 个微服务,每个微服务都有自己的存储库,使用这些 proto 文件相互通信:您可以在上图中看到,proto 文件正在从不同的微服务中使用。假设,我要更改Protofile2并将更改推送到proto存储库,请记住 proto 文件存储库与微服务存储库分开:当我go test在service1或service2上运行时,它应该告诉我,Protofile2已更改或与 service2 文件夹中的 proto 文件没有相同的哈希:我必须再次生成代码。是否存在任何解决问题的工具?或者我应该如何解决?
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

这是我的建议:

  • 将您的原型(及其生成的 makefile)存储在单个 git 存储库中。为了简化导入,每个定义都应该在它们自己的目录中

  • 用版本标记 repo - 尤其是在潜在的重大更改上

  • 从您的微服务中导入特定的 proto defs,例如import "github.com/me/myproto/protodef2"

  • 使用 go modulesgo v1.112019 年引入)确保微服务 X 获得兼容版本的 protobuf Y

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


查看完整回答
反对 回复 2022-05-18
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

通常会尝试使协议缓冲区向后兼容,以便依赖于 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您可以包含在测试中的协议缓冲区的预期结构属性 () 的文件的过程。


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号