lotuscc / arpc

simple c++ async rpc framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

简单异步RPC框架。

关键特性:异步、协程、Reactor、Protobuf、RPC。

使用ucontext实现了基本的协程支持,结合Reactor架构实现Connector的异步读写接口,写业务代码时可以直接使用同步的写法,而不用写各种回调函数。

在异步读写接口中如果发生了阻塞事件,会自动yield掉当前协程,让出CPU使用权以提高系统性能。

系统的整体架构如图所示png1

每个Connector提供异步读写接口。

在异步读写的过程中,如果发生阻塞操作(比如需要读64个字节,但是网络中只发送了32个字节), 此时当前Connector会自动yeild掉,让出占用的线程,使其可以完成其他事件例如accept新连接、读写另一个Connector的数据等等。

从整体上来看,虽然每一个Connector是同步的,但是整体系统是异步的,可以充分利用当前系统的资源。 并且Connector的yeild操作也是由于网络数据未达等客观原因,此时如果不yeild,客观上还是需要等待网络数据到达,白白浪费了等待时间。

ell_Ipv4Addr local_addr;

Server server(local_addr);

server.message = [](Connector *conn) {   
    // read request size
    conn->read_nbytes(&len, 4);

    // read request
    conn->read_nbytes(data, len);

    // send some data
    conn->send_nbytes(httpResponse_hello, sizeof(httpResponse_hello)-1);
};

server.start();

简单的业务服务如上所示,这里假设所采的协议格式为:先发送4个字节的数据包大小,然后发送数据包内容

可以看到这种直观的方式很容易写业务代码,以及写一些基于TCP的自定义协议栈。

这里的read_nbytes是一个异步读接口,当网络上数据未到达时会自动yeild掉,当数据到达时,Reactor架构会触发可读事件,重新激活这个协程,从而继续读写数据。

About

simple c++ async rpc framework


Languages

Language:C++ 97.8%Language:CMake 2.2%