主要基于官网介绍的文档总结而来。
需要先了解 protocol buffers
为什么使用gRPC
通过gPRC,我们可以仅仅定义一次service 到.proto文件中,然后使用gRPC支持的任何开发语言开发客户端或服务器。
样例代码和环境的建立
首先要确保golang开发环境的正确配置,go1.5+。
$ go get -u -v google.golang.org/grpc
本人在测试中遇到报错,主要原因在于样例需要
"golang.org/x/net"
"golang.org/x/text"
的支持,本人的解决方法如下
到
$GOPATH/src/golang.org/x/
目录下,如果golang.org/x/ 不存在则手动创建一个。
然后
git clone https://github.com/golang/net.git
git clone https://github.com/golang/text.git
样例测试
$ cd $GOPATH/src/google.golang.org/grpc/examples/route_guide
$ go run server/server.go
$ go run client/client.go
下面对样例的代码进行分析
服务定义
gRPC使用 protocol buffers定义服务。
要定义服务,需要在.proto文件中做service定义如下:
service RouteGuide {
...
}
然后可以在servie中定义rpc方法,指定对应的request和response类型。gPRC允许开发者定义4种service方法,这4种方法在样例RouteGuide 中都有用到。
- 最简单的RPC方法,客户端通过调用该方法发送request到服务端,等待服务器的response,类似正常的函数调用。
// Obtains the feature at a given position.
rpc GetFeature(Point) returns (Feature) {}
- 服务端单边stream的RPC( server-side streaming RPC):客户端调用该方法到服务端,服务器返回一个stream,客户端从这个stream中读取数据直到没有数据可读。从样例代码中可以看到该方法的主要特点是在response类型前加stream。
// Obtains the Features available within the given Rectangle. Results are
// streamed rather than returned at once (e.g. in a response message with a
// repeated field), as the rectangle may cover a large area and contain a
// huge number of features.
rpc ListF