• 官网地址:https://grpc.io/
  • 前置条件:
    • 安装 Go 软件。
    • 安装 Protocol buffer 编译器,protoc 版本 3。
    • protocol 编译器的 Go 插件安装。

Protocol编译器

  1. 官方安装文档:https://grpc.io/docs/protoc-installation/
  2. 选择你要的版本:https://github.com/google/protobuf/releases
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip
  1. $HOME/.local或您选择的目录下解压缩该文件。例如:
$ unzip protoc-26.1-linux-x86_64.zip -d $HOME/.local
  1. 更新环境路径变量以包含可执行protoc的路径。例如:(添加环境变量)
# 临时生效
$ export PATH="$PATH:$HOME/.local/bin"
  1. 验证安装:
$ protoc --version
  1. 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 插件

  1. 官方安装文档:https://grpc.io/docs/languages/go/quickstart/
  2. protocol 编译器的 Go 插件安装:使用以下命令安装Go的protocol编译器插件。
  3. 这两个插件可以用来生成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
  1. 更新您的PATH,以便协议编译器可以找到插件:
# 临时生效
$ export PATH="$PATH:$(go env GOPATH)/bin"
  1. 验证:
$ protoc-gen-go --version

$ protoc-gen-go-grpc --version

protoc-gen-go 插件

  1. 非内置的语言支持就得自己单独安装语言插件,比如--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
  1. protoc-gen-go要求pb文件必须指定go包的路径,即
// 指定包路径
option go_package = "example.com/project/protos/fizz";

// 如果想指定包名称添加下面代码
// package server

// 也可写成这种形式,逗号后面即使包名称
// option go_package = "example.com/project/protos/fizz;server";
  1. 支持相关参数:

    • --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选项提供的路径),但指定的目录前缀将从输出文件名中删除。
  2. 可以使用如下命令生成代码:

$ protoc --proto_path=src --go_out=out --go_opt=paths=source_relative foo.proto bar/baz.proto

protoc-gen-go-grpc 插件

  1. 生成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
  1. 支持相关参数:
    • --go-grpc_out:指定grpc go代码生成的基本路径,该命令会生成 xxx_grpc.pb.go 文件,包含客户端/服务端调用的接口定义。
    • --go-grpc_opt:和protoc-gen-go类似。

环境变量

  1. 永久修改环境变量:
    • 使用修改.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 命令

  1. 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
  1. 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