Protobuf通信协议

2,533 阅读2分钟

我正在参与掘金创作者训练营第5期,点击了解活动详情

Protobuf介绍

Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为proto文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过Protobuf序列化的数据。

Protobuf的优势:

  • 序列化后体积比JSON和XML小,适合网络传输
  • 序列化反序列化速度快,比JSON的处理速度快

Protobuf官方工程主页上显示的已支持的开发语言多达10种,分别有:C++、Java、Python、Objective-C、C#、JavaNano、Ruby、Go、PHP,基本上主流的语言都已支持。

工程主页:github.com/52im/protob…

语言github插件地址
C++ (include C++ runtime and protoc)github.com/protocolbuf…
Javagithub.com/protocolbuf…
Pythongithub.com/protocolbuf…
Objective-Cgithub.com/protocolbuf…
C#github.com/protocolbuf…
PHPgithub.com/allegro/php…
Gogithub.com/protocolbuf…

常见数据交互格式对比

  1. JSON (JavaScript Object Notation):一般用于WEB项目中,因为浏览器对JSON格式的数据支持非常好,大部分编程语言有很多内建函数支持,而且JSON几乎支持所有编程语言。
  2. XML:XML在WebService中的应用比较多,相比于JSON,它的数据更加冗余,因为需要成对的闭合标签,而JSON使用了键值对的方式,不仅压缩了一定的数据空间,同时也有更好的可读性。
  3. Protobuf:谷歌公司新开发的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为Protobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性,因此只能反序列化得到可读数据。

安装

Mac 安装,使用brew命令进行protobuf安装默认安装最新的版本。

brew install protobuf
brew install protoc-gen-go

查看protoc版本

protoc --version

图片.png

安装 Go 语言的插件

github.com/grpc-ecosys…

图片.png

配置

vim ~/.bash_profile
export GO_PATH=~/go
export PATH=$PATH:/$GO_PATH/bin
source ~/.bash_profile

vscode 插件

插件商场中搜索这个

图片.png

第一个文件

hello.proto

syntax = "proto3";

import "google/protobuf/any.proto";

package hello;

option go_package = "proto/gen/go";

message HelloReq {
  string name = 1;
}

message HelloResp {
  int32 code = 1;
  string greet = 2;
  google.protobuf.Any details = 3;
}

service HelloService {
  rpc Greet(HelloReq) returns (HelloResp);
}

初始化项目

go mod init example
protoc --go_out=. hello.proto

生成 hello.pb.go

main.go

package main

import (
   "fmt"
   hello "example/proto/gen/go"
)

func main() {
   req := &hello.HelloReq{
      Name: "hello",
   }
   fmt.Println(req.String())
}

控制输出

name:"hello"