本地环境搭建
- 官网地址:https://grpc.io/
- 前置条件:
- 安装 Go 软件。
- 安装 Protocol buffer 编译器,protoc 版本 3。
- protocol 编译器的 Go 插件安装。
Protocol编译器
- 官方安装文档:https://grpc.io/docs/protoc-installation/。
- 选择你要的版本:https://github.com/google/protobuf/releases。
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip
- 在
$HOME/.local
或您选择的目录下解压缩该文件。例如:
$ unzip protoc-26.1-linux-x86_64.zip -d $HOME/.local
- 更新环境路径变量以包含可执行
protoc
的路径。例如:(添加环境变量)
# 临时生效
$ export PATH="$PATH:$HOME/.local/bin"
- 验证安装:
$ protoc --version
- protoc 帮助文档:
-IPATH, --proto_path=PATH
:表示的是我们要在哪个路径下搜索.proto
文件,这个参数既可以用-I
指定,也可以使用--proto_path=
指定。如果不指定该参数,则默认在当前路径下进行搜索;另外,该参数也可以指定多次,这也意味着我们可以指定多个路径进行搜索。- 下面的
--cpp_out
、--csharp_out
等,protoc支持的语言长达13种,且都是比较常见的,但是却没有Go。因此需要安装Google维护的第三方插件。
$ 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.
--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.
--pyi_out=OUT_DIR Generate python pyi stub.
--python_out=OUT_DIR Generate Python source file.
--ruby_out=OUT_DIR Generate Ruby source file.
Go 插件
- 官方安装文档:https://grpc.io/docs/languages/go/quickstart/。
- protocol 编译器的 Go 插件安装:使用以下命令安装Go的protocol编译器插件。
- 这两个插件可以用来生成Golang版本的proto协议代码和gRPC代理代码。
# 安装最新版本 protoc-gen-go@latest; protoc-gen-go 生成pb序列化相关文件。
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34
# 安装最新版本 protoc-gen-go-grpc@latest; protoc-gen-go-grpc 生成grpc相关文件。
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3
- 更新您的PATH,以便协议编译器可以找到插件:
# 临时生效
$ export PATH="$PATH:$(go env GOPATH)/bin"
- 验证:
$ protoc-gen-go --version
$ protoc-gen-go-grpc --version
protoc-gen-go 插件
- 非内置的语言支持就得自己单独安装语言插件,比如
--go_out=
对应的是protoc-gen-go
(生成pb序列化相关文件),安装命令如下:
# 最新版
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
# 指定版本
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34
- protoc-gen-go要求pb文件必须指定go包的路径,即
// 指定包路径
option go_package = "example.com/project/protos/fizz";
// 如果想指定包名称添加下面代码
// package server
// 也可写成这种形式,逗号后面即使包名称
// option go_package = "example.com/project/protos/fizz;server";
-
支持相关参数:
--go_out
:指定go代码生成的基本路径。该参数会生成 xxx.pb.go 文件,包含所有类型的序列化和反序列化代码。--go_opt
:设定插件参数,protoc-gen-go
提供了--go_opt
来为其指定参数,并可以设置多个。- 如果使用
paths=import
, 生成的文件会按go_package路径来生成,当然是在--go_out
目录下,即 $go_out/$go_package/pb_filename.pb.go。(默认) - 如果使用
paths=source_relative
,就在当前pb文件同路径下生成代码。注意pb的目录也被包含进去了。即 $go_out/$pb_filedir/$pb_filename.pb.go。 - 如果指定了
module=$PREFIX
标志,则输出文件将放在以Go包的导入路径命名的目录中(例如 .proto文件中的go_package选项提供的路径),但指定的目录前缀将从输出文件名中删除。
- 如果使用
-
可以使用如下命令生成代码:
$ protoc --proto_path=src --go_out=out --go_opt=paths=source_relative foo.proto bar/baz.proto
protoc-gen-go-grpc 插件
- 生成gRPC相关代码需要安装grpc-go相关的插件protoc-gen-go-grpc。
# 最新版本
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
# 指定版本
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3
- 支持相关参数:
--go-grpc_out
:指定grpc go代码生成的基本路径,该命令会生成 xxx_grpc.pb.go 文件,包含客户端/服务端调用的接口定义。--go-grpc_opt
:和protoc-gen-go类似。
环境变量
- 永久修改环境变量:
- 使用修改.bashrc文件进行环境变量的编辑,只对当前用户有用
- 使用修改/etc/profile文件进行环境变量的编辑,是对所有用户有用
$ vim /etc/profile
# 添加
export PATH="$PATH:$(go env GOPATH)/bin:$HOME/.local/bin"
# 刷新
$ source /etc/profile
安装核心库
$ go get google.golang.org/grpc
protoc 命令
- paths=import:示按照生成的Go代码的包的全路径去创建目录层级。
# -I . 指定当前目录下搜索 .proto 文件
# --go_out=./service 指定文件输出目录为 ./service
# --go_opt=paths=import 应该输出 $go_out/$go_package/hello.pb.go
$ protoc -I . --go_out=./service --go_opt=paths=import hello.proto
# 生成位置 $go_out/$go_package/hello_grpc.pb.go
$ protoc -I . --go-grpc_out=./service --go-grpc_opt=paths=import hello.proto
- paths=source_relative:表示按照 proto源文件的目录层级去创建Go代码的目录层级,如果目录已存在则不用创建。
$ protoc -I ./pb \
--go_out ./ecommerce --go_opt paths=source_relative \
--go-grpc_out ./ecommerce --go-grpc_opt paths=source_relative \
./pb/product.proto