文章来源:点击打开链接
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 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
- 官方网站:www.grpc.io/
- 官方文档:www.grpc.io/docs/
- 中文翻译:doc.oschina.net/grpc
doc.oschina.net/grpc -- 【推荐】
测试环境:
系统是新安装的CentOS 7.2
Shell
| 12 | [root@localhost ~]# cat /etc/redhat-releaseCentOS Linux release 7.2.1511 (Core) |
|---|
一、YUM安装相关工具
Shell
| 12 | yum install -y gcc-c++ autoconf libtoolyum groupinstall -y "Development Tools" |
|---|
二、下载gRPC源码和相关子模块
这步可能出现失败或者网速慢的情况(原因你懂的),多执行几次直到完全下载完毕为止。
Shell
| 123 | git clone github.com/grpc/grpc.g… grpcgit submodule update --init |
|---|
firecat注:执行以上三个命令,会自动下载源码,也包含第三方third_party文件夹的全部源码。
也就是说,我们不需要手动去官网https://github.com/grpc/grpc下载源码。因为有第三方库不好操作,不好安装,搞错了会很麻烦。
三、编译安装protobuf
这个步骤有个地方要下载googlecode的里面的代码,国内正常来说是下载不下来的(除非有梯子),所以要换个下载地址:
Shell
| 12 | [root@localhost grpc]# cd third_party/protobuf/[root@localhost protobuf]# vim autogen.sh |
|---|
找到这行:
Shell
| 1 | curl $curlopts -O googlemock.googlecode.com/files/gmock… |
|---|
修改为:
Shell
| 1 | curl $curlopts -L -o gmock-1.7.0.zip github.com/peter-wangx… |
|---|
然后编译安装即可:
Shell
| 123456789 | [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/usr/local/bin/protoc[root@localhost protobuf]# protoc --versionlibprotoc 3.0.0 |
|---|
firecat注:我的实践结果是不需要自行编译和安装protobuf这个步骤,因为第二步的三个命令已经实现下载了protobuf的源码。
四、编译安装gRPC
| 123 | [root@localhost protobuf]# cd ../..[root@localhost grpc]# make[root@localhost grpc]# make install |
|---|
执行make install的时候,我这里有错误提示:
| 123456789101112131415 | Warning: it looks like protoc 3.0.0+ isn't installed on your system,which means that you won't be able to compile .proto files for usewith gRPC. If you are just using pre-compiled protocol buffers, or you otherwisehave no need to compile .proto files, you can ignore this. If you do need protobuf for some reason, you can download and installit from: github.com/google/prot… you've done so, you can re-run this check by doing: make verify-install |
|---|
明明是有安装protoc的,但是没检测到,网上找了资料说这个问题好像是不影响的。
firecat注:这个步骤顺利通过,没有出现错误提示。
五、Demo测试
官方自带有个HelloWorld的Demo,可以编译这个Demo看是否我们已经安装成功了。
| 12 | [root@localhost grpc]# cd examples/cpp/helloworld/[root@localhost helloworld]# make |
|---|
结果报错了:
firecat注,我的也出现了这个错误。
| 1234567 | Package grpc++ was not found in the pkg-config search path.Perhaps you should add the directory containing `grpc++.pc'to the PKG_CONFIG_PATH environment variableNo package 'grpc++' foundPackage grpc was not found in the pkg-config search path.Perhaps you should add the directory containing `grpc.pc'to the PKG_CONFIG_PATH environment variable |
|---|
意思是找不到环境变量PKG_CONFIG_PATH,解决方法是把环境变量加上去:
在gRPC目录下新建和保存脚本文件actviate.sh:
| 123456 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"export PATH=$PATH:$DIR/bins/opt:$DIR/bins/opt/protobufexport CPATH=$DIR/include:$DIR/third_party/protobuf/srcexport LIBRARY_PATH=$DIR/libs/opt:$DIR/libs/opt/protobufexport PKG_CONFIG_PATH=$DIR/libs/opt/pkgconfig:$DIR/third_party/protobufexport LD_LIBRARY_PATH=$DIR/libs/opt |
|---|
然后执行:(firecat注:要在同个终端,先执行脚本后执行编译)
Shell
| 123 | [root@localhost grpc]# source actviate.sh[root@localhost grpc]# cd examples/cpp/helloworld/[root@localhost helloworld]# make |
|---|
编译成功。(注意,每次新开终端编译或运行程序,都要执行actviate.sh,除非把环境变量设成永久有效)
然后运行服务端,监听的是50051端口:
Shell
| 1234 | [root@localhost helloworld]# ./greeter_serverI0719 09:09:11.798702503 5076 ev_epoll_linux.c:85] epoll engine will be using signal: 36D0719 09:09:11.798857929 5076 ev_posix.c:106] Using polling engine: epollServer listening on 0.0.0.0:50051 |
|---|
在另外一个终端执行客户端程序:
| 1234 | [root@localhost helloworld]# ./greeter_clientI0719 09:10:04.431843293 5142 ev_epoll_linux.c:85] epoll engine will be using signal: 36D0719 09:10:04.432006262 5142 ev_posix.c:106] Using polling engine: epollGreeter received: Hello world |
|---|
成功!
解决问题参考链接:
《Protobuf 在Ubuntu 14.04上的编译与使用》
《using grpc C++ without installing it》