码迷,mamicode.com
首页 > 编程语言 > 详细

智能 RPC框架 (C++)

时间:2015-01-07 14:31:02      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

RPC中文叫远程函数调用,它是一种通信方式,只是看起来像普通的函数调用。

它包括三个基本要素:

1:服务端注册相应的(服务)函数(用于调用方调用)

2:调用方通过函数调用的方式将一些信息和参数打包到消息,然后发送消息给被调用方。

3:被调用方收到消息后,提取信息和参数。调用相应函数。

 

被调用方不需要用户手动解析参数,而是由"包装代码"预先解析出来。

 

目前很多rpc框架都(设计)配有协议描述文件,通过代码生成,产生((含有)"包装代码")服务端的服务类或函数。

 

我不喜欢代码生成,我喜欢直接在代码中搞定它。

果然,我最近看到有朋友在一些脚本语言中做到这点。某些实现还不需要手动(预先)注册服务函数。

比如:

https://github.com/sniperHW/distri.lua/blob/master/examples/rpcserver.lua

https://github.com/akirayu101/GM_RPC/blob/master/gmrpc_lua/rpc_handlers/rpc_handler_sample.lua

https://github.com/akirayu101/GM_RPC/blob/master/gmrpc_py/rpc_handlers/rpc_handler_sample.py

 

然而我又不熟悉lua或python,所以我用C++11 来实现了它。

主要功能:

1:注册服务函数

void test5(string a, int b, map<int, map<int, string>> vlist) 
{ 
} 

rpc rpc_server; /*rpc服务器*/
rpc_server.def("test5", test5);

 

2:客户端调用远程函数

rpc rpc_client; /*rpc客户端*/
rpc_client.call("test5", "a", 1, mlist, [&upvalue](int a, int b){ 
    upvalue++; 
    cout << "upvalue:" << upvalue << ", a:" << a << ", b:" << b << endl; 
}); 

 

其中mlis是一个map<int,map<int,string>>类型变量。 rpc_client.call 的返回值是一个string,它表示此次call的消息。

我们可以把它(string 消息)通过网络发送给服务器。在这里(测试)我们直接通过下面的方式传递给服务端。

 

!!!注意!!!:call的最后一个参数可以是一个lambda,它表示处理此rpc返回值。 如果不是一个lambda,则它也是rpc调用参数。

 

3:服务端处理rpc request

rpc_server.handleRpc(rpc_request_msg);

 

其中 rpc_request_msg为接受到的网络消息(字符串)。

这样就会自动调用到我们的 test5 函数。 并且形参已经(自动)准备OK。你只需要在test5 里使用这些参数即可。(不用关心网络消息协议)。

 

4:被调用方可以返回数据给调用方

rpc_response_str = rpc_server.reply(1, 1, 2);   /* (1,1,2)中的1为调用方的req_id, (1,2)为返回值 */ 
rpc_client.handleResponse(rpc_response_str); 

 

上面代码通过 rpc_server.reply返回消息给客户端。 然后客户端模拟收到消息后通过 rpc_client.handleResponse(rpc_response_str)

会回调rpc_client.call() 时 所传递的lambda回调函数。

 

注意:以上 服务函数(譬如test5)和rpc 返回值处理函数(譬如那个lambda)的参数 是任意个数,且"任意"类型

(支持 int,string,JsonObject-json对象,vector<int>,vector<string>, map<int,string>,map<string,int>,map<string,string>, map<int/string, 前述所有类型/递归> )

 

代码放在了 https://github.com/IronsDu/accumulation-dev/blob/master/utils/rpc_test.cpp 。

欢迎讨论。

 

智能 RPC框架 (C++)

标签:

原文地址:http://www.cnblogs.com/irons/p/4208256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!