我们正在实施客户端/服务器应用程序以在远程系统上运行我们的硬件。
为此,我们使用GRPC,protobuf v3。
当我们修改.proto
文件并重新编译客户端而不更新服务器时,我们得到一个带有一条模糊消息的异常:
处理程序抛出了异常。
使用GRPC,检测客户端/服务器版本不匹配的常用方法是什么?
编辑:修改示例
例如,我们更改此消息(消息参数的特定类型):
service RpcAcquisitionCard {
...
rpc SetNumericalControlOscillator(RpcNcoConfiguration)
...
}
message RpcNco {
RpcDeviceIdentifier deviceId = 1;
core.protobuf.RpcFrequency nco1 = 2;
core.protobuf.RpcFrequency nco2 = 3;
}
到此(消息参数的通用类型)
service RpcAcquisitionCard {
...
rpc SetNumericalControlOscillator(RpcCommandParameter)
...
}
message RpcCommandParameter {
RpcDeviceIdentifier deviceId = 1;
google.protobuf.Any parameter = 2;
}
message RpcNco {
core.protobuf.RpcFrequency nco1 = 1;
core.protobuf.RpcFrequency nco2 = 2;
}
RpcCommandParameter.parameter
字段为RpcNco
。
答案 0 :(得分:1)
使用protobuf时,建议阅读Language Guide。
https://developers.google.com/protocol-buffers/docs/proto3#updating与您的方案特别相关:
只要不再使用标签号,就可以删除字段 您更新的消息类型。您可能希望重命名该字段, 也许添加前缀“OBSOLETE_”,或者保留标签 您.proto的未来用户不会意外地重复使用该号码。
这就是你做错了。而不是改变:
~/Google Drive/webpage$ gsutil rsync -d . gs://www.kurtpeek.com
Building synchronization state...
Starting synchronization
Copying file://./.DS_Store [Content-Type=application/octet-stream]...
Copying mtime from src to dst for gs://www.kurtpeek.com/CV_Kurt_Peek_September_2017.pdf
Copying mtime from src to dst for gs://www.kurtpeek.com/confirmation.html
Copying file://./index.html [Content-Type=text/html]...
| [2 files][ 19.1 KiB/ 19.1 KiB]
Operation completed over 2 objects/19.1 KiB.
为:
message RpcNco {
RpcDeviceIdentifier deviceId = 1;
core.protobuf.RpcFrequency nco1 = 2;
core.protobuf.RpcFrequency nco2 = 3;
}
你应该把它改成:
message RpcNco {
core.protobuf.RpcFrequency nco1 = 1;
core.protobuf.RpcFrequency nco2 = 2;
}
然后您的客户端和服务器将能够相互通信,无论他们是否具有旧的protobuf定义或新的定义。