目录
1.前言
前面的框架模块已经搭建完毕,可以将本地方法,转成RPC方法了,现在通过网络模块将RPC方法发布到网络上,成为一个网络上的RPC方法。下面介绍一下网络模块
2.网络模块
2.1网络通信的信息格式定义
信息类型定义:
header_size(4个字节) + header_str + args_str
header_str:
service_name method_name args_size
2.2网络模块的回调函数
创建socket和线程池,,开始监听服务器,绑定回调函数(muduo库会帮我们调用的),主要是下面两个回调函数。其实倒是模板类使用,不会的朋友可以看看我muduo模板使用这篇文章。
//OnConnection没什么好讲的
void RpcProvider::OnConnection(const muduo::net::TcpConnectionPtr &conn)
//重点是
void RpcProvider::OnMessage(const muduo::net::TcpConnectionPtr &conn,
muduo::net::Buffer *buffer,
muduo::Timestamp)
网络上接收的远程rpc调用请求的字符流 ,将其转为string类型,为了按字节大小获取数据。(使用的是string copy函数)。
// 网络上接收的远程rpc调用请求的字符流 Login args
std::string recv_buf = buffer->retrieveAllAsString();// 从字符流中读取前4个字节的内容
uint32_t header_size = 0;
recv_buf.copy((char*)&header_size, 4, 0);
然后根据header_size读取数据头的原始字符流,反序列化数据,得到rpc请求的详细信息
// 根据header_size读取数据头的原始字符流,反序列化数据,得到rpc请求的详细信息
std::string rpc_header_str = recv_buf.substr(4, header_size);
获取rpc方法参数的字符流数据
// 获取rpc方法参数的字符流数据
std::string args_str = recv_buf.substr(4 + header_size, args_size);
到目前为止。数据解析完毕。
2.3开始调用RPC方法
根据解析的服务类名和函数名获取service对象和method对象
生成rpc方法调用的请求request和响应response参数对象,这个可以直接通过protobuf来创建的。
给method方法的调用,绑定一个Closure的回调函数。
在框架上根据远端rpc请求,调用当前rpc节点上发布的方法
Closure的回调函数。
通过protobuf提供的创建模板来创建的对象。Closure又有回调操作,Closure的回调函数主要用于序列化rpc的响应和网络发送
// 给下面的method方法的调用,绑定一个Closure的回调函数
google::protobuf::Closure *done = google::protobuf::NewCallback<RpcProvider,
const muduo::net::TcpConnectionPtr&,
google::protobuf::Message*>
(this,
&RpcProvider::SendRpcResponse,
conn, response);