基于muduo的RPC项目的服务端的网络模块

目录

1.前言

2.网络模块

2.1网络通信的信息格式定义

 2.2网络模块的回调函数

2.3开始调用RPC方法


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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值