protobuf入门学习

Olivia的小跟班 Lv3

1、什么是protobuf

​ Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议数据存储等领域。

2、为什么要使用protobuf

优点:

  1. 足够简单
  2. 序列化后体积很小:消息大小只需要XML的1/10 ~ 1/3
  3. 解析速度快:解析速度比XML快20 ~ 100倍
  4. 多语言支持
  5. 更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容

缺点:

  1. 不易读: Protocol Buffers是一种二进制格式,不像JSON或XML那样易于人类阅读和调试。这使得在调试和开发阶段,理解数据结构变得更加困难。
  2. 不支持动态模式: Protocol Buffers使用预定义的消息格式,这意味着消息结构必须在编译时定义,并且不容易支持动态模式。对于需要在运行时动态定义消息结构的场景,这可能是一个限制。
  3. 不是自描述的: Protocol Buffers消息本身不包含关于消息类型的信息。这意味着接收者必须在其他地方知道消息的类型,这可能会导致一些通信上的困扰,尤其是当消息结构发生变化时。
  4. 没有内建的标准化架构: Protocol Buffers没有像XML Schema或JSON Schema那样的内建标准化架构,用于定义消息的结构和约束。这使得在不同团队或组织中共享数据结构时可能会引发一些问题。
  5. 不适用于所有的数据类型: Protocol Buffers适用于结构化数据,但不太适用于包含嵌套、非结构化或自由格式文本的数据。对于这类数据,其他格式可能更加合适。
  6. 版本兼容性: 当消息结构发生变化时,可能会导致与旧版本的兼容性问题。虽然Protocol Buffers提供了一些版本兼容性的支持,但在某些情况下,仍然需要小心处理版本升级的问题。

3、安装protobuf

首先从GitHub下载合适的protobuf版本:Protobuf安装 ,下载解压之后把protobuf/bin目录添加到系统环境变量Path里面,最后使用命令验证是否安装成功。

image-20240219202916151

4、学习并编写protobuf文件

以下是一个protobuf文件编写的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
syntax="proto3";  //syntax="proto3";:指定使用的 Protocol Buffers 版本为 proto3。

package geecachepb; //package geecachepb;:指定生成的代码所属的包名为 geecachepb。

/*
message Request:定义了一个名为 Request 的消息类型,用于向缓存服务发送请求。它包含以下字段:
string group=1;:表示缓存组的名称,使用字段标签 1。
string key=2;:表示要获取的缓存键,使用字段标签 2。
*/
message Request{
string group=1;
string key=2;
}

/*
message Response:定义了一个名为 Response 的消息类型,用于从缓存服务接收响应。它包含以下字段:
bytes value=1;:表示返回的缓存值,使用字段标签 1。
*/
message Response{
bytes value=1;
}

/*
service GroupCache:定义了一个名为 GroupCache 的服务,该服务提供了一种名为 Get 的远程过程调用(RPC)方法,用于从缓存中获取数据。具体解释如下:
rpc Get(Request) returns (Response);:定义了一个 Get 方法,它接受一个名为 Request 的请求消息,并返回一个名为 Response 的响应消息。
*/
service GroupCache{
rpc Get(Request) returns (Response);
}

/*
option go_package = "geecache/geecachepb"; 是在 Protocol Buffers 的 .proto 文件中添加的选项,用于指定生成的 Go 代码所属的包路径。
具体来说,go_package 选项中的值 "geecache/geecachepb" 表示生成的 Go 代码将被放置在 geecache/geecachepb 包中
*/
option go_package = "geecache/geecachepb";

//命令:
// protoc --go_out=. geecache/geecachepb/geecachepb.proto
// protoc --go-grpc_out=. geecache/geecachepb/geecachepb.proto
  • 标题: protobuf入门学习
  • 作者: Olivia的小跟班
  • 创建于 : 2024-02-19 20:18:51
  • 更新于 : 2024-02-19 20:32:38
  • 链接: https://www.youandgentleness.cn/2024/02/19/protobuf入门学习/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论