概述
简介
grpc序列化时,如果服务提供方和服务调用方请求字段的数量和顺序不一致时,发生的情况
1.基本代码
-
pb文件
syntax = "proto3"; // 版本声明,使用Protocol Buffers v3版本 package serialize; // 包名 // 定义一个服务 service SerializeService { // 方法 rpc SendMsg (MsgRequest) returns (MsgReply) {} } message MsgRequest { string name = 1; int32 id = 2; bool isUser = 3; } message MsgReply { int32 code = 1; string message = 2; }
-
服务端
type SerializeService struct { } const Success = 0 const failure = 1 func (s *SerializeService) SendMsg(ctx context.Context, req *serialize.MsgRequest) (*serialize.MsgReply, error) { fmt.Printf("serializeService.SendMsg|req:%+v", req) rsp := &serialize.MsgReply{Code: Success, Message: "success"} if req.Name == "fail" { rsp.Code = failure rsp.Message = "failure" } return rsp, nil }
服务端会打印序列化后的请求。
2.情况
-
服务端与客户端-pb一致
- 客户端请求
req := serialize.MsgRequest{ Name: "LiHua", Id: 5, IsUser: true, } client.SendMsg(context.Background(), &req)
-
输出
serializeService.SendMsg|req:name:"LiHua" id:5 isUser:true
-
服务端减少pb字段
-
服务端
message MsgRequest { int32 id = 2; bool isUser = 3; }
-
客户端
message MsgRequest { string name = 1; int32 id = 2; bool isUser = 3; }
-
-
输出
serializeService.SendMsg|req:id:5 isUser:true 1:"LiHua"
当去除字段name,服务端进行反序列化时,无法识别这个字段,所以出现了一个意外的输出
1:"LiHua"
。 -
当客户端减少pb字段
-
服务端
message MsgRequest { string name = 1; int32 id = 2; bool isUser = 3; }
-
客户端
message MsgRequest { int32 id = 2; bool isUser = 3; }
-
输出
serializeService.SendMsg|req:id:5 isUser:true
当客户端pb减少字段name时,并不会影响反序列化结果。
-
-
客户端修改字段顺序
-
服务端
message MsgRequest { string name = 1; int32 id = 2; bool isUser = 3; }
-
客户端
message MsgRequest { string name = 2; int32 id = 1; bool isUser = 3; }
-
输出
serializeService.SendMsg|req:isUser:true 1:5 2:"LiHua" /*添加打印后,发现无法获取name的值*/ name: isUser:true
当交换字段时,会导致反序列化后,无法取到正常的值。
-
3.结论
在修改pb时,千万不要修改,字段后面的数字标号。否则会影响反序列化后的结果。
无论是增加或者减少pb字段,都不会对反序列化结果有影响。所以,增加或者减少pb字段的项目上线时,不需要考虑服务提供方和服务调用方上线先后顺序。
最后
以上就是热心硬币为你收集整理的grpc-pb字段顺序的全部内容,希望文章能够帮你解决grpc-pb字段顺序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复