gRPC 使用-配置环境
搭建环境
安装 protoc
安装编译器,参考 Protocol Buffer Compiler Installation
# 最简单的方式
sudo apt install -y protobuf-compiler
也可以选择手动安装 官方资源库:
# 这里可以只下载对应的编译器的
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.1/protoc-3.19.1-linux-x86_64.zip
unzip protoc-3.19.1-linux-x86_64.zip -d protobuf-3.19.1/
# 添加这个执行文件
vim ~/.bashrc
export PROTOBUF=/home/alsritter/tool/go/protobuf-3.19.1/
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$PROTOBUF/bin
# 更新
source ~/.bashrc
# 检查是否安装完成
protoc --version
安装 Golang 的依赖
安装 Golang 的编译插件
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
更新路径
# 这一步其实可以省略
export PATH="$PATH:$(go env GOPATH)/bin"
将 Protoc Plugin 的可执行文件从 $GOPATH 中移动到 $GOBIN 下
mv $GOPATH/bin/protoc-gen-go $GOROOT/bin/
安装 gRPC 框架
go get -u google.golang.org/grpc
编译命令
$ protoc --help
Usage: protoc [OPTION] PROTO_FILES
-IPATH, --proto_path=PATH 指定搜索路径
--plugin=EXECUTABLE:
....
--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.
--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
@<filename> proto文件的具体位置
--proto_path或者-I参数用以指定所编译源码(包括直接编译的和被导入的 proto 文件)的搜索路径--go_out:参数之间用逗号隔开,最后用冒号来指定代码目录架构的生成位置--go_out=plugins=grpc:参数来生成 gRPC 相关代码,如果不加 plugins=grpc,就只生成 message 数据
其中:
--go_out=plugins=grpc,paths=import:. 。注意一下 paths 参数,他有两个选项,import 和 source_relative 。默认为 import ,代表按照生成的 go 代码的包的全路径去创建目录层级,source_relative 代表按照 protobuf 源文件的目录层级去创建 go 代码的目录层级,如果目录已存在则不用创建
# 这里就是读取 protos 目录下的 proto 文件
protoc -I . --go_out=plugins=grpc:. --go_opt=paths=source_relative protos/*.proto
实例
# 进入到 proto 目录中,输入
$ protoc *.proto --go_out=plugins=grpc:. --go_opt=paths=source_relative
# 或者在项目的根目录输入
# --go_opt=paths=source_relative 表示要用相对路径产生
$ protoc -I <src_proto_folder> --go_out=plugins=grpc:<dist_directory> --go_opt=paths=source_relative <src_proto_file_path>
$ protoc -I proto/jubox --go_out=plugins=grpc:proto/jubox --go_opt=paths=source_relative proto/jubox/jubox.proto
# 產生編譯檔(產生一般的 .pb.go 檔,但沒有使用 gRPC plugin
$ protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/addressbook.proto # 預設根據 go_package 路徑
# 產生 proto 檔,預設將根據 proto 中的 go_package 路徑
$ protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/addressbook.proto
# 另一種寫法會 build 出兩隻檔案,一支是 proto buffer(foobar.pb.go),一支是 gRPC 用的檔案(foobar_grpc.pb.go)
$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative {proto_filename}.proto