Protocol Buffer 介绍

发布时间: 更新时间: 总字数:973 阅读时间:2m 作者: IP上海 分享 网址

Protocol Buffer(缩写Protobuf)是Google开发的一种跨语言、跨平台、可扩展的机制,用于序列化结构化数据。类似于XML,但是更小、更快和更简单。它是Google内部主要的数据交互格式。

介绍

发展历史

  • 名称来自代码的类名 ProtocolBuffer
  • proto1:2001年出在Google内部开发和使用
  • proto2:2008年开源,独立后不依赖任何Google内部代码
  • proto3:(当前主流版本)2016年开源,整合了很多的意见和建议,提高开发效率。但不兼容之前版本
    • 最新版本为 v21.5,更多版本见 releases

特点

  • 支持多种语言,如 C++、Java、Python、Objective-C、C#、Ruby、Go、PHP、Dart
  • 性能高:压缩率高,速度快
  • 具有向后兼容的特性,更新 .proto 文件后,老版本依旧可以兼容(设计之初期望解决的问题)
    • 编译器对不能识别的字段自动跳过
  • 最主流的 IDL(interface description language)

什么是序列化

  • 序列化 是指将 数据结构对象状态 转换成可取用(存储或网络传输)格式,以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程
  • 反序列化 是其逆操作的过程

常见的序列化格式包括:yaml、json、xml、protobuf等。

安装 protoc compiler

  • protoc(Protocol Compiler) 编译器
  • 新版本参考安装(推荐)
  • 安装包解压后放到 bin + include 目录(父目录为 /usr/local
    • unzip protoc-xx.x-linux-x86_64.zip -d /usr/local
  • include 的文件也可以通过 protoc -I/usr/local/include 指定

源码安装

参考

直接到 github 下载,注意选择合适的版本

ubuntu 包安装

apt update
apt install protobuf-compiler golang-goprotobuf-dev

安装 protoc 插件

  • protoc 插件本质是一个命令行工具,根据 proto 文件,生成目标代码
  • 插件可执行文件命名格式 protoc-gen-$NAME,默认安装在某个 PATH 下(如 /usr/local/bin/),可以直接执行
    • protoc 命令中有 --${NAME}_out 参数时,会调用上述格式为 protoc-gen-$NAME 的插件
    • --${NAME}_out 参数控制传递给插件的 参数 和生成文件输出目录,并且是以 ${OPTION},${OPTION}:${OUT_PATH} 的形式
    • 新的参数 --${NAME}_opt 专门来负责参数传递,区分开了两个功能
      • --${NAME}_out=${OPTION},${OPTION}:${OUT_PATH} 等价于 --${NAME}_out=${OUT_PATH} --${NAME}_opt=${OPTION},${OPTION}

示例:

protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    proto/demo.proto

说明:

  • protoc 执行时,调用 protoc-gen-goprotoc-gen-go-grpc 两个插件
  • 且均传递了参数 paths=source_relative

protoc-gen-go

安装 protoc-gen-go

export GO111MODULE=on
export GOPROXY=https://goproxy.io,direct
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

# old version
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

使用

以 proto3 为例(参考官方go示例)Protobuf 使用时,一般的步骤:

  • 创建定义消息格式的 .proto 文件,语法见:proto 语法
  • 安装 protoc,并使用 protoc 编译 protocol buffer 文件,生成对应的 .pb.go 文件(包括消息 struct 和对象的方法、grpc 文件等),参考:Golang 使用 protobuf 实现 grpc 通信
  • 使用 Go protocol buffer API 来写入和读取消息

参考

  1. https://developers.google.com/protocol-buffers
  2. https://github.com/protocolbuffers/protobuf
  3. https://protobuf.dev/programming-guides/proto3/
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数