- 一、GRPC简介
RPC的中文翻译是远程过程调用,是在服务器端程序设计常用的一种技术。对于本地过程调用,要做某件事,就在本机上执行某个代码段;对于RPC来说,服务的使用者和提供者可以位于不同的计算机上,客户端(client)只需要告诉服务器端(server)要做什么事情,这一请求通过网络发送给server,server上执行完成之后把结果返回给客户端。
Google 2015开源了一个RPC框架GRPC。
GRPC 是一个高性能、开源和通用的 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采用了protocol buffer来做数据的序列化与反序列化。Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。现阶段支持C++、JAVA、Python等三种编程语言。
对于开发者而言:
1、需要使用protobuf定义接口,即.proto文件。
2、使用compile工具生成特定语言的执行代码,比如JAVA、C/C++、Python等。类似于thrift,为了解决跨语言问题。
3、启动一个Server端,server端通过侦听指定的port,来等待Client链接请求,通常使用Netty来构建,GRPC内置了Netty的支持
4、启动一个或者多个Client端,Client也是基于Netty,Client通过与Server建立TCP长链接,并发送请求;Request与Response 均被封装成HTTP2的stream Frame,通过Netty Channel进行交互。
-
二、安装依赖
1、安装 pkg-config
sudo apt-get install pkg-config
2、安装依赖(autoconf、automake、libtool、make、g++、unzip、libgflags-dev、libgtest-dev、clang、libc++-dev)
sudo apt-get install autoconf automake libtool make g++ unzip
sudo apt-get install libgflags-dev libgtest-dev
sudo apt-get install clang libc++-dev
3、下载GRPC
git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init //更新第三方源码
4、安装protobuf
cd third_party/protobuf/
git submodule update --init --recursive //确保克隆子模块,更新第三方源码
./autogen.sh //生成配置脚本
./configure //生成Makefile文件,为下一步的编译做准备,可以加上安装路径:--prefix=path
make //从Makefile读取指令,然后编译
make check //可能会报错,但是不影响
sudo make install //从Makefile读取指令,安装到指定位置,默认为/usr/local/,也可以指定安装目
//录:--prefix=path。卸载的命令为make uninstall。make clean:清除编译
//产生的可执行文件及目标文件(object file,*.o)。make distclean:除了清
//除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。//
sudo ldconfig // 更新共享库缓存
which protoc // 查看软件的安装位置
protoc --version //检查是否安装成功
5、安装GRPC
cd ../..
make //从Makefile读取指令,然后编译
sudo make install //从Makefile读取指令,安装到指定位置,默认为/usr/local/,这里可以加
//上安装路径:prefix=/usr/local/
6、测试用例
cd examples/cpp/helloworld/
make //编译
./greeter_server //服务器
./greeter_client //客户端(重新开一个服务器连接)