Skip to content

6 进一步完善RPC Server

Alex edited this page Dec 21, 2018 · 9 revisions

6 进一步完善RPC Server

获取源码

本章的目的是让main.cpp向examples/QuickStartDemo/HelloServer/HelloServer.cpp看齐,通过增加Application类和对相应细节调整,完成对之前代码的封装

1 改动点说明

  1. 增加Application类,封装对TC_EpollServer的操作

  2. 增加HelloServer类,继承Application类,是对外使用的类

  3. 在TC_EpollServer里增加HandleGroup,封装了BindAdapter和Handle。可绑定多个BindAdapter进行监听

  4. 在run.sh里将tar-demo升级为tar-demo-improve, 原有的main.cpp不再使用

2 框架的变与不变

其实到本章为止,我们自己代码长的样子与官方example里已经有八九分相像了。服务端有了:

  • HelloServer.h HelloServer.cpp

  • HelloImp.cpp HelloImp.h

  • Hello.h

可以对照QuickStartDemo/HelloServer下的对应文件。

客户端有了:

  • tar_client_improve.cpp

对照QuickStartDemo/HelloServer/Client的main.cpp

  • tar_client_async_improve.cpp

对照QuickStartDemo/HelloServer/AsyncClient的main.cpp。

回头重新审视下,我们发现如果仅仅是实现业务逻辑,需要修改的就是上面列出的文件。其余文件都是框架本身需要的。那么框架是怎么做到变与不变的分离呢?在想这个问题时候,可以重温下1.10节的内容。我们这里再重新梳理一下。

变与不变

  • 在可变的部分,继承于Application的HelloServer通过initialize方法提供了一个可供任意业务逻辑(例如HelloImp)插入的接口,这个接口外表是addServant,实际上是将HelloImp放到了单例类ServantHelperManager的成员变量中

  • 在不变的框架逻辑中,ServantHandle线程通过initialize方法从ServantHelperManager获得了HelloImp并进行了实例化(这里用到了多态,使用的是Servant的指针),然后通过handle方法调用了Servant::onDispatch

  • Servant::onDispatch的具体实现是在Hello中

  • 总结下,Tars实现业务逻辑与框架本身的可插拔设计,是借用了ServantHelperManager这个全局的单例,另外就是利用多态实现运行时调用具体方法