文章简介
运用Thrift的TNonblockingServer编写C++实践案例。
Thrift服务端编程
从Thrift-0.12.0版本的C++源代码来看服务端编程主要有:多线程模型,一个新的客户端连接创建一个线程处理;多线程线程池模型,将新的客户端连接放入任务队列中由线程池读取处理;事件驱动异步模型,注册监听事件和可读事件,将客户端的数据放入任务队列中由线程池进行处理。事件驱动异步模型更适合运用在互联网大量用户的场景中,也就是TNonblockingServer。
Thrift中TNonblockingServer的设计和实现
图1-1 TNonblockingServer的实现
如图1-1所示,当一个新的客户端连接accept时,会new一个TConnection对象,通过轮询选择算法发送给IOThread线程池,IOThread接收到客户端发来的请求数据时,将它打包成Task放入任务队列中,再由任务处理线程池Thread从任务队列pop出来调用服务端实现的业务逻辑函数处理。下面以用户注册的业务场景为例,实现一个具体的TNonblockingServer案例。
Thrift接口文件编写
运行thrift -r --gen cpp user.thrift,生成服务端和客户端RPC接口文件。其中required是必传字段,optional是可选字段。
服务端代码实现
客户端代码实现
编译和运行
参考文献
[1] Mark Slee, Aditya Agarwal and Marc Kwiatkowski. Thrift: Scalable Cross-Language Services Implementation. 2007
[2] Apache Thrift官方网站, http://thrift.apache.org
[3] Apache Thrift源代码, https://github.com/apache/thrift
[4] Lex & Yacc 官方网站, http://dinosaur.compilertools.net