Golang-RPC(三):关于 protobuf, protoc, protoc-gen-go, gRPC

  • Post author:
  • Post category:golang


1、protobuf的介绍

google protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。

2、protoc

它是一个编译器,将定义的 .proto 文件编译成Java、python、C++、C#、Go等代码片段,你可以复制他们到自己的项目中使用。

当然,如果你熟悉protobuf协议,也可以不使用这个工具。

下载安装

https://github.com/protocolbuffers/protobuf/releases

选择 protoc-3.13.0-win64.zip

解压,将 D:\software\protoc-3.13.0-win64\bin 添加到环境变量 PATH。

打开命令行输入
protoc --version

输出结果
libprotoc 3.13.0

linux系统
下载 protoc-3.13.0-linux-x86_64.zip
解压到 protoc
vi /etc/profile
添加 export PATH=$PATH:/data/www/protoc/bin
source /etc/profile
protoc --version
protoc -h

则表示protoc已经按照成功了。

3、protoc-gen-go

使用protoc可以生成指定语言的代码,但是代码不是由protoc生成的,而是它去调指定的语言的代码生成器。因此golang需要安装protoc-gen-go库。

go get -u github.com/golang/protobuf/protoc-gen-go

然后回自动编译安装得到 protoc-gen-go.exe 文件,在

GOPATH/bin

目录下。

确保被添加到环境变量。

同时这个库还提供了其他更多的功能。

4、gRPC

gRPC是由Google公司开源的一款高性能的远程过程调用(RPC)框架,可以在任何环境下运行。该框架提供了负载均衡,跟踪,智能监控,身份验证等功能,可以实现系统间的高效连接。另外,在分布式系统中,gRPC框架也有有广泛应用。

gRPC允许你定义一个服务模板,然后多个语言共用这个模板生成实现类,非常标准统一,多语言之间相互RPC调用。

gRPC中默认采用的数据格式化方式是protocol buffers。

gRPC源码库主页链接如下:

https://github.com/grpc/grpc

RPC开源库支持诸如:C++,C#,Dart,Go,Java,Node,Objective-C,PHP,Python,Ruby,WebJS等多种语言,开发者可以自行在gRPC的github主页库选择查看对应语言的实现。

grpc-go库是gRPC库的Golang语言实现版本。主页的Github地址如下:

https://github.com/grpc/grpc-go

5、protoc 命令详解

格式
protoc --go_out=dir1 file1
其中
--go_out 为输出结果的目录;其后的参数为要解析的proto文件
示例
protoc --go_out=./pkg/pbs ./pkg/pbs/helloworld.proto

如果多个proto文件之间有互相依赖,生成某个proto文件时,需要import其他几个proto文件,这时候就要用 -I 来指定搜索目录。
如果没有指定 –I 参数,则在当前目录进行搜索。
protoc --go_out=dir1 file1 -I dir2

如果proto文件中定义了service,那么需要指定插件来解析
protoc --go_out=plugins=grpc:dir1 file1
protoc --go_out=plugins=grpc:dir1 file1 -I dir2
示例
protoc --go_out=plugins=grpc:./pkg/pbs ./pkg/pbs/helloworld.proto

需要注意的是,在定义proto文件的时候,go_package 需要定义,最终生成的文件所在的目录是由 dir1 和 go_package 合并起来的。
比如,option go_package = "pkg/pbs;pbs";
命令 protoc --go_out=plugins=grpc:./ ./pkg/pbs/helloworld.proto,将会在 pkg/pbs 目录下生成一个文件,其包名为 pbs



版权声明:本文为raoxiaoya原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。