背景
当rpc服务的发布方启动了rpc服务的发布节点后,rpc服务的提供方便进入阻塞状态,等待远程的rpc调用请求。
首先我们要梳理,在run中,rpc框架主要做了哪些事情。因为myrpc框架是基于木朵网络库开发的,所以网络部分使用了muduo的epoll+多线程。Run()主要工作就是提供rpc网络监听。
主要设置有新连接时的回调处理、设置有新消息(有rpc请求)时的回调处理。本文主要梳理当有rpc请求时的框架处理流程。
有rpc请求时的回调函数——onMessage
如果远程有一个rpc服务的调用请求,那么onMessage方法就会响应。具体步骤如下:
- 取出远程rpc请求的字符流
- 根据事先约定好的字符流构成,依次解析出header_size、service_name、method_name、args_size、args。
- 根据获得的service_name和method_name,获取method对象
- 调用在当前rpc节点上已经发布过的方法
// 已建立连接用户的读写事件回调,如果远程有一个rpc服务的调用请求,那么OnMessage方法就会响应
void RpcProvider::OnMessage(const muduo::net::TcpConnectionPtr &conn,
muduo::net::Buffer* buffer,
muduo::Timestamp)
{
// 网络上接收的远程rpc请求的字符流 里面会包含请求方法的名字(以及类名/service_name),参数类型
std::string recv_buf = buffer->retrieveAllAsString();
// 从字符流中读取前4个字节的内容
uint32_t header_size = 0;
recv_buf.copy((char*)&header_size,4,0);