易用的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控制台输入:
你希望把这个命令发送到服务器端去执行,把所有数字做一个加法,加完了后,把结果发回到控制台上显示出来。
在客户端,你几乎只需要写下面的两行代码就可以完成这个工作了!
(以上代码位于:https://github.com/galaxyeye/pioneer/blob/master/libs/examples/commander.h)
强烈建议你现在就下载源代码,自己编译运行,执行上面的函数。下一步,我将演示如何增加你自己的控制台命令,这大概只需要5~10行有效的C++代码,当然函数的内部实现不算在内。
下载代码并编译:
能不能以异步的方式调用远程方法而调用线程不阻塞?能不能广播调用远程方法?能不能自动将异常信息带到客户端来处理?
于是我写了一个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 ldconfigvincent@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。
相关文章推荐
- 易用的C++ RPC服务框架 - pioneer - 3 - 编写你自己的控制台命令
- 易用的C++ RPC服务框架 - pioneer - 4 - 技术实现:函数的序列化
- 易用的C++ RPC服务框架 - pioneer - 5 - 技术实现:函数的序列化
- 易用的C++ RPC服务框架 - pioneer - 1 - 设计目标和应用场景
- [C/C++] VC2012编译的程序在WinXP下报告“指定的可执行文件不是有效的 Win32 应用程序”错误
- emacs中完成c++程序编译执行
- 【AllJoyn框架-07】Linux平台下用eclipse c++ 编译AllJoyn程序
- 利用C++编写Windows服务程序的一般框架
- C/C++程序编译步骤 如何生成可执行文件
- RPC框架Thrift例子-PHP调用C++后端程序
- C/C++程序从编译到最终生成可执行文件的过程分析
- C/C++程序从编译到最终生成可执行文件的过程分析
- C/C++程序编译步骤以及如何生成可执行文件
- emacs中c++程序编译执行
- RPC框架Thrift例子-PHP调用C++后端程序
- C/C++——程序实现过程之编译、链接和执行
- C/C++程序从编译到最终生成可执行文件的过程分析
- C/C++程序从编译到最终生成可执行文件的过程分析
- C++的编译单元、可执行程序、内部连接与外部连接
- C/C++程序编译步骤 如何生成可执行文件