go-grpc的使用

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

8c951890.png

gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。

gRPC 默认使用 protocol buffers
虽然你可以使用 proto2 (当前默认的 protocol buffers 版本), 我们通常建议你在 gRPC 里使用 proto3,因为这样你可以使用 gRPC 支持全部范围的的语言,并且能避免 proto2 客户端与 proto3 服务端交互时出现的兼容性问题,反之亦然。

安装grpc

go get -u google.golang.org/grpc

目前为止这个命令不好用

golangProject go get -u google.golang.org/grpc
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

原因是什么,不确定。网上有一个说是包名没改,但是后面的 timeout 又是网络问题,所以不能使用go get的方式安装

git clone https://github.com/grpc/grpc-go.git src/google.golang.org/grpc
git clone https://github.com/golang/net.git src/golang.org/x/net
git clone https://github.com/golang/text.git src/golang.org/x/text

安装protocol buffer3
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
git clone https://github.com/google/go-genproto.git src/google.golang.org/genproto

cd $GOPATH/src/
go install google.golang.org/grpc

执行demo

在路径下面 $GOPATH/src/google.golang.org/grpc/examples/helloworld/helloworld

go run greeter_server/main.go
go run greeter_client/main.go

在客户端窗口会看到Greeting: Hello world输出。
说明gRPC的client-server可用了。

编译 .proto 文件

下载编译器
编译器
放在可执行路径里面,我放到了 GOPATH 的路径里,这里还有 include 目录,放到 $GOPATH/src/google.golang.org/protobuf

执行下面命令编译 .proto 文件

这个是pb的编译,只有数据类
protoc --go_out=. *.proto
下面是 grpc 插件的编译,会生成服务端客户端相关的代码
protoc --go_out=plugins=grpc:. rpc_api.proto

// 生成 cpp 和 golang 代码
protoc --cpp_out=. --go_out=plugins=grpc:. rpc_api.proto