基于CentOS 搭建gRPC框架

1. 简介

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 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

  • 官方网站:http://www.grpc.io/
  • 中文网站:http://doc.oschina.net/grpc

2. 概念

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

图1

3. 数据类型

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

Protocol Buffers的优势如下:

  • 轻量级:以高效的二进制方式存储,序列化后体积相比 Json 和 XML 很小,适合网络传输;
  • 简单:Protobuf 语义更清晰,无需类似 XML 解析器的东西;
  • 快:序列化反序列化速度很快,快于 Json 的处理速度;
  • 兼容性:支持跨平台多语言,消息格式升级和“向后” 兼容性好;

5. 服务定义

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;
}

6.DEMO搭建

下面,以CentOS为例,搭建gRPC框架demo。

6.1. 安装相关工具

yum install -y gcc-c++ autoconf libtool
yum groupinstall -y "Development Tools"

6.2. 下载源码

git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init # 下载依赖的第三方库

6.3. 编译ProtoBuf

[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

6.4. 安装gRPC

[root@localhost protobuf]# cd ../..
[root@localhost grpc]# make
[root@localhost grpc]# make install

6.5. 配置环境变量

在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

6.6. 编译运行

[root@localhost grpc]# source actviate.sh
[root@localhost grpc]# cd examples/cpp/helloworld/
[root@localhost helloworld]# make

6.7. 运行服务端

服务端监听的是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

6.8. 运行客户端

[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

7. 总结

gRPC是一个高性能的RPC框架,支持不同平台、不同应用间进行互相访问。

你可能感兴趣的:(C++,Linux,gRPC,c++)