0
点赞
收藏
分享

微信扫一扫

rest_rpc:易用的c++的rpc框架,实现网络信息通信

小北的爹 2022-05-26 阅读 81

背景:

rpc框架就如同一个会话层,在不用rpc框架的时候,如果实现两个程序互相通信,则最简单的例子如下:

  1. A对B提出一个命令,这句命令内容是“请回答 1+2 的结果”。
  2. 而与此同时,B听到A开始说话了,等到A停顿了较长时间,2秒或者3秒,确认A的命令说完了,然后计算1+2=3,告诉A刚才的问题结果为3。


一般网络使用tcp连接的较多,tcp是流,应用程序需要自己处理报文结束问题。所以,一个基于tcp的通信,至少要完成三个工作:

  1. 信息报文的完整交互,即B需要判断A的一句话是否说完,A可能连续说了几句话,B需要负责把每句命令都处理掉,做出对应的处理工作。
  2. A一次性说了几句命令,B听到后需要对应回答,不能回答对不上命令。
  3. A在收到B的回复时,也要同样处理回答是否完整,如果有多个回答,要处理每个回答与自己的每个提问之间对应关系。


如果使用rpc的话,就不用关心以上这些细节,只需要关心,A需要调用B的哪个方法,传入参数,然后设置一个回调函数用于收到B返回的值时做相应处理即可。


rest_rpc

grpc是一个工业界用的比较多的跨平台rpc,但是用起来不方便,每次都要定义一个中间语言负责转换数据。

如果需求较为简单,只是在c++程序之间进行rpc,则不需要这么重量级的grpc,我觉得rest_rpc就可以满足要求。后续我也考虑把现有系统的自主开发的简易rpc替换为rest_rpc。


推荐理由1:依赖少

rest_rpc最新版,以头文件形式直接包含使用,需要包含rest_rpc的头文件,以及其thirdparty下的asio和msgpack两个头文件库,从而减少使用者的动态库依赖工作。头文件依赖是非常简单易用的,虽然有其弊端,但是在很多时候,益处就是简单直接无需手动编译动态库。


推荐理由2:简单易用

比如,B作为服务提供方,A作为客户端,这种C/S架构模式的应用系统。B提供了Sum方法给A调用,则B只要建立一个监听端口服务,然后注册对应方法的名字以及方法函数,示例代码如下。

#include 
#include
using namespace rest_rpc;
using namespace rpc_service;
using namespace std;
int getSum(rpc_conn conn, int a, int b) { return a + b; }

int main() {

rpc_server server(9000, std::thread::hardware_concurrency());
server.register_handler("getSum", getSum);
server.run();

int flag;
cin>>flag;
return 0;
}

A端只要建立一个连接,然后像本地调用方法一样取调用:

#include 
#include
#include
#include

using namespace rest_rpc;
using namespace rest_rpc::rpc_service;

int main()
{
rpc_client client;
bool r = client.connect("127.0.0.1", 9000);
if (r == false)
{
std::cout << "网络连接失败 " << '\n';
return;
}

//回调函数
std::function<void(asio::error_code, string_view)> callback1 = [](const asio::error_code& ec, string_view data) {
auto str = as<int>(data);
std::cout << "getSum= " << str << '\n';
};

client.async_call<0>("getSum", callback1, 1,2);

int sumValue=client.call<int>("getSum", 1, 2);

std::this_thread::sleep_for(std::chrono::seconds(3));

return 0;
}

如上,就实现了应用系统需要的rpc简单需求,在A程序上,除了头文件和命名空间等,正真框架自己用的代码也就三行:rpc_client, connect, async_call, call。 在B上,用到的框架代码只有rpc_server, register_handler, run三行。

除了支持以上requst_response方式的对话调用,也支持subscribe_publish方式的订阅发布通信。


举报

相关推荐

0 条评论