-
Notifications
You must be signed in to change notification settings - Fork 45
6 进一步完善RPC Server
本章的目的是让main.cpp向examples/QuickStartDemo/HelloServer/HelloServer.cpp看齐,通过增加Application类和对相应细节调整,完成对之前代码的封装
-
增加Application类,封装对TC_EpollServer的操作
-
增加HelloServer类,继承Application类,是对外使用的类
-
在TC_EpollServer里增加HandleGroup,封装了BindAdapter和Handle。可绑定多个BindAdapter进行监听
-
在run.sh里将tar-demo升级为tar-demo-improve, 原有的main.cpp不再使用
其实到本章为止,我们自己代码长的样子与官方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这个全局的单例,另外就是利用多态实现运行时调用具体方法