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

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

在上面的图片中,您可以看到proto文件是从不同的微服务中消耗的。
假设我将更改Protofile2并将更改推送到proto存储库,请记住proto文件存储库与微服务存储库是分开的:

当我运行go test on service1或 service2 时,应该告诉我,Protofile2已经更改,或者在service2文件夹中没有与proto文件相同的散列:

我必须再次生成代码。
有没有解决这个问题的工具?或者我该怎么解决呢?
发布于 2020-02-29 13:14:49
以下是我的建议:
import "github.com/me/myproto/protodef2" )导入特定的proto防御go v1.11一起引入)以确保微服务X获得兼容版本的protobuf Y如@PaulHankin所述,第2点--尽量不要破坏向后兼容性。Protobuf字段可以删除,但只要其余字段索引未被更改,旧客户端调用仍将与较新的Protobuf兼容。
发布于 2020-02-29 12:52:52
通常,尝试使协议缓冲区向后兼容,这样依赖于proto文件的服务不一定需要在proto文件更改时进行更改。请参阅https://developers.google.com/protocol-buffers/docs/proto3#updating
但是,如果要检查,可以使用proto.GetProperties(msgType)编写测试。将预期的struct属性放在文字中,并使用reflect.DeepEqual将其与在proto的动态类型上调用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)的文件,该文件可以包含在测试中。
https://stackoverflow.com/questions/60464363
复制相似问题