您的位置:首页 > 编程语言 > C语言/C++

易用的C++ RPC服务框架 - pioneer - 2 - 编译和执行演示程序

2013-08-13 02:05 330 查看
在过去的两年时间里,我一直在用C++11写分布式数据库。在分布式系统中,远程方法调用是一个大麻烦。能不能像本地方法一样调用远程方法?

能不能以异步的方式调用远程方法而调用线程不阻塞?能不能广播调用远程方法?能不能自动将异常信息带到客户端来处理?

于是我写了一个RPC框架pioneer,支持以下特性:

1.针对集群来设计

2.和本地函数几乎一样的调用方法

3.没有IDL

4.支持同步调用和异步调用

5.支持有返回值/无返回值,对无返回值的调用进行优化

6.支持一对一、一对多、多播、广播、可靠广播调用

7.支持异常处理

8.不考虑跨语言

上一篇文章中,我提出了几个常见的远程方法调用的场景,以及使用pioneer框架,代码的大致样子。

很明显,这比MongoDB中手动构造消息简单优雅得多,当然pioneer带来的好处不单单是简单优雅。

Pioneer是一个完整的网络服务器集群框架,带有完整的服务器和控制台程序,可以演示如何从控制台程序里发出指令,来远程调用服务器端的函数。

简单翻阅一下源代码,你就可以看到,实现一个console命令,是再简单不过的事情了。

譬如你在pioneer控制台输入:

pioneer> accumulate --numbers 1,2,3,3,5,6,1093,2930


你希望把这个命令发送到服务器端去执行,把所有数字做一个加法,加完了后,把结果发回到控制台上显示出来。

在客户端,你几乎只需要写下面的两行代码就可以完成这个工作了!

atlas::rpc::rpc_callback_type cb(print_result); // print_result回调函数另外实现,用于RPC有结果返回时调用
call(rpc_func::accumulate, fn_ids::accumulate, cb, tokenize<int>(vm["numbers"].as<std::string>()), nilctx);


(以上代码位于:https://github.com/galaxyeye/pioneer/blob/master/libs/examples/commander.h

强烈建议你现在就下载源代码,自己编译运行,执行上面的函数。下一步,我将演示如何增加你自己的控制台命令,这大概只需要5~10行有效的C++代码,当然函数的内部实现不算在内。

下载代码并编译:

vincent@galaxyeye:~$ git clone https://github.com/galaxyeye/pioneer.git[/code] 
把pioneer/third/lib下的几个库文件拷贝到/usr/local/lib下,然后执行

vincent@galaxyeye:~$ sudo ldconfig
vincent@galaxyeye:~/pioneer$ ./build
执行结果,会生成一个server和一个client,分别直接执行就可以了。

可能出现的问题:

1. 你没有安装boost库

2. 你没有安装bjam工具
3. 你的gcc的版本不是4.7,如果是4.6或者4.8,修改Jamroot文件using gcc部分,不支持其他版本

4. muduo不能正确链接,你需要从源代码重新编译muduo,并把相应的库文件拷贝到/usr/local/lib下,执行ldconfig

enjoy :)

----------------------------------------------------

你可以在github上获得源代码:https://github.com/galaxyeye/pioneer。

我原始的目标是建立内部使用的分布式数据库,所以我并不打算支持跨平台、跨语言等特性,只支持linux下的C++11,目前只在gcc 4.6, gcc 4.7下测试过。

由于历史原因,网络库使用的是陈硕同学的muduo,有改动,改动过的代码:https://github.com/galaxyeye/muduo。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: