tars framework 源码解读(五) servant部分章节。客户端部分。客户端部分的一些类及其配置细节

ServantProxy

很有意思的是,服务端的实现叫Servant,对应客户端连接器的名就叫ServantProxy,顾名思义,是客户端连接的代理.

selectNetThreadInfo的实现:

1获取ServantProxyThreadData pSptd;

2如果pSptd还没初始化过,先new本Servant ObjectProxyNum个ReqInfoQueue队列并赋值给pSptd->_reqQueue,这个ObjectProxyNum正好也是Servant的ObjectProxy线程数。

3、如果是只有一个ObjectProxy。那没得说就用第一个。

如果不止一个,则有两种情况:

若pSptd->_netThreadSeq为非0(表示网络线程发起的请求回到自己的网络线程来处理,其值为网络线程的id),则选择_netThreadSeq这个线程序号对应的ObjectProxy和ReqInfoQueue队列返回。

否则,轮询这些ObjectProxy,将对应的ObjectProxy和ReqInfoQueue队列返回。当前所轮询到的id 放在_netSeq变量中。

ServantProxyThreadData

线程私有数据管理类。

这里有个每个线程跟客户端网络线程通信队列,ReqInfoQueue数组。数组大小为客户端最大网络线程数MAX_CLIENT_THREAD_NUM 默认MAX_CLIENT_THREAD_NUM=64个。另外ReqInfoQueue自己是typedef TC_LoopQueue<ReqMessage*,1000> ReqInfoQueue。

可以说每个ObjectProxy对应的客户端线程的消息队列 默认是1000个,但可通过配置中<reqqueuenum>更改..

另外这个类中还有CoroutineScheduler协程调度器 这种很重要的

ObjectProxy

每个objectname在每个客户端网络线程中有唯一一个objectproxy

1、初始化阶段:

1]如果启用set,设置指定set调用时,指定set的优先级最高

2]设置ProxyProtocol协议解析器 默认协议解析器:

requestFunc=ProxyProtocol::tarsRequest();

responseFunc=ProxyProtocol::tarsResponse();

协议名称为 tars

可以通过setProxyProtocol()函数更改协议解析器

3]创建一个EndpointManager对象。将ProxyName和setName,以及Communicator传入.也就是一个objectproxy一个EndpointManager

2、重要函数说明:

1、invoke..从CommunicatorEpoll->handle()中过来的,当他队列中有要处理的消息过来时候,就会调用此函数.

2、doInvoke..从EndpointManager->doNotify()中过来的..看起来是主控的请求响应到了doEndpoints或者是主控请求响应异常doEndpointsExp,EndpointManager给objectproxy发一个通知。查看《完整的tars调用流程详解》章节部分的内容

EndpointManager

框架内部的路由管理的实现类

AdapterProxy类的实现

这个ServantProxy如果存在,后面就不再建立。那么问题来了,这个是长链接吗?

CommunicatorEpoll

客户端网络处理的线程类

每个此类对象,主要包含下面几个类:

1、ObjectProxyFactory类对象:在本类构造函数,会new一个ObjectProxyFactory,并与本类this指针绑定.参考上面Communicator部分的描述

2、TC_Epoller类对象:构造函数时,_ep.create(1024),创建epoll句柄,并给此epoll设置最大支持1024链接数。

3、TC_Socket类对象:一个socket,专用于 关闭线程请求的事件通知 .创建之后,立刻add进上面的epoll中

4、AsyncProcThread异步线程数组:异步线程数配在<asyncthread>字段中,默认是3个,最多只有1024个。

5、初始化MAX_CLIENT_NOTIFYEVENT_NUM = 2048个NotifyInfo请求事件通知数组

6、如果是<modulename>字段有配内容, 设置对应modulename的异步队列统计上报对象PropertyReport

7、一些关键的性能参数:

1]节点ip队列未发送请求的大小限制,<nosendqueuelimit>字段配置中,默认是1000,代码保护不小于1000.这个值,最终会在AdapterProxy的调用时用到,若队列满,会丢弃后续请求

2]异步队列大小,<asyncqueuecap>配置中,默认是10000,代码保护不小于10000.作为参数设置每个AsyncProcThread异步线程的队列大小。在异步线程中塞入异步队列时,队列满,丢弃后续请求

3] epollwait的超时时间,单位ms: <epollwaittimeout>配置中,默认是100,代码保护不小于1。与下面的检查超时请求间隔时间2选一,选小的那个,用于CommunicatorEpoll::run()中的_ep.wait(epollwaitouttime)此处,epoll循环超时。

4]检查超时请求的时间间隔,单位ms:<timeoutcheckinterval>配置中,默认是100,代码保护不小于1。用于CommunicatorEpoll::doTimeout()及CommunicatorEpoll::run()中处理超时的流程.会轮询_objectProxyFactory中所有 的ObjProxy,以及ObjProxy中绑定的AdapterProxy数组。

原文地址:https://www.cnblogs.com/yylingyao/p/12198155.html

时间: 2024-10-02 02:05:29

tars framework 源码解读(五) servant部分章节。客户端部分。客户端部分的一些类及其配置细节的相关文章

tars framework 源码解读(三) servant部分章节。客户端部分。完整的tars调用流程详解

一般tars客户端使用方式: 我们用客户端进行tars rpc调用时候,一般如下面这样写: 方式一. //直连方式 TC_Endpoint ep; AdminFPrx pAdminPrx; //服务管理代理 string sAdminPrx = "[email protected]"+_serverObjectPtr->getLocalEndpoint().toString(); pAdminPrx = Application::getCommunicator()->str

tars framework 源码解读(四) servant部分章节。客户端部分。selectAdapterProxy实现流程 选取合适的AdapterProxy

这块内容是个关键性流程. tars调用在调用层,一般只会简单的 PatchPrx proxy = Application::getCommunicator()->stringToProxy<PatchPrx>(_patchRequest.patchobj); proxy->timeout(60000); proxy只是一个ServantProxy,他只是作为一个本地与服务器组中某个服务器名的几个服务进程打交道的代表,这些具体干活的服务进程,会分别部署在几个不同的服务器物理机中,一般

tars framework 源码解读(一) 总述

tars framework源码 其实分两块. 一块是tarscpp 这块的代码跟外面的tarscpp貌似是一毛一样的.这块代码实现了一个服务的基础lib 一块是framework基础服务代码实现.这些服务撑起来整个tars系统的框架功能.直接用Introduction.zh.md中的图来说明一下吧. 整体架构的拓扑图主要分为2个部分:服务节点与公共框架节点. 服务节点: 服务节点可以认为是服务所实际运行的一个具体的操作系统实例,可以是物理主机或者虚拟主机.云主机.随着服务的种类扩展和规模扩大,

tars framework 源码解读(二) libservant部分源码的简介

还是直接用官方原图解说 服务端:可以理解成对外公开的接口 被调用时候响应流程 的底层封装 (响应端) NetThread: 收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp: BindAdapter: 绑定端口类,用于管理Servant对应的绑定端口的信息操作: ServantHandle:业务线程类,根据对象名分派Servant的对象和接口调用: AdminServant: 管理端口的对象: ServantImp: 继承Servant的业务处理基类(Serv

QCustomplot使用分享(二) 源码解读

一.头文件概述 从这篇文章开始,我们将正式的进入到QCustomPlot的实践学习中来,首先我们先来学习下QCustomPlot的类图,如果下载了QCustomPlot源码的同学可以自己去QCustomPlot的目录下documentation/qcustomplot下寻找一个名字叫做index.html的文件,将其在浏览器中打开,也是可以找到这个库的类图.如图1所示,是组成一个QCustomPlot类图的可能组成形式. 一个图表(QCustomPlot):包含一个或者多个图层.一个或多个ite

AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager

做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一读这个框架的代码,我们的目标就是理解了它的思想之后,能够明白我们的请求是如何实现的,我们的代码哪里还需要进行改进,如果能够更进一步,我们能够总结出一套适合大部分应用的网络架构思想. 能够让一些人从中受益. 我们先来看看整个框架的文件系统,我们先不对每个文件的作用进行说明,在整个源码解读最后的一篇中我

AfNetworking 3.0源码解读

做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一读这个框架的代码,我们的目标就是理解了它的思想之后,能够明白我们的请求是如何实现的,我们的代码哪里还需要进行改进,如果能够更进一步,我们能够总结出一套适合大部分应用的网络架构思想. 能够让一些人从中受益. 我们先来看看整个框架的文件系统,我们先不对每个文件的作用进行说明,在整个源码解读最后的一篇中我

OpenCV2马拉松第27圈——SIFT论文,原理及源码解读

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28913101 简介 SIFT特征描述子是David G. Lowe 在2004年的ijcv会议上发表的论文中提出来的,论文名为<<Distinctive Image Featuresfrom Scale-Invariant Keypoints>>.这是一个很强大的算法,主要用于图像配准和物体识别等领域,但是其计算量相比也比较大,性价

struct2源码解读(5)之解析bean标签

struct2源码解读之解析bean标签 上篇博文,我们大致分析了struct2是如何解析struct2配置文件的,包括default.properties和struct*.xml,但有些细节比较繁琐,如struct2是如何解析bean标签的和struct2是如何解析packag标签的,还没详细分析,这篇博文将详细解析struct2是如何解析bean标签的,package的解析将留在下篇博文进行讲解. 一.bean标签 我们先来看下bean标签是怎么样的? 代码清单:structs.xml <?