当前位置:首页 » 《我的小黑屋》 » 正文

【启程Golang之旅】深入理解 Protocol Buffers 及其应用

24 人参与  2024年12月01日 14:01  分类 : 《我的小黑屋》  评论

点击全文阅读


如果你是 Go 语言的开发者,理解如何在 Go 中使用 Protobuf,将帮助你大幅提升数据传输的效率,并实现更高性能的系统设计。

本篇文章将深入探讨 Go 语言中使用 Protobuf 的基础知识、常见应用以及最佳实践,带你一步步了解如何在项目中高效利用 Protobuf,解决实际开发中的数据交换问题。

目录

初识Protobuf

Protobuf原理介绍

Go语言环境搭建

Protobuf基本使用


初识Protobuf

        Protocol Buffers简称protobuf,是一个无关语言,无关平台的用于序列化结构化数据的工具,于2008年被Google开源的一种数据描述语言,也可以叫做接口规范的描述语言,相较于json体积更小,传输更快,常定义在.proto文件中,在特定语言进行编译时进行动态编译,所以即使你客户与服务端使用不同的语言,只要修改proto文件则会在两端同时生效:

protobuf优势:使用二进制格式进行数据编码,相比于文本格式(如 JSON 或 XML),它能显著减少数据的体积,这使得在网络传输中数据更加紧凑,带宽占用更少,尤其在处理大规模数据时,能够提升性能,当然还有编解码效率和多语言支持等等的优势:

Protobuf原理介绍

        protobuf是一种二进制格式编码,实现序列化的结构化数据信息需要通过message来定义一个类似struct的数据集合,每一条protocol buffer消息都是一个小的逻辑记录,包含了一系列的name-value键值对,文件都是以 .proto 为后缀 ,如下是一个基础的.proto文件示例:

message Person {  required string name = 1;  required int32 id = 2;  optional string email = 3;  enum PhoneType {    MOBILE = 0;    HOME = 1;    WORK = 2;  }  message PhoneNumber {    required string number = 1;    optional PhoneType type = 2 [default = HOME];  }  repeated PhoneNumber phone = 4;}

每一条消息类型都有一个或多个编号唯一的field,并且每一个field都具有名称和类型,以如下简单的messgae进行举例说明一下每个字段的含义是什么:

// repeated: 字段tag,表示复合类型// Result: 字段数据类型,可以自定义// results: 字段的命名// 1: 字段的编号message SearchResponse {    repeated Result results = 1;}

Go语言环境搭建

protoc:是一个protobuf编译器用于将protobuf)描述文件.proto 文件转换成各编程语言源代码的工具,这个编译器根据 .proto 文件中定义的数据结构,自动生成序列化和反序列化的代码,便于开发者在不同的编程语言中使用protobuf进行数据交换,如下图所示

通过protobuf编辑器的作用,我们就可以将.proto 文件构造生成右侧的go语言的package:

接下来我们开始下载protoc这个编辑器,来到官方网址:地址,这里注意根据自身电脑系统情况下载不同的源码包,这里我就以window系统进行举例,这里我们安装如下最新版本:

下载之后将压缩包解压到本地非C盘目录下,解压后的文件内包含如下三个文件:

include:头文件或库文件;bin:包含protoc编译器;readme.txt安装教程

了解即可:接下来把解压后⽂件中的bin目录配置到系统环境变量的Path中去:

然后win+r打开cmd终端输入protoc--version命令出现如下界面,有版本号说明我们安装配置成功:

主要操作:接下来我们只需要将该解压文件bin目录下的 protoc.exe 文件放置到我们配置go语言的GOBIN目录下即可,如下可以看到我们的默认GOBIN目录:

接下来还需要安装两个go语言的插件工具:protoc-gen-goprotoc-gen-go-grpc它们用于生成 go语言代码,分别用于处理protobuf消息和实现grpc服务,这里我们只需要cmd执行如下安装命令即可:

// 如果下载失败(网络延迟断开),可以考虑先开启代理,在执行如下两个插件安装go env -w GOPROXY=https://goproxy.cn,direct// 安装protoc-gen-gogo install google.golang.org/protobuf/cmd/protoc-gen-go@latest// 安装 grpcgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

网速不好直接开启代理,出现如下界面说明我们安装成功:

然后我们来到我们的GOBIN目录下可以看到我们的工具都以及安装完成了:

终端执行如下命令可以看到我们的安装版本:

Protobuf基本使用

定义protobuf文件:一般我们定义应该protobuf文件采用的写法如下所示,以下是对参数讲解:

1)syntax:表示采用proto3的语法,零值初始化

2)package:指明当前是main包

3)option:protobuf的一些选项参数,这里指定要生成的go语言package路径

4)message:关键字定义一个新的String类型

syntax = "proto3";package helloworld;option go_package = "./";// 定义请求消息message HelloRequest {  string name = 1;}

然后我们终端执行如下命令,可以看到我们的protobuf被编译成功了:

编译protobuf文件:根据上图对protobuf文件进行编译我们知道,还需要输入对应指令,这里进行如下解释,比如我们要编译如下文件:

具体的对于protobuf讲解我会在其他go专栏的文章中继续讲解应用,欢迎大家关注学习!


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/194947.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1