热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gogrpc代码库及其工具

go-grpc代码库及其工具1.什么是ProtocolBufferProtobuf(全称ProtocolBuffer)是Google出品的一种数据描

go-grpc 代码库及其工具


1. 什么是 Protocol Buffer

Protobuf(全称Protocol Buffer)是Google 出品的一种数据描述语言,可类比于json,独立于语言与平台。

Protobuf 提供了多种语言的实现:javac#c++gopython,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,总得来说就是更小、更快、更简单、更灵活,目前分别有v2v3的版本,我们推荐使用v3。具体查看Protocol Buffers的README介绍。


2. 什么是 protoc

protoc.proto文件的编译器(参见github),可以借助这个工具把.proto文件转译成各种编程语言对应的源码,包含数据类型定义、调用接口等。

通过查看protoc的源码可以知道,protoc在设计上把Protobuf和不同的语言解耦了,底层用c++来实现Protobuf结构的存储,然后通过插件的形式来生成不同语言的源码。可以把protoc的编译过程分成简单的两个步骤(如上图所示):


  1. 解析.proto文件,转译成protobuf的原生数据结构在内存中保存;
  2. protobuf相关的数据结构传递给相应语言的编译插件,由插件负责根据接收到的protobuf原生结构渲染输出特定语言的模板。

protoc源码中直接包含的插件有 csharpjavajsobjectivecphppythonruby等多种(没有直接提供给go)。


3. 什么是 protoc-gen-go


protocgo插件版本有两个,第一个主要版本(于2010年公开发布)由github.com/golang/protobuf模块实现;第二个主要版本(于2020年发布)则是由google.golang.org/protobuf模块实现。


protoc-gen-goprotobuf编译插件系列中的Go版本,执行下面的任一命令即可安装到$GOPATH/bin目录下

go get -u github.com/golang/protobuf/protoc-gen-go # v1
go get -u google.golang.org/protobuf/cmd/protoc-gen-go # v2,建议使用

虽然protoc-gen-go是二进制文件,但不能直接使用,protoc编译时使用-go_out选项,protoc会自动寻找PATH(系统执行路径)中的protoc-gen-go文件,从而生成*.pb.go文件,示例如下:

# 当前目录编译 helloworld.proto 生成 helloworld.pb.go
protoc -I . --go_out . --go_opt paths=source_relative ./helloworld.proto

4. 什么是 protoc-gen-go-grpc

protoc-gen-go-grpcgo版本的grpc编译插件,用于读取.proto文件中的grpc服务定义生成特定的go代码,具体参见github。同protoc-gen-go一样,protoc-gen-go-grpc也是由protoc驱动使用的,示例如下

# 当前目录编译 helloworld.proto 生成 helloworld.pb.go 和 helloworld_grpc.pb.go
protoc -I . -I $GOPATH/src/github.com/googleapis/googleapis/ \
--go_out . --go_opt paths=source_relative \
--go-grpc_out . --go-grpc_opt paths=source_relative \
./helloworld.proto

5. 什么是 protoc-gen-grpc-gateway

protoc-gen-grpc-gateway也是go版本的grpc编译插件,与protoc-gen-go-grpc不同的是,该插件用于读取gRPC服务定义,生成一个反向代理服务器,将RESTful JSON API转换为gRPC。此服务器是根据gRPC定义中的自定义选项生成的。

使用示例如下:

# 当前目录编译 helloworld.proto 生成 helloworld.pb.go、helloworld_grpc.pb.go 和 helloworld.gw.pb.go
protoc -I . -I $GOPATH/src/github.com/googleapis/googleapis/ \
--go_out . --go_opt paths=source_relative \
--go-grpc_out . --go-grpc_opt paths=source_relative \
--grpc-gateway_out . --grpc-gateway_opt paths=source_relative \
./helloworld.proto

6. protoc-gen-swagger

首先介绍下Swagger,Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发,是目前最受欢迎的RESTful Api文档生成工具之一。

protoc-gen-swaggergrpc-gatewaySwagger工具,可用于生成你的grpc服务的RESTful Api文档

# 当前目录编译 helloworld.proto 生成 helloworld.pb.go、helloworld_grpc.pb.go、helloworld.gw.pb.go 和 helloworld.swagger.json
protoc -I . -I $GOPATH/src/github.com/googleapis/googleapis/ \
--go_out . --go_opt paths=source_relative \
--go-grpc_out . --go-grpc_opt paths=source_relative \
--grpc-gateway_out . --grpc-gateway_opt paths=source_relative \
--swagger_out=logtostderr=true:. \
./helloworld.proto

目前,grpc-gateway V2已经发布,同时protoc-gen-swagger改名为protoc-gen-openapiv2


生成 restful api 文档参考 swagger ui



8. grpc 工具总结


插件描述功能源码仓库
protoc.proto文件编译器读取.proto文件中的数据结构传递给相应的编译插件github
protoc-gen-gogo版本的protoc编译插件读取.proto文件的message数据定义生成*.pb.go文件github v1版本
github v2版本
protoc-gen-go-grpcgo版本grpcprotoc编译插件读取.proto文件的grpc服务定义生成*_grpc.pb.go文件github
protoc-gen-grpc-gatewaygo版本grpc反向代理的protoc编译插件读取.proto文件的grpc服务定义生成*.gw.pb.go文件github
protoc-gen-swaggergo版本grpc v1restful api文档生成工具,用于生成你的grpc服务的RESTful Api文档github
protoc-gen-openapiv2go版本grpc v2restful api文档生成工具用于生成你的grpc服务的RESTful Api文档github

grpc 相关代码库


github.com/protocolbuffers/protobuf

该存储库是Google proto buffer的源码库,包含protoc buffer编译器protoc和多种语言的proto buffer编译插件的实现。


github.com/golang/protobuf

该存储库是protoc buffergo版本实现,protoc-gen-go目录即编译插件protoc-gen-go的实现。

实际上,go实现了两个主版本 (major version) 的protoc buffer,该存储库便是第一版,第二版是google.golang.org/protobuf,该库包含更新的简化的API,支持protobuf反射以及许多其他改进。 建议新代码使用google.golang.org/protouf模块。

另外第一版有一个增强版,参见github.com/gogo/protobuf


github.com/gogo/protobuf

该存储库是github.com/golang/protobuf 的增强版,生成的编译插件为protoc-gen-gofast,兼容github.com/golang/protobuf,具有更快的序列化与反序列化速度,支持更多的go结构规范。

另外,该存储库还可以生成以下几个更高效的编译插件:

protoc-gen-gogofast (same as gofast, but imports gogoprotobuf)
protoc-gen-gogofaster (same as gogofast, without XXX_unrecognized, less pointer fields)
protoc-gen-gogoslick (same as gogofaster, but with generated string, gostring and equal methods)

Fields without pointers cause less time in the garbage collector. More code generation results in more convenient methods.



github.com/googleapis/googleapis

该存储库包含支持RESTgRPC协议的公共Google API的原始接口定义。即各种googleapiproto文件,比如目录 google/api下的annotations.proto

github.com/golang/protobufv1.4及更高版本是根据google.golang.org/protobuf实现的。 使用这两个模块的程序必须至少使用该模块的v1.4版本。


github.com/googleapis/go-genproto

该存储库包含常见protocol buffer类型生成的Go代码库,以及与Google gRPC API进行交互所必需的生成的gRPC代码。

其中,googleapis目录是根据github.com/googleapis/googleapis生成的go代码。protobuf目录则 github.com/google/protobuf 下常用类型的生成代码。


google.golang.org/protobuf

该存储库是go实现的第二个主版本的protoc buffer,代码托管在github。主要包含两个部分:


  • protoc-gen-go : protocgo编译插件,用于生成特定的go代码;
  • Runtime library: 该模块包含一组Go软件包,这些软件包构成了Go中protobuf的运行时实现,提供了一组消息定义接口,以及序列化各种消息格式 (比如 jsontextwire) 的功能。

github.com/grpc/grpc-go

该存储库是go版本的grpc实现,提供了protoc-gen-go-grpc编译插件。源存储库为google.golang.org/grpc


github.com/grpc-ecosystem/grpc-gateway

该存储库是go版本的grpc-gateway实现,用于读取gRPC服务定义,生成一个反向代理服务器,将RESTful JSON API转换为gRPC。此服务器是根据gRPC定义中的自定义选项生成的。为此,该存储库提供了protoc-gen-grpc-gatewayprotoc-gen-openapiv2两个编译插件。


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 最近在使用C#进行录屏,通过调用ffmpeg的cmd命令进行录制。设置的录制时长是30秒,但实际只录制了11秒就停止了。关闭程序后,又开始录制并成功录制了30秒。请问大神,这是什么原因?附上了简单的调用程序。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 微服务之总体架构篇
    一、单体架构存在的问题缺点:1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;2、部署项目麻烦:庞大之后项目部署效率 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
author-avatar
手机用户2502929291_707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有