tars-网络层-服务端实现
2021-05-23 14:18:43 0 举报
鹅厂开源通讯框架源码分析
作者其他创作
大纲/内容
4)setProtocol设协议解析函数
new TC_EpollServer
NetThread::processNet()
processNet{ Connection *cPtr = getConnection(uid); }
8)启动网络线程handle:run
3)bind服务侦听端口
TC_EpollServer::NetThread服务连接管理
+Connection+ConnectionList 带有时间链表的map+NetThread::bind(BindAdapterPtr &lsPtr)+bind(lsPtr){ createSocket 创建套接字 setKeepAlive setTcpNoDelay setNoCloseWait}+start+run//循环监听网路连接请求{ processNet;insertRecvQueue处理网络收包,push到线程安全链表recv_queue _rbuffer;然后由handle线程去处理分包}
TC_EpollServer * Server基类 注册协议解析器 注册逻辑处理器 注册管理端口处理器
2)NetThread::bind(绑定IP端口)然后Run起来处理网络包
bind Adapter
服务过程可能出现的异常情况
+ TC_EpollServer::Handle数据过载_pEpollServer->error(\"[Handle::handleOverload] adapter 队列最小超时时间3秒 :超时则调用ServantHandle::handleTimeout [TARS]ServantHandle::handleTimeout adapter 上报超时数目+NetThread::Connection::insertRecvQueue超过接受队列长度的一半,需要进行overload处理 新进包插入到接收队列前端接受队列满,需要丢弃
ServantHandle处理网络请求线程
Connection
#recv(){span style=\"font-size: inherit;\
运行流程图
NetThread::processAccept()
processAccept{ #是否到达配置的连接数上限 isLimitMaxConnection #设置非阻塞模式 #禁止Nagle算法 # 添加新连接 addTcpConnection}
6)_epollServer-startHandle
新版本性能优化相关
+ 网络线程的内存池配置 * 该网络线程的内存池所负责分配的最小字节和最大字节(2的幂向上取整) */ size_t _poolMinBlockSize; 1KB size_t _poolMaxBlockSize; 8MB
initialize
异常处理
处理新进包
HandleGroup * 按name对handle分组, * 每组handle处理一个或多个Adapter消息 * 每个handle对象一个线程
NetServer
launch(){ # 启动业务处理handle线程HandlePtr &handle = vHandles[i]; #注册epoll侦听事件:ET_LISTEN#启动server-net线程开始处理epoll事件}
+setProtocolName 设置协议类型+setProtocol(AppProtocol::parse)设置协议解析函数+setHandleGroupName(\"AdminAdapter\
Application服务的基类
_epoller.add
6)承接6dispatch处理业务逻辑
BindAdapter
insertHandleQueue{ 判断该消息包是否需要hash,放到handle的线程安全收包队列中,然后由handle的run函数去处理业务包}
TC_Epollerepoller操作类,默认采用了EPOLLET方式触发
MFW网络处理
创建新连接
Application::main
initializeClient(); initializeServer();_netServer->launch();
7waitForShutdown:_netThreads[i]-start()
CEpoller
CEpoller::add 注册fd关注读写事件
Handle定义服务逻辑处理的接口
+handleImp{ handle(stRecvData)纯虚函数,由ServantHandle继承}+run{ initialize handle(stRecvData)}
NetThread::addTcpConnection
处理新进连接
NetThread::run()
run(){ case ET_NET: processNet(ev); break; case ET_NOTIFY: processNotify(); break; case ET_LISTEN: processAccept(ev); break;}
1)_epollServer-bind
5)setHandle(new handle)
0 条评论
回复 删除
下一页