protocol buffer
是谷歌内部的混合语言数据标准,通过将结构化的数据
进行序列化,结果可用于通讯、存储. 该标准协议与语言无关、平台无关.
目前基本已被所有主流开发语言所支持. 其功能定位对标 json
、xml
等数据标准.
序列化
:将数据结构或对象转换成二进制串的过程反序列化
:将在序列化过程中所产生的二进制串转换成数据结构或对象的过程protoc
命令来自于https://github.com/google/protobuf
项目,它就是该项目提供的编译器.
可以将源文件xxx.proto
编译成开发语言文件
,例如xxx.pb.go
,使之成为一个可以在go工程
中直接使用的对象.
可以近似的理解为一个类似于自动生成代码的脚手架.
原生的protoc中并未支持自动生成go
语言的代码.(太奇怪了,google作为go、protobuf的诞生地 竟然不支持go.)
root@MacBook-Pro bin % setopt no_nomatch // 这一个命令是否执行 视情况而定
root@MacBook-Pro bin % protoc -h |grep out
...
--cpp_out=OUT_DIR Generate C++ header and source.
--csharp_out=OUT_DIR Generate C# source file.
--java_out=OUT_DIR Generate Java source file.
--js_out=OUT_DIR Generate JavaScript source.
--kotlin_out=OUT_DIR Generate Kotlin file.
--objc_out=OUT_DIR Generate Objective-C header and source.
--php_out=OUT_DIR Generate PHP source file.
--python_out=OUT_DIR Generate Python source file.
--ruby_out=OUT_DIR Generate Ruby source file.
例如生成php版本的pb代码.
cd proto文件所在目录 && protoc --php_out=. *.proto
执行之后即可查看生成文件
幸运的是go
代码的生成可以通过protoc
的一个插件protoc-gen-go
. 这也是一个命令.
protoc-gen-go的安装
1. go get -u -v github.com/golang/protobuf/protoc-gen-go
2. 将$GOPATH/bin 设置为环境变量,否则 protoc无法自动加载该插件
tips
如果已经安装过 go get -u github.com/golang/protobuf/protoc-gen-go@v1.1.0 走升级模式
如果未安装过 go get github.com/golang/protobuf/protoc-gen-go@v1.1.0 走安装模式
以上条件ok后,执行. 如果有报错 根据提示信息操作 一般不会有什么异常.
protoc --go_out=. task.proto
grpc是一种rpc框架. 依赖于protobuf进行通讯. 所以学习grpc的时候,总也绕不过protoc
和protoc-gen-go
.
如果我们仅仅使用 protoc-go-gen 产生的代码. 通常我们只能仅仅把把当做一个数据结构来使用.
而使用protoc-gen-go-grpc
生成的go代码,里面会生成一些接入grpc框架相关代码,我们只要遵循这些要求进行实现,就可以利用grpc框架进行通讯.
当然,protoc-gen-go-grpc
需要的proto
文件也与单纯的proto
文件略有区别
go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc 升级
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc 安装
foo.proto
syntax="proto3";
package tsp.foo;
option go_package="./;foo_engine";
import "xxx.proto";
service FooEngineService {
rpc Create(FooReqCreate) returns (FooResp);
rpc Change(FooReqChange) returns (FooResp);
}
service FooEngineBusService {
rpc CreateCallback(FooReqCreateCallback) returns (FooResp);
rpc ChangeCallback(FooReqChangeCallback) returns (FooResp);
}
message FooResp {
int32 Err = 1;
string ErrMsg = 2;
FooRespData Data = 3;
}
编译
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative *.proto
我个人理解protoc-gen-go-grpc
与protoc-go-gen
是一个同等级插件.