gRPC是一个高性能、通用的开源RPC框架,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言,目前提供C、Java和Go语言版本,分别是grpc、grpc-java、grpc-go。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。gRPC基于HTTP/2标准设计,带来诸如双向流、流控、头部压缩、单TCP连接上的多复用请求等特性,使得gRPC在移动设备上表现更好、更省电和节省空间占用。
gRPC优点如下:
(1)平台无关,语言无关,可扩展;
(2)提供了友好的动态库,使用简单;
(3)解析速度快,比对应的XML快约20-100倍;
(4)序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。
官方推荐安装命令:
<code>go get google.golang.org/grpc</code>
国内网络环境由于GFW原因,不能直接访问google服务器,报错如下:
<code>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)</code>
因此,在国内网络环境下推荐直接从GitHub下载相应依赖进行安装。
安装gRPC:
<code>go install google.golang.org/grpc</code>
gRPC使用流程如下:
(1)编写.proto描述文件。
(2)编译生成.pb.go文件。
(3)服务端实现约定的接口并提供服务。
(4)客户端按照约定调用方法请求服务。
一个RPC service是一个能够通过参数和返回值进行远程调用的方法。由于gRPC通过将数据编码成Protocal Buffer来实现传输,因此,使用者可以通过Protocal Buffers interface definitioin language(IDL)来定义service method,同时将参数和返回值也定义成Protocal Buffer message类型。gRPC源码目录提供了多个使用示例,本文使用helloworld示例作为模板,helloworld示例目录位于<code>google.golang.org/grpc/examples/helloworld</code>。
在$GOPATH/src目录下创建helloworld目录,包含proto、server、client子目录。proto目录下创建helloworld.proto文件。
helloworld.proto:
helloworld.proto文件中定义了一个Greeter Service,服务包含一个SayHello方法,同时声明了HelloRequest和HelloReply消息结构用于请求和响应。客户端使用HelloRequest参数调用SayHello方法请求服务端,服务端响应HelloReply消息。
根据定义的RPC service,利用protocal buffer compiler,即protoc生成相应的服务器端和客户端的Go代码,生成的代码中包含了客户端能够进行RPC的方法以及服务器端需要进行实现的接口。
在$GOPATH/src/helloworld/proto目录下生成gRPC对应的Go代码的命令如下:
<code>protoc --go_out=plugins=grpc:. helloworld.proto</code>
将在目录下生成helloworld.pb.go文件,内容如下:
生成文件包含服务端接口GreeterServer描述,客户端greeterClient接口及实现,以及HelloRequest、HelloResponse结构体。
在server子目录下创建server.go文件:
服务端引入编译后的proto包,实现约定的SayHello接口方法,接口描述可以查看helloworld.pb.go文件中的GreeterServer接口描述。实例化grpc Server并注册GreeterService,开始提供服务。
客户端使用gRPC访问服务端:
客户端初始化连接后直接调用声明的方法,即可向服务端发起请求。
在server目录下启动Server:
<code>go run main.go</code>
在client目录下启动客户端:
客户端接收到服务端的响应:
<code>2018/12/17 20:03:44 Greeting: Hello world</code>