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

如果你是 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-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
// 安装 grpc
go 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://www.xdnf.cn/news/8538.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue3.5+版本 defineProps响应式解构,保留数据响应式

正确写法:直接通过 defineProps 结构可以保留响应式 let {num:numNew} defineProps({num: {} }) console.log(具有响应式,numNew); 错误写法:这样会丢失响应式 const props defineProps({num: {} }) let {num:numNew} props console.log(会丢失响…

直播 鸿蒙5.0面试必修技能之鸿蒙性能优化技术

一:行业分析: PC时代---互联网---移动互联网---大数据/人工智能---物联网 c/c/java/php--- andorid/ios/前端/hadoop(存储)/spark/flink【12-14年】 --- ArkTS 李兴平 hao123.com/ 网站:6w/day 06年 5000w卖给了百度 盛大传奇/ 腾讯 互联…

怎么能更好的通过驾考呢?

充分准备: 提前了解驾考内容和要求,包括理论知识、场地驾驶技能、道路驾驶技能和安全文明驾驶常识等。合理安排学习时间,确保有足够的时间进行学习和练习。理论学习: 认真阅读和理解驾考相关书籍和资料,特别是交通法规…

Notion + Python + scholarly = 超强文献管理助手

摘要:在科研文献管理中,研究人员常常需要维护自己的文献数据库,我使用 Notion-database 作为的文献数据库管理工具(开源模板)。Notion-based 的方法无法实时更新文章的引用量信息。我结合了 Notion Integration 和 sch…

Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法

Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法 起源 让我们从一个常见的Git错误开始: fatal: bad object refs/heads/master - 副本这个错误提示通常意味着Git在引用(ref)中发现了不一致或损坏的数据。引用是Git用…

LinkedIn怎么养号:2024最新养号技巧揭秘

LinkedIn领英作为全球最大的职场社交平台,是跨境外贸企业与潜在客户、业务伙伴和同事进行交流的重要平台。然而,许多人在注册和使用LinkedIn时,常常会遇到账户受限甚至被封的困扰。想要拥有一个安全稳定的LinkedIn账户,养号是必不…

RHCE—web服务器

一、web服务器简介 web服务器一般指的是“网站服务器”,是某种驻留在因特网上的计算机程序,可以向请求终端提供服务,主要功能时存储、处理和传递网页给“客户”,传递内容一般是HTML文档、图像、样式表或脚本等,也可以…

块存储、文件存储和对象存储详细介绍

块存储、文件存储和对象存储介绍 块存储:像跑车,因为它们都能提供快速的响应和高性能,适合需要即时数据访问的场景,比如数据库和虚拟化技术。 文件存储:像货车,因为它们都能承载大量货物(文件&…

ARM base instruction -- umaddl

Unsigned Multiply-Add Long multiplies two 32-bit register values, adds a 64-bit register value, and writes the result to the 64-bit destination register. 将两个32位寄存器值相乘,添加一个64位寄存器值,并将结果写入64位目标寄存器。 64-bit…

bossplayersCTF: 1 靶场渗透

靶场:bossplayersCTF: 1 bossplayersCTF: 1 ~ VulnHubhttps://www.vulnhub.com/entry/bossplayersctf-1,375/ 攻击机:kali-linux-2024 第一部分:信息收集 1,将两台虚拟机网络连接都改为NAT模式,并查看靶机的MAC地址 2,…

【linux学习指南】磁盘分区挂载到目录,形成文件系统挂载点

文章目录 📝前言🌠 查看系统分区🌉制作一个大的磁盘块,就当做一个分区🌉格式化写入文件系统🌉将分区挂载到指定的目录🌉在分区重创建文件🌉卸载分区🌉分区挂载到目录才能…

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&#…

redis 原理篇 25 网络模型 信号驱动IO 及 异步IO

剩下这两种,用得少,快速过一下, 说啥队列太小,这个不是问题,搞个持久化, 说啥队列元素太频繁导致开销大,这个也没问题,搞成批量入队,减少频率,增大吞吐量&am…

某事业单位转型公益二类后岗位梳理项目纪实

某事业单位转型公益二类后岗位梳理项目纪实 ——公益一类事业单位转型二类后,如何优化岗位配置,梳理岗位职责 【客户行业】事业单位 【问题类型】岗位梳理 【客户背景】 某地公证机构于20世纪90年代经批准设立,是该市司法局直属国家公证…

DNS域名解析服务器--RHCE

1.DNS简介 DNS ( Domain Name System )是互联网上的一项服务,它作为将域名和 IP 地址相互映射的一个分布式 数据库,能够使人更方便的访问互联网 DNS 系统使用的是网络的查询,那么自然需要有监听的 port 。 DNS 使用的是…

Linux案例:DNS服务器配置

Linux案例:DNS服务器配置 实验一:正向解析 服务端配置: [rootserver ~]# setenforce 0 [rootserver ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.70.131/24 ipv4.gateway 192.168.70.2 ipv4.dns 114.114.114.11…

京东创作平台旋转验证码识别

昨天京东创作平台验证码又更新了,变成了这种旋转验证码。经过我们一天的努力,终于完成了这款验证码的数据标记,模型训练。现在正确率达到了几乎100%。 识别代码 只需要获取图片链接,下载图片得到原图,使用下面代码就可…

Spring DispatcherServlet详解

文章目录 Spring DispatcherServlet详解一、引言二、DispatcherServlet的初始化与工作流程1、DispatcherServlet的初始化1.1、加载配置和建立WebApplicationContext1.2、初始化策略 2、DispatcherServlet的工作流程2.1、请求分发2.2、代码示例 三、总结 Spring DispatcherServl…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境: Ubuntu20.04, 本文安装的版本: cuda_11.1.0;cuDNN-8.2.1;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

[GDKOI2024 普及组] 读书(线段树)

luogu 传送门https://www.luogu.com.cn/problem/P10077 解题思路 我们可以贪心地思考:每次寻找最小值,然后去阅读这一章。 直到阅读的章数达到 。 这样,你就可以写出一个 的暴力,拿 40 分。 但是,如果你并不满足于…