易用的C++ RPC服务框架 - pioneer - 3 - 编写你自己的控制台命令

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

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


于是我写了一个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中


这样你完成了一个远程控制台命令。果断分分钟搞定。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
介绍RCP的实现原理 目录 1. 前言 2 2. 基本概念 3 2.1. IDL 3 2.2. 代理(Proxy) 3 2.3. 存根(Stub) 4 3. 三要素 4 3.1. 网络通讯 4 3.2. 消息编解码 5 3.3. IDL编译器 5 4. flex和bison 5 4.1. 准备概念 5 4.1.1. 正则表达式(regex/regexp) 6 4.1.2. 符号∈ 6 4.1.3. 终结符/非终结符/产生式 6 4.1.4. 记号(Token) 6 4.1.5. 形式文法 7 4.1.6. 上下文无关文法(CFG) 7 4.1.7. BNF 8 4.1.8. 推导 8 4.1.9. 语法树 8 4.1.10. LL(k) 9 4.1.11. LR(k) 9 4.1.12. LALR(k) 9 4.1.13. GLR 9 4.1.14. 移进/归约 9 4.2. flex和bison文件格式 9 4.2.1. 定义部分 10 4.2.2. 规则部分 10 4.2.3. 用户子例程部分 10 4.3. flex基础 10 4.3.1. flex文件格式 11 4.3.2. 选项 11 4.3.3. 名字定义 11 4.3.4. 词法规则 12 4.3.5. 匹配规则 12 4.3.6. %option 13 4.3.7. 全局变量yytext 13 4.3.8. 全局变量yyval 13 4.3.9. 全局变量yyleng 13 4.3.10. 全局函数yylex 13 4.3.11. 全局函数yywrap 13 4.4. bison基础 14 4.4.1. bison文件格式 14 4.4.2. %union 14 4.4.3. %token 15 4.4.4. 全局函数yyerror() 15 4.4.5. 全局函数yyparse() 15 4.5. 例1:单词计数 15 4.5.1. 目的 15 4.5.2. flex词法文件wc.l 16 4.5.3. Makefile 16 4.6. 例2:表达式 17 4.6.1. 目的 17 4.6.2. flex词法exp.l 17 4.6.3. bison语法exp.y 17 4.6.4. Makefile 19 4.6.5. 代码集成 19 4.7. 例3:函数 20 4.7.1. 目的 20 4.7.2. func.h 20 4.7.3. func.c 21 4.7.4. IDL代码func.idl 22 4.7.5. flex词法func.l 22 4.7.6. bison语法func.y 24 4.7.7. Makefile 27 5. 进阶 27 5.1. 客户端函数实现 27 5.2. 服务端函数实现 28 5.2.1. Stub部分实现 28 5.2.2. 用户部分实现 29 6. 参考资料 29

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值