Protocol Buffers入门


Protocol Buffers简介

现在的网络应用都是前后端分离的,数据传输方式有:jsonxml两种格式,其中json更多一些。现在又多了一种数据传输方式,就是google开发的Protocol Buffers。在分布式应用或者微服务架构中,各个服务之间通常使用json或者xml结构数据进行通信,通常情况下,是没什么问题的,但是在高性能和大数据通信的系统当中,如果有办法可以压缩数据量,提高传输效率,显然会给用户带来更快更流畅的体验。

也就是现在的数据传输方式有三种:

  • JSON
  • xml
  • Protocol Buffers

存在即合理,Protocol Buffers为什么会出现呢?回答及时性能。Protocol Buffers一个字——。一条消息数据,用Protocol Buffers序列化后的大小是JSON的十分之一,是xml格式的二十分之一,但是性能却是他们的5~100倍。

在这里插入图片描述

官方解释:Protocol Buffers是 Google 用于序列化结构化数据的语言中立、平台中立、可扩展机制——就像 XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,并使用各种语言。

使用方法

  1. 下载Protocol Buffers编译器https://github.com/protocolbuffers/protobuf
  2. 定义消息文件.proto
  3. 编译生成指定语言文件后使用

快速入门

编写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)
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值