gRPC配置与用法

gRPC的配置真的是蛋疼。主要原因是官方的推荐方式是从源码编译。于是我首先花了一个下午用小水管clone了下gRPC和它的十来个三方库。

protobuf

首先Ubuntu默认的protobuf是2.6.1,而Google给的helloworld示例需要protobuf 3才能编译,于是我们的protobuf也要从源码编译装一下。注意gRPC不会自动帮你make install protobuf,所以需要到third_party目录下找到protobuf的源码编译安装。其命令如下

1
git submodule update --init --recursive

进入protobuf目录

1
2
3
4
5
./autogen
make
make check
sudo make install
sudo ldconfig

注意./autogen里面会下载gmock,可能会失败,这里可以直接进去注释掉相关语句。

gRPC项目的编译

在编译gRPC项目时,对于客户端会生成.pb.h.pb.cc两个文件;但是服务端则需要.grpc.pb.h.grpc.pb.cc两个文件。这四个文件是由protoc通过不同的指令生成的,如下所示,这里grpc_out即表示生成服务端需要使用的带.grpc.pb系文件,plugin字段需要我们指明grpc_cpp_plugin这个插件所在的位置。如果我们从源码编译安装的话,这个插件一般会在/usr/local/lib里面,我们一般需要将这个路径export出来

1
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

当然也可以运行这个脚本来一劳永逸地解决问题。

Makefile

如果直接使用Makefile来编译,我们需要先按照下面的规则生成四个文件,此外我们还需要将程序链接到protobufgrpc++grpc这三个库上。gRPC的官方Git仓库中提供了Makefile的demo。

1
2
$ protoc -I ../../protos --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` ../../protos/route_guide.proto
$ protoc -I ../../protos --cpp_out=. ../../protos/route_guide.proto

CMake

gRPC的官方Git仓库也提供了CMakeLists的Demo,不过我并没有能够成功进行编译,它提示缺少gRPCConfig.cmake或grpc-config.cmake文件,于是我放弃了来自官方的CMakeLists。在我先前的protobuf试用中,我了解了cmake中的PROTOBUF_GENERATE_CPP宏可以编译出.pb.h.pb.cc两个文件,现在我们需要依葫芦画瓢搞出一个PROTOBUF_GENERATE_GRPC_CPP宏就行了。在爆栈网的一篇回答中我找到了一个实用的实现,借助于它我实现了自己的CMakeLists。注意目前gRPC的编译需要C++11标准的支持,所以这里我使用了SET(CMAKE_CXX_COMPILER /usr/bin/g++-7 CACHE PATH "" FORCE)来强制设置了编译器。

可以在https://github.com/CalvinNeo/ARPC/blob/master/test/grpc/中找到我的一个完整的配置

gRPC的坑

14 Connection Refused

Linux下的Connection Refused这是由于我们配置了http_proxy的缘故