protobuf 协议

最后更新于:2022-04-02 02:57:02

[TOC] > [home protocol-buffers](https://developers.google.com/protocol-buffers) ## 简述 1. 一种数据交换格式 2. 相对字符传递可节省一半左右流量 ``` message Person { string name = 1; int32 id = 2; repeated string email = 3; } ``` 相当于把 `name `等 `key` 换为数字进行传输 3. 他既可以用作client/server 之间的数据交互,也可以用作 rpc 即可 grpc 4. protobuf 会有粘包问题,解决办法是在转为字节后,再添加到字节头部 ``` // 一个 golang 的例子 func main() { msg := &protogo.Msg{To: "hello", From: "word"} // 序列化为 bytes byt, _ := proto.Marshal(msg) //把字节长度转为字节放入头部 b :=IntToBytes(len(byt)) byt =append(b,byt...) log.Printf("len %v , content %v",len(a),a) // len 19 , content [0 17 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1] } func IntToBytes(n int) []byte { x := uint16(n)//定义包头长度为 2 个字节 bytesBuffer := bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer, binary.BigEndian, x) return bytesBuffer.Bytes() } ```
';