Protocol Buffers message 1 2 3 4 5 6 7 syntax = "proto3" ; message SearchRequest { string query = 1 ; int32 page_number = 2 ; int32 result_per_page = 3 ; }
文件后缀.proto
第一行定义版本 默认 proto2
唯一的数字编号用于识别在消息二进制格式中的字段。一旦被使用,不能更改。1-15只需要一个字节进行编码,用于标识频繁使用的字段。数字编号有一定的范围,且有一些预定义的数字。
proto3
字段默认是 singular
的,标识0个或1个。repeated
标识0个或多个
一个.proto
文件中可以定义多个消息类型。
可以通过import
引入定义在其他.proto
文件中的消息类型
注释格式 当行//
多行/*...*/
更新消息类型
1 2 3 4 message Foo { reserved 2 , 15 , 9 to 11 ; reserved "foo" , "bar" ; }
安装Protoc installed the compiler 下载地址 选择对应平台,解压并配置PATH路径
使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 protoc [OPTION] PROTO_FILES -I=PATH, --proto_path=PATH -java_out=OUT_DIR protoc --java_out=./java/ ./proto/helloworld.proto
install the Go protocol buffers plugin
1 2 # 自带grpc插件 go get -u github.com/golang/protobuf/protoc-gen-go
1 2 3 # 不支持grpc go get -u google.golang.org/protobuf/cmd/protoc-gen-go 或 go install google.golang.org/protobuf/cmd/protoc-gen-go@latest (go1.16)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -go_out=OUT_DIR #指定输出的go文件所在目录 --go_opt=FLAG #在使用protoc时,通过go_opt给protoc-gen-go传特定的参数 paths=source_relative # the output file is placed in the same relative directory as the input file. paths=import # 会根据Go package's import path创建对应的文件层级 protoc --go_out=out --go_opt=paths=source_relative foo.proto # 比如 foo.proto 在当前目录下,那么生成文件在out/foo.pb.go protoc --go_out=out --go_opt=paths=source_relative in/foo.proto # 如果foo.proto在in 目录下,那么生成文件在out/in /foo.pb.go # --go_out=DIR DIR目录需要在执行命令之前被创建出来,而后续的in 目录会自动创建
1 2 3 option go_package = "example.com/project/protos/fizz"; # 生成的go文件默认使用fizz当做包名,如果需要显示声明,通过;间隔 option go_package = "example.com/project/protos/fizz;package_name";
生成go文件代码
GRPC
生成 当使用编译器编译.proto
文件时,编译器会生成你所选择的语言生成代码,对于Go,会生成一个.pb.go
文件,里面包含.proto
中的定义的每一个类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 生成Go类型文件需要在.proto文件中通过 go_package 指定包名 # 例 option go_package = "./;packagename" ; # --go_out指定.pb.go文件生成位置 protoc --go_out=. *.proto # 生成grpc文件(github版本) protoc --go_out=plugin=grpc:. *.proto # 生成grpc文件(google版本) # 安装protoc-gen-go-grpc插件 go get google.golang.org/grpc/cmd/protoc-gen-go-grpc # --go-grpc_out 指定grpc生成路径 protoc --go_out=. --go-grpc_out=. *.proto
gRPC-gateway gRPC-Gateway 是Google protocol buffers compiler(protoc)的一个插件。读取 protobuf 定义然后生成反向代理服务器,将 RESTful HTTP API 转换为 gRPC。
1 go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
1 2 3 4 5 6 7 8 9 10 11 12 import "google/api/annotations.proto" ;service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) { option (google.api.http) = { get: "/v1/greeter/sayhello" body: "*" }; } }
1 2 --grpc-gateway_out --grpc-gateway_opt
1 2 3 # 生成swag文档插件 go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest --openapiv2_out
示例 示例代码