一种基于IOCP机制实现网络服务代理的方法与流程

文档序号:11879171阅读:476来源:国知局
一种基于IOCP机制实现网络服务代理的方法与流程
本发明涉及网络通信领域,特别涉及一种基于IOCP机制实现网络服务代理的方法。
背景技术
:在信息化时代,网络通信是非常重要的,是把各种设备连接在一起的重要技术手段。随着通信规模的越来越庞大,网络中心结点的设计变得非常的重要,因为它是影响通信效率的瓶颈点。应对多客户端的连接,可以使用同步通信+多线程的方式来应对,但这种方式存在的问题是,当每个客户端连入后在中心结点都要开启个线程,由于所有的这些线程都是处于运行状态,系统不得不在所有可运行的线程之间进行上下文切换,而线程切换是相当浪费时间的。IOCP模型又称为完成端口模型,是Windows平台下开发高性能服务器应用的一种IO模型,它可以解决大量并发连接请求。在计算机领域中,代理是指按照用户意愿,能够自主执行的软件模块。对应TCP/IP分层模型,代理技术可分为网络接口层代理技术,IP层代理技术,传输层代理技术和应用层代理技术。网络代理服务器需要具备提供大量并发访问服务的能力。通过改进应用程序的性能和提高硬件性能并不能真正解决这个问题,因为单台服务器性能总是有限的,而且网络请求具有突发性,当某些重在事件发生时,网络访问就会急剧上升,从而造成网络阻塞,利用集群技术在应用系统中实现负载均衡可以较好地解决这一问题。就目前而言,大多数应用都是使用IOCP这种机制将大量并发请求接入到系统中,但是仍存在一些缺陷,例如专利号201210575218的基于IOCP的海量终端设备接入系统提供的方法只是将海量并发请求接入,对于如何合理地分发这些请求却没有涉及。这并不能很好地满足实际的需求。技术实现要素:本发明的目的在于克服现有技术的缺点与不足,提供一种基于IOCP机制实现网络服务代理的方法。本发明的目的通过以下的技术方案实现:一种基于IOCP机制实现网络服务代理的方法,包括以下步骤:S1.通过IOCP接入客户端的请求;S2.代理服务端对接入的客户端请求进行过滤处理;S3.代理服务端利用负载均衡算法将过滤后的客户端请求分发到负载最低的服务端进行处理。步骤S1中,所述客户端,在发起请求时,首先要将发送的数据按照协议规则封装成数据包,然后使用Socket中的异步发送方法将数据包发送到网络中,如果收到应答包且指示发送数据包正确则结束,否则重发。步骤S2中,所述过滤处理是指代理服务端收到客户端发来的数据包后验证数据包的完整性,如果无误则将该数据包放入到等待队列,然后选择一个负载最低的服务端进行请求转发;否则丢弃该数据包。步骤S3中,所述负载均衡算法为动态加权算法,代理服务端以当前的负载情况为依据,将每次每个服务节点的指标信息进行转换得到服务端的负载量,由此确定负载最低的服务端。所述指标信息包括CPU占有率L(C1)、磁盘IO占有率L(D1)、内存占有率L(M1),则服务器的负载量L(S1)计算公式如下:L(S1)=r1r2r3L(C1)L(D1)L(M1)---(1)]]>其中r1、r2、r3分别为当前服务类型下,CPU占有率L(C1)、磁盘IO占有率L(D1)、内存占有率L(M1)的重要系数。它以系统当前的负载情况为依据,可以充分利用系统的处理能力来减少服务的响应速度,每次每个服务节点反映的是自己的各项信息,如CPU占有率L(C1)、磁盘IO占有率L(D1)、内存占有率L(M1)。这些信息并不能代表某一节点的负载情况,所以需要一个函数将这些指标进行一次转换,得到该服务器的负载量L(S1):L(S1)=r1r2r3L(C1)L(D1)L(M1)---(1)]]>因为服务类型不同,对节点的各个部分的负载影响有差异。因此,引入参数r,用以强调该类服务对各个部分的不同程度影响。比如,大文件查找服务来说,磁盘IO、内存对服务节点的速率影响较大。所以,我们可以这样调整参数r,r=[0.1,0.2,.0.3],用以表示磁盘与内存对该项服务的重要性。若当前系数不能不能很好地反映节点的负载,可以对系数不断的修正,直到找到合适的一组参数。将参数r代入上述公式并展开得:L(S1)=0.1*L(C1)+0.2*L(D1)+0.3*L(M1)(2)。所述代理服务端会定时去与服务端进行数据交换。代理服务端与服务端定时进行数据交换的目的是了解所有服务当前任务饱和状态,以便将客户请求发送到正确的服务端。所述服务端收到代理服务端发来的请求之后进行处理,处理完毕后将处理结果发回给代理服务端,同时上报服务端当前的状态。所述客户端、代理服务端、服务端采用的是C/S架构模式,客户端与代理服务端之间、代理服务端与服务端之间均通过Socket进行网络通信。所述客户端采用微软的Winform桌面开发技术,用于实现客户端的业务逻辑,所述业务逻辑包括收发数据、数据展示、与用户进行交互;所述代理服务端采用微软的C++语言开发的Windows服务,在客户端与服务端之间充当代理角色,用于将客户的请求接入并进行相应的转发;所述服务端是基于Linux操作系统,使用C语言开发的ServerApp,用于处理代理服务端转发过来的请求。所述客户端、代理服务端、服务端遵守相同的通信协议。本方案中的应用层是根据业务规则自行定义的协议,传输层使用的是TCP协议。本发明与现有技术相比,具有如下优点和有益效果:1、本发明提高了终端用户的接入数量。2、本发明提高了服务端的接入数量,根据需要可以随时进行扩展。3、本发明提高了服务端的利用效率。4、本发明适用于多客户端与多服务端之间的通信。附图说明图1为客户端、代理服务端、服务端的布置示意图。图2为本发明所述一种基于IOCP机制实现网络服务代理的方法的流程图。具体实施方式下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。如图1所示,本发明的部署后的结构图,整套结构分为了客户端、代理服务端、服务器端。代理服务最包括三个最核心的功能模块:并发请求的接入、请求的过滤(保护后台服务器)、请求分发(负载均衡,提高处理效率)。如图2所示为IOCP的使用方法步骤:调用CreateIOCompletionPort()函数创建一个完成端口,而且在一般情况下只需要建立这一个完成端口。根据系统中有多少个处理器,就建立多少个工作者线程,这几个线程是专门用来和客户端、服务端进行通信的。创建一个用于监听的Socket,绑定到完成端口上,然后开始在指定的端口上监听连接请求。在上面这个监听Socket上投递AcceptEx请求。工作者线程的任务是处理具体的通信事务,它会去监听完成端口的队列中是否有完成的网络操作,一旦完成端口上出现了已完成的I/O请求,那么等待的线程会被立刻唤醒,处理到来的操作。当收到Accept通知时,和普通的Socket通讯方式一样需要做三件事情:先要为新连入的连接分配一个Socket,然后在这个Socket上投递第一个异步的发送与接收请求,完成之后继续监听。在此过程中会记录新连入Socket的Ip与端口号。当收到Recv通知时,根据自定义协议规则去判断出当前操作的类型,如果是请求解密,工作者线程会在缓存中查找一个空闲的解密机进行发送;如果请求是上报任务结果,工作者线程会提取出相应的客户端信息然后进行转发;如果是上报当前服务状况,工作者线程会将上报的信息更新到缓存中。关闭完成端口,释放所有资源。负载均衡的核心部分是负载均衡算法,它的主要工作是将任务合理地分配到服务节点上,使服务节点比较均衡地承担任务,从而实现整个系统的负载平衡性,提高系统的处理能力和服务质量。每个服务节点发送给代理服务器的消息结构如下:TypedefstructtagSERVERINFO{CharszIp[16];//服务节点的IP地址DWORDdwLastTime;//代理服务器收到这些信息的时间UINTfUsges;//服务节点的使用率}代理服务器保存一个全局的链表,称之为服务节点信息链表,链表中每个节点都是上述的一个数据结构,表示当前所有可用的服务节点信息,这此信息会被时实更新,根据这些信息采用合适的算法计算出当前负载最小的节点。上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1