protobuf与protoc-gen-go
from: https://studygolang.com/articles/12673?fr=sidebar
什么是protobuf
Protobuf(Protocol Buffer)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。(参考链接)
什么是protoc
protoc是protobuf文件(.proto)的编译器(参考链接),可以借助这个工具把 .proto 文件转译成各种编程语言对应的源码,包含数据类型定义、调用接口等。
通过查看protoc的源码(参见github库)可以知道,protoc在设计上把protobuf和不同的语言解耦了,底层用c++来实现protobuf结构的存储,然后通过插件的形式来生成不同语言的源码。可以把protoc的编译过程分成简单的两个步骤(如上图所示):1)解析.proto文件,转译成protobuf的原生数据结构在内存中保存;2)把protobuf相关的数据结构传递给相应语言的编译插件,由插件负责根据接收到的protobuf原生结构渲染输出特定语言的模板。
源码中(参见github库)包含的插件有 csharp、java、js、objectivec、php、python、ruby等多种。
什么是protoc-gen-go
protoc-gen-go是protobuf编译插件系列中的Go版本。从上一小节知道原生的protoc并不包含Go版本的插件,不过可以在github上发现专门的代码库(参见github库)。
由于protoc-gen-go是Go写的,所以安装它变得很简单,只需要运行 go get -u github.com/golang/protobuf/protoc-gen-go
,便可以在$GOPATH/bin目录下发现这个工具。至此,就可以通过下面的命令来使用protoc-gen-go了。
protoc --go_out=output_directory input_directory/file.proto
其中"--go_out="表示生成Go文件,protoc会自动寻找PATH(系统执行路径)中的protoc-gen-go执行文件。
protoc-gen-go的源码
按照Go的代码风格,protoc-gen-go源码主要包含六个包(package):
main包
- doc.go 主要是说明。
- link_grpc.go 显式引用protoc-gen-go/grpc包,触发grpc的init函数。
- main.go 代码不到50行,初始化generator,并调用generator相应的方法输出protobuf的Go语言文件。
generator包
- generator.go 包含了大部分由protobuf原生结构到Go语言文件的渲染方法,其中
func (g *Generator) P(str ...interface{})
这个方法会把渲染输出到generator的output(generator匿名嵌套了bytes.Buffer,因此有Buffer的方法)。 - name_test.go 测试,主要包含generator中名称相关方法的测试。
- generator.go 包含了大部分由protobuf原生结构到Go语言文件的渲染方法,其中
grpc包
- grpc.go 与generator相似,但是包含了很多生成grpc相关方法的方法,比如渲染转译protobuf中定义的rpc方法(在generator中不包含,其默认不转译service的定义)
descriptor 包含protobuf的描述文件(.proto文件及其对应的Go编译文件),其中proto文件来自于proto库(参见这里)
plugin 包含plugin的描述文件(.proto文件及其对应的Go编译文件),其中proto文件来自于proto库,参见这里
结语
从巴别塔的传说(参见这里)可以知道,欲要构建大系统,个体之间的沟通规范很重要。protobuf的出现,为不同系统之间的连接提供了一种语言规范,只要遵循了这个规范,各个系统之间就是解耦的,非常适合近年来流行的微服务架构。
如果吧protoc和protoc-gen-go看成两个微服务,可以发现这两个服务就是完全解耦的;两者完全负责不同的功能,可以分别编码、升级,串接这两个服务的就是proto规范。
protobuf与protoc-gen-go相关推荐
- protoc gen php,protoc-gen-php --php_out: protoc-gen-php: Plugin output is unparseable.
背景 业务需要用protobuffer 进行通讯. client: php server: c++ 在github 上找到 Protobuf-PHP (https://github.com/drslu ...
- 【Android Protobuf 序列化】Protobuf 使用 ( protoc 编译器简介 | 下载 protoc 编译器 | 使用 protoc 编译器编译 .proto 源文件 )
文章目录 一.protoc 编译器简介 二.下载 protoc 编译器 三.使用 protoc 编译器编译 addressbook.proto 源文件 四.参考资料 一.protoc 编译器简介 在上 ...
- 【grpc02】安装protobuf和protoc
目录 Windows环境 下载通用编译器 配置环境变量 安装go专用的protoc的生成器 GoLang中安装插件 如何使用protobuf呢? Mac环境 Protoc安装 Protoc-gen-g ...
- 深入理解 ProtoBuf 原理与工程实践(概述)
ProtoBuf 作为一种跨平台.语言无关.可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储.随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代R ...
- 【Android Protobuf 序列化】Protobuf 服务器与客户端通信 ( TCP 通信中使用 Protobuf )
文章目录 一.TCP 粘包和分包 二.TCP 粘包和分包解决方案 三.客户端 Android 应用使用 Protobuf 四.服务器端 Java 服务器使用 Protobuf 五.参考资料 一.TCP ...
- 【Android Protobuf 序列化】Protobuf 使用 ( protobuf-gradle-plugin 插件简介 | Android Studio 中配置插件 | AS 中编译源文件 )
文章目录 一.protobuf-gradle-plugin 插件简介 二.Android Studio 中配置 protobuf-gradle-plugin 插件 三.Android Studio 中 ...
- php protobuf 性能,php中使用protobuffer
Protobuf 简介 protobuf(Protocol buffers)是谷歌出品的跨平台.跨语言.可扩展的数据传输及存储的协议,是高效的数据压缩编码方式之一. Protocol buffers ...
- Burpsuite中protobuf数据流的解析 - Vincent
0×00 前言 对于protobuf over-HTTP的数据交互方式Burpsuite不能正确的解析其中的数据结构,需要Burpsuite扩展才能解析,笔者使用mwielgoszewski的burp ...
- php protobuf 二进制,PHP环境中使用ProtoBuf数据格式
1.syntax="proto3":表明使用的是proto3格式,如果不指定则为proto2 2.package test:定义包名为test,生成类时,会产生一个目录为test ...
- protobuf版本常见问题
protobuf版本常见问题 许多软件都依赖 google 的 protobuf,我们很有可能在安装多个软件时重复安装了多个版本的 protobuf,它们之间很可能出现冲突并导致在后续的工作中出现版本 ...
最新文章
- oracle初始安装大小
- word经常用到的技巧
- 关于$.getJson
- html中text函数,text函数的使用方法
- java获取网络图片_做个看图片的App玩玩_第一篇
- 构造函数= default;_C++核心准则C.46:默认状态下明确定义单参数构造函数
- Sqlmap使用教程--Sqlmap安装
- 苹果cms V10模板 仿挖片自适应电影模板
- FlashFX 设置 定时上传数据到ftp服务器
- 精选免费可商用素材网站,包括PPT模板、PSD、矢量图等等
- C++验证奇偶性时求余运算%和位运算的速度比较
- Aria2+Rclone教程
- userdel: user xxx is currently used by process xxx
- 《研究生英语科技论文写作》学习笔记
- 使用python发送qq邮件
- win2008 r2 hyper-v虚拟机的安装使用图文教程
- 4418GPIO口调用过程
- 宏观经济学-大题资源整理
- wp8.1 java_UWP tips (与wp8.1的不同)
- net_device详解