我是靠谱客的博主 热心硬币,这篇文章主要介绍grpc-pb字段顺序,现在分享给大家,希望可以做个参考。

简介

grpc序列化时,如果服务提供方和服务调用方请求字段的数量和顺序不一致时,发生的情况

1.基本代码

  • pb文件

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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; }
  • 服务端

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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一致

    • 客户端请求
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    req := serialize.MsgRequest{ Name: "LiHua", Id: 5, IsUser: true, } client.SendMsg(context.Background(), &req)
    • 输出

      复制代码
      1
      2
      serializeService.SendMsg|req:name:"LiHua" id:5 isUser:true
  • 服务端减少pb字段

    • 服务端

      复制代码
      1
      2
      3
      4
      5
      message MsgRequest { int32 id = 2; bool isUser = 3; }
    • 客户端

    复制代码
    1
    2
    3
    4
    5
    6
    7
    message MsgRequest { string name = 1; int32 id = 2; bool isUser = 3; }
  • 输出

    复制代码
    1
    2
    serializeService.SendMsg|req:id:5 isUser:true 1:"LiHua"

    当去除字段name,服务端进行反序列化时,无法识别这个字段,所以出现了一个意外的输出1:"LiHua"

  • 当客户端减少pb字段

    • 服务端

      复制代码
      1
      2
      3
      4
      5
      6
      message MsgRequest { string name = 1; int32 id = 2; bool isUser = 3; }
    • 客户端

      复制代码
      1
      2
      3
      4
      5
      message MsgRequest { int32 id = 2; bool isUser = 3; }
    • 输出

      复制代码
      1
      2
      serializeService.SendMsg|req:id:5 isUser:true

      当客户端pb减少字段name时,并不会影响反序列化结果。

  • 客户端修改字段顺序

    • 服务端

      复制代码
      1
      2
      3
      4
      5
      6
      message MsgRequest { string name = 1; int32 id = 2; bool isUser = 3; }
    • 客户端

      复制代码
      1
      2
      3
      4
      5
      6
      7
      message MsgRequest { string name = 2; int32 id = 1; bool isUser = 3; }
    • 输出

      复制代码
      1
      2
      3
      4
      5
      serializeService.SendMsg|req:isUser:true 1:5 2:"LiHua" /*添加打印后,发现无法获取name的值*/ name: isUser:true

      当交换字段时,会导致反序列化后,无法取到正常的值。

3.结论

在修改pb时,千万不要修改,字段后面的数字标号。否则会影响反序列化后的结果。

无论是增加或者减少pb字段,都不会对反序列化结果有影响。所以,增加或者减少pb字段的项目上线时,不需要考虑服务提供方和服务调用方上线先后顺序

最后

以上就是热心硬币最近收集整理的关于grpc-pb字段顺序的全部内容,更多相关grpc-pb字段顺序内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部