我是靠谱客的博主 热心硬币,最近开发中收集的这篇文章主要介绍grpc-pb字段顺序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简介

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字段顺序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部