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

本文介绍了一种名为Pioneer的RPC框架,它简化了分布式系统中远程方法的调用过程,支持多种调用方式和异常处理。通过实例展示了如何轻松添加远程函数并实现其调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在过去的两年时间里,我一直在用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中


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





介绍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、付费专栏及课程。

余额充值