1.引入
grpc 一款默认采用Proto 作为接口描述语言的一个RPC实现方案
Protobuf主要用于不同的编程语言的协作RPC场景下,定义需要序列化的数据格式。Protobuf本质上仅仅是一种用于交互的结构式定义,从功能上和XML、JSON等各种其他的交互形式都并无本质不同,只负责定义不负责数据编解码
Protobuf 特点:
效率高
支持跨平台、多语言
扩展性、兼容性好
使用简单
可读性差,缺乏自描述
本文针对效率问题进行一下简单的分析
- pb.go文件
go语言在使用 protovuf 时候会生成一个pb 点 go文件
对于版本的支持
const (
// protoimpl.EnforceVersion 自定义的unint,来判断当前版本是需要重新生产
// 生成的代码太旧,需要重新生成 protoc 版本太低
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
//-运行时包太旧,需要更新,你的protobuf 版本太低
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
旧版本生成
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
2.结构体
type HelloRequest struct {
// 以下是protobuf自动填充的字段,protobuf需要使用
// state 保存 proto文件的反射信息 sizeCache序列化的数据总长度 unknownFields 不能解析的字段
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // 说明这个字段是protobuf的varint类型,index为1 name为code,使用proto3协议 omitempty 忽略默认值
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
B bool `protobuf:"varint,3,opt,name=B,proto3" json: