文章目录
Protocol Buffers简介
现在的网络应用都是前后端分离的,数据传输方式有:json
和xml
两种格式,其中json
更多一些。现在又多了一种数据传输方式,就是google开发的Protocol Buffers
。在分布式应用或者微服务架构中,各个服务之间通常使用json
或者xml
结构数据进行通信,通常情况下,是没什么问题的,但是在高性能和大数据通信的系统当中,如果有办法可以压缩数据量,提高传输效率,显然会给用户带来更快更流畅的体验。
也就是现在的数据传输方式有三种:
- JSON
- xml
- Protocol Buffers
存在即合理,Protocol Buffers为什么会出现呢?回答及时性能。Protocol Buffers一个字——快。一条消息数据,用Protocol Buffers序列化后的大小是JSON的十分之一,是xml格式的二十分之一,但是性能却是他们的5~100倍。
官方解释:Protocol Buffers是 Google 用于序列化结构化数据的语言中立、平台中立、可扩展机制——就像 XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,并使用各种语言。
使用方法:
- 下载Protocol Buffers编译器
https://github.com/protocolbuffers/protobuf
- 定义消息文件
.proto
- 编译生成指定语言文件后使用
快速入门
编写protobuf文件,并编译成go文件
为vscode安装vscode-proto3插件
vscode-proto3
创建一个protobuf文件
syntax = "proto3";
option go_package="./;hello";
package hello;
message Person{
string name = 1;
int32 age = 2;
string email = 3;
}
option go_package = “path;name”;
path 表示生成的go文件的存放地址,会自动生成目录的。 name 表示生成的go文件所属的包名
安装go protocol buffers 插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
编译生成go文件
所有proto文件放在proto文件夹,所有go文件放在go文件夹
然后终端输入指令:
protoc --go_out=./go ./proto/*
生成的go文件内容
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc v3.21.6
// source: proto/person.proto
package hello
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// 根据protobuf文件中的message Person 生成一个结构体
type Person struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Age int32 `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"`
}
// 重置方法
func (x *Person) Reset() {
*x = Person{
}
if protoimpl.UnsafeEnabled {
mi := &file_proto_person_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}