淘宝开源网络框架TBNET分析

TBNET是淘宝的开源异步网络框架,源码见:http://code.taobao.org/p/tb-common-utils/src/trunk/tbnet/

TBNET主要类之间的联系如下,其中框架的使用者需要关注红色部分的类或接口。

 

image 

 

关于每个类接口介绍,请参考@淘宝立德 总结的文档:http://vdisk.weibo.com/s/1UzQB/1326963540

 

Transport类是用户使用的接口,服务器通过listen开始监听,需要传递实现IPacketStreamer和IServerAdaptor的类,其中IPacketStreamer用于数据缓冲区与packet(数据包)的相互转换,IServerAdaptor是服务器处理packet的接口,包含handlePacket和handleBatchPacket两个接口,用于处理单个数据包和批量处理数据包。监听之后,服务器就可以开始接受请求并处理,通过start来启动读写线程和超时线程,读写线程处理数据包请求,超时线程用于将超时的请求移除。

 

读写线程执行eventLoop,eventLoop循环的通过EpollSocketEvent来获取准备好的描述符,准备好的事件有两种情况,分别是监听描述符上的事件(由TcpAcceptor处理)和普通请求建立的描述符(由TcpComponent处理)。TcpAcceptor将接到的请求添加到epoll集合中,TcpComponent则会调用Connect的handPacket接口,该接口会根据服务器的参数,调用iServerAdaptor的handlePacket或handleBatchPacket接口。

客户端通过Transport::connect连接服务器,返回一个TcpConnect类,通过postPacket可向服务器发送数据包,需要指定处理回复的接口IPacketHandler,这里还可以指定额外的参数。TBNET的请求是异步处理的,其通过Channel实现,每个请求对应一个channel id,ChannelPool包含channel id到IPacketHandler的映射,postPacket时,会将packet对应的channel id与IPacketHandler及额外参数添加到ChannelPool中,当收到数据包时,根据包的channel id从ChannelPool中取出对应的handler来处理请求。ConnectionManager提供对请求连接的同一管理,提供控制连接参数,以及connect、disconnec、sendPacket等接口,客户端使用该接口发包更简单方便。

 

如何使用TBNET

  1. 定义客户端和服务器通信需要定义的数据报格式,数据包类需继承自Packet,并实现encode和decode接口。
  2. 实现创建数据报的工厂类,需继承自IPacketFactory,并实现createPacket接口。
  3. 服务器端实现IServerAdapter接口,并实现handlePacket接口,如果想实现批量处理数据包,需将_batchPushPacket标记设为true,并实现batchHandlePacket接口,调用transport::start, transport::listen;;客户端需实现IPacketHander接口,并实现handlePacket接口,调用transport::start, transport::connect。

 

使用实例http://code.taobao.org/svn/snippet/trunk/tbnet,或tbnet源代码下的EchoServer、EchoClient。

  1. echo_packet.h 定义通信数据包,客户端请求包为一个string,服务器响应包为当前时间和收到的string。
  2. echo_factory.h 定义创建数据包的工厂类,根据pcode创建对应的packet。
  3. echo_server.cpp实现服务器的IServerAdapter,启动读写和超时线程,并开始监听。
  4. echo_client.cpp实现客户端的IPacketHandler,启动读写和超时线程,并连接服务器。
posted @ 2013-04-19 14:13  ydzhang  阅读(929)  评论(0编辑  收藏  举报