Skip to content

4 进一步完善RPC Client

Alex edited this page Dec 19, 2018 · 5 revisions

4 进一步完善RPC Client(同步)

获取源码

第3章和本章在代码提交记录上没有分类似3.1这样的分节,是一整章的提交记录,请知悉

前面章节的RPC Client外表看起来还不太像example/QuickStartDemo/HelloServer/Client里的使用方式,这一节的目标是完成向example中client使用方式的靠拢。

1 主要改动点说明

  • ObjectProxy类之前已经完成了对ip和port的封装

  • 增加ServantProxy类对ObjectProxy的包装,即外界一般都通过ServantProxy来使用ObjectProxy

  • 增加Communicator类对ServantProxy和CommunicatorEpoll的封装

  • 增加HelloProxy类(继承于ServantProxy),完成对具体调用函数testHello的封装(包括了对ReqMessage初始化的封装)

  • tar_client_async_improve.cpp是本章的客户端

核心理解点是Communicator类通过stringToProxy方法,将实例化好的ServantProxy指针(父类指针)赋值给了HelloProxy指针(子类指针),HelloProxy指针负责请求的格式化和调度。这句话有点不好理解,事实上这部分代码对于初次阅读者可能都不太友好,不过没关系,我们可以从下面的模型示意图中理解上面这样玩法的用意。

2 逻辑流程说明

逻辑流程说明

  1. 第4步创建了多个CommunicatorEpoll线程

  2. 第6步创建了名为ppObjectProxy的ObjectProxy数组,注意ObjectProxy数组里的每一个ObjectProxy都是由具体的CommunicatorEpoll线程生成的

  3. 第7步中ServantProxy将ppObjectProxy数组指针赋值给了自己的私有成员变量_objectProxy,完成了对ObjectProxy的包装

  4. 第8步是转折点,HelloProxy是ServantProxy的子类,这一步中将第7步中的ServantProxy* sp赋值给了HelloProxy* prx,即父类指针赋值给了子类指针,这时候HelloProxy* prx里就继承了ServantProxy* sp中的所有内容,包括ppObjectProxy数组(ppObjectProxy数组在ServantProxy类中名字变为了_objectProxy)

  5. 第12步ServantProxy::selectNetThreadInfo函数中采取类似轮询方式(pSptd->_netSeq++)获取_objectProxy数组中的具体ObjectProxy。每个ObjectProxy都会指向一个具体的CommunicatorEpoll线程,所以ObjectProxy就承担了通知其对应的CommunicatorEpoll线程接收请求的职责