RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。
gRPC(google RPC)是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
Protocol Buffers的优势如下:
gRPC利用Protocol Buffers定义服务方法,通过参数和返回类型来指定可以远程调用的方法。客户端和服务端均使用服务定义生成的接口代码。
例如,Greeter
服务有一个方法 SayHello
,可以让服务端从远程客户端接收一个包含用户名的 HelloRequest
消息后,在一个 HelloReply
里发送回一个 Greeter
。
syntax = "proto3";
option java_package = "io.grpc.examples";
package helloworld;
// The greeter service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
下面,以CentOS为例,搭建gRPC框架demo。
yum install -y gcc-c++ autoconf libtool
yum groupinstall -y "Development Tools"
git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init # 下载依赖的第三方库
[root@localhost grpc]# cd third_party/protobuf/
[root@localhost protobuf]# ./autogen
[root@localhost protobuf]# ./configure
[root@localhost protobuf]# make
[root@localhost protobuf]# make install
[root@localhost protobuf]# ldconfig # refresh shared library cache.
[root@localhost protobuf]# which protoc
[root@localhost protobuf]# protoc --version
[root@localhost protobuf]# cd ../..
[root@localhost grpc]# make
[root@localhost grpc]# make install
在grpc根目录下新建actviate.sh,内容如下:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export PATH=$PATH:$DIR/bins/opt:$DIR/bins/opt/protobuf
export CPATH=$DIR/include:$DIR/third_party/protobuf/src
export LIBRARY_PATH=$DIR/libs/opt:$DIR/libs/opt/protobuf
export PKG_CONFIG_PATH=$DIR/libs/opt/pkgconfig:$DIR/third_party/protobuf
export LD_LIBRARY_PATH=$DIR/libs/opt
[root@localhost grpc]# source actviate.sh
[root@localhost grpc]# cd examples/cpp/helloworld/
[root@localhost helloworld]# make
服务端监听的是50051端口
[root@localhost helloworld]# ./greeter_server
I0719 09:09:11.798702503 5076 ev_epoll_linux.c:85] epoll engine will be using signal: 36
D0719 09:09:11.798857929 5076 ev_posix.c:106] Using polling engine: epoll
Server listening on 0.0.0.0:50051
[root@localhost helloworld]# ./greeter_client
I0719 09:10:04.431843293 5142 ev_epoll_linux.c:85] epoll engine will be using signal: 36
D0719 09:10:04.432006262 5142 ev_posix.c:106] Using polling engine: epoll
Greeter received: Hello world
gRPC是一个高性能的RPC框架,支持不同平台、不同应用间进行互相访问。