gRPC 介绍
gRPC 是谷歌开源的高性能 RPC 框架。RPC 也即远程方法调用,对于 RPC client 来说,它可以调用远程 server 上的某个方法,看起来就像是在调用本地方法一样。区别就在于,通过 RPC 调用远程方法时,数据经过序列化之后会通过网络发送给远程 server,远程 server 执行方法之后,同样会将返回结果序列化之后发送回 client。在分布式系统中,gRPC 可以用来解耦程序的逻辑,不同组件之间通过 gRPC 进行通信。
gRPC 使用 Protobuf 作为它的数据序列化的工具,Protobuf 会将数据序列化成二进制的数据流。与 JSON 这类文本形式的数据相比,二进制数据显得更加紧凑和便于解析,在网络传输中,二进制数据由于体积更小,传输也更快。另一方面,gRPC 也是跨多种编程语言的,譬如说,一个 Java 的 client 可以与一个 C++ 的 server 通信。
在 Linux 安装 gRPC
在 Ubuntu 16.04 中,通过下面的步骤就可以安装好 gRPC 和 Protobuf。
构建服务端程序
在创建 gRPC 服务(service)之前,首先需要提供这个服务的接口。Protobuf 除了作为数据序列化工具之外,还可以用来为服务定义接口。例如,下面我们为 Company 服务定义接口:
我们为 Company 服务定义了两个方法,AddEmployee()
用于提交员工信息,而ListEmployees()
则用于根据年龄查询员工信息。注意到ListEmployees()
方法的返回值类型是stream Employee
,这表示这个方法会返回多个Employee
消息。
执行下面的命令可以自动生成 ProtoBuf 编解码的代码,以及与 Company 服务相关的代码:
在company.grpc.ph.h
文件里面,已经定义好了Company::Service
这个抽象基类,我们可以继承这个基类,并提供方法的具体实现。下面我们创建一个company_server.cc
文件,并定义CompanyImpl
这个具体类,同时提供方法的具体实现。值得注意的是,我们需要保证CompanyImpl
提供的方法都是线程安全的,因为这些方法允许被多个 client 同时调用。
构建客户端程序
client 的代码相对简单很多,为了让 client 可以调用 server 提供的方法,首先需要创建一个 stub:
client 通过这个 stub 就可以直接调用 server 提供的方法了。下面我们创建一个company_client.cc
文件,用来对 server 进行测试:
编译好 server 和 client 程序之后就可以运行了: