• 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
    
    • 1

    创建一个protobuf文件

    syntax = "proto3";
    option go_package="./;hello";
    
    
    package hello;
    
    message Person{
        string name = 1;
        int32 age = 2;
        string email = 3;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    option go_package = “path;name”;

    path 表示生成的go文件的存放地址,会自动生成目录的。 name 表示生成的go文件所属的包名

    安装go protocol buffers 插件

    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    
    • 1

    编译生成go文件

    所有proto文件放在proto文件夹,所有go文件放在go文件夹

    在这里插入图片描述

    然后终端输入指令:

    protoc --go_out=./go ./proto/*
    
    • 1

    生成的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
    • 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
    • 40
    • 41
    • 42
  • 相关阅读:
    java计算机毕业设计考试编排管理系统源码+mysql数据库+系统+lw文档+部署
    25、Java 初始化块和静态初始化块详解,超详细(案例多、官方教程)
    21. 合并两个有序链表
    Redis分布式锁
    代码随想录算法训练营19期第44天
    element UI表格控制列行合并
    Doris安装(一)之docker编译+fe和be的配置与启动
    (九)socket·NIO socket 实现 服务端广播+客户端群聊 -不限制次序,不限制交互次数
    生成 PDF 用 Turborepo 管理,简单的事情复杂化?
    关于产研项目管理的一些思考与记录
  • 原文地址:https://blog.csdn.net/qq_39280718/article/details/126918081