易用的C++ RPC服务框架 - pioneer - 3 - 编写你自己的控制台命令
2013-08-13 03:04
344 查看
在过去的两年时间里,我一直在用C++11写分布式数据库。在分布式系统中,远程方法调用是一个大麻烦。能不能像本地方法一样调用远程方法?
能不能以异步的方式调用远程方法而调用线程不阻塞?能不能广播调用远程方法?能不能自动将异常信息带到客户端来处理?
于是我写了一个RPC框架pioneer,支持以下特性:
1.针对集群来设计
2.和本地函数几乎一样的调用方法
3.没有IDL
4.支持同步调用和异步调用
5.支持有返回值/无返回值,对无返回值的调用进行优化
6.支持一对一、一对多、多播、广播、可靠广播调用
7.支持异常处理
8.不考虑跨语言
在上一篇文章中,我介绍了pioneer自带的控制台程序。实现一个控制台程序是演示RPC调用最好的方法之一。
Pioneer中已经实现了几个简单的远程函数,来演示几种不同场景下的RPC调用。
在pioneer中新加入一个远程函数需要几个步骤?譬如说我要新增加一个函数,在服务器上将一个数字序列排序,将结果返回给调用端。
函数原型如下:
所有工作只需要简单的三步:
第一步:打开pioneer/libs/examples/service/rfc_func.h,在rfc_func中增加函数声明。(一行有效代码)
调用ATLAS_REGISTER_REMOTE_FUNC注册新增加的函数。(一行有效代码)
第二步:打开pioneer/libs/examples/service/rfc_func.h,实现新增加的函数。(除函数实现外,一行有效代码)
在rpc_dispatcher中增加5行代码(三行有效代码):
第三步:客户端调用(三行有效代码)
几乎像本地方法一样调用!
以上是在pioneer中增加一个远程调用的通用步骤。如果要在控制台上使用sort方法,你还需要修改两个地方:
1. 在pioneer/libs/examples/commander.h中,commander的构造函数中,修改_descs,使得控制台能够正确识别你的命令
2. 把上述第三步中的代码中间那行删除掉,然后加到commander::dispatch中
这样你完成了一个远程控制台命令。果断分分钟搞定。
能不能以异步的方式调用远程方法而调用线程不阻塞?能不能广播调用远程方法?能不能自动将异常信息带到客户端来处理?
于是我写了一个RPC框架pioneer,支持以下特性:
1.针对集群来设计
2.和本地函数几乎一样的调用方法
3.没有IDL
4.支持同步调用和异步调用
5.支持有返回值/无返回值,对无返回值的调用进行优化
6.支持一对一、一对多、多播、广播、可靠广播调用
7.支持异常处理
8.不考虑跨语言
在上一篇文章中,我介绍了pioneer自带的控制台程序。实现一个控制台程序是演示RPC调用最好的方法之一。
Pioneer中已经实现了几个简单的远程函数,来演示几种不同场景下的RPC调用。
在pioneer中新加入一个远程函数需要几个步骤?譬如说我要新增加一个函数,在服务器上将一个数字序列排序,将结果返回给调用端。
函数原型如下:
rfc_result sort(const vector<int>&, rfc_context);
所有工作只需要简单的三步:
第一步:打开pioneer/libs/examples/service/rfc_func.h,在rfc_func中增加函数声明。(一行有效代码)
调用ATLAS_REGISTER_REMOTE_FUNC注册新增加的函数。(一行有效代码)
第二步:打开pioneer/libs/examples/service/rfc_func.h,实现新增加的函数。(除函数实现外,一行有效代码)
在rpc_dispatcher中增加5行代码(三行有效代码):
case fn_ids::sort: { rf_wrapper<decltype(rpc_func::sort)> sort(rpc_func::sort, ia, context); return sort(); } break;这是很机械化的动作,所以在代码尺寸上应该还有优化余地。后话不提。
第三步:客户端调用(三行有效代码)
atlas::rpc::rpc_callback_type cb(print_result); // 回调函数另外实现 p2p_client client(client_type::any_client, 127.0.0.1); client.call(rpc_func::sort, fn_ids::sort, cb, a_vector_of_numbers, nilctx);
几乎像本地方法一样调用!
以上是在pioneer中增加一个远程调用的通用步骤。如果要在控制台上使用sort方法,你还需要修改两个地方:
1. 在pioneer/libs/examples/commander.h中,commander的构造函数中,修改_descs,使得控制台能够正确识别你的命令
2. 把上述第三步中的代码中间那行删除掉,然后加到commander::dispatch中
这样你完成了一个远程控制台命令。果断分分钟搞定。
相关文章推荐
- 易用的C++ RPC服务框架 - pioneer - 2 - 编译和执行演示程序
- 易用的C++ RPC服务框架 - pioneer - 4 - 技术实现:函数的序列化
- 易用的C++ RPC服务框架 - pioneer - 5 - 技术实现:函数的序列化
- 易用的C++ RPC服务框架 - pioneer - 1 - 设计目标和应用场景
- Java利用Sping框架编写RPC远程过程调用服务的教程
- 利用C++编写Windows服务程序的一般框架
- VS2017+SQLite3编写C++控制台程序打包
- Windows 控制台命令 编写简单的bat文件(从控制台获取输入的变量)
- yii框架通过控制台命令创建定时任务
- golang(4):编写socket服务,简单支持命令
- GRPC 1.3.4 发布,Google 高性能 RPC 框架(Java C++ Go)
- 编写你自己的单点登录(SSO)服务
- C/C++编写服务程序
- 编写你自己的单点登录(SSO)服务
- 轻松编写 C++ 单元测试 介绍全新单元测试框架组合: googletest 与 googlemock
- RPC框架Thrift例子-PHP调用C++后端程序
- 一起写RPC框架(八)RPC服务提供端开篇--人生若只如初见
- 编写你自己的单点登录(SSO)服务
- 唯品会RPC服务框架与容器化演进(转)
- Windows下用C++编写服务程序