服务器框架设计与编码

一个libevent和boost库写的轻量级服务器框架

总体服务器框架

先看下总体的服务器框架设计图

服务器启动,根据不同服务实例化出对应的CLibeventFrame实例,例如Http服务器实例化CLibeventHttpFrame,Rpc服务实例化CLibeventRpcFrame,Tcp服务实例化CLibeventTcpFrame,Timer定时器服务实例化CLibeventTimerFrame.然后运行初始化函数Init(初始化日志,拉取配置文件等操作),然后运行Run函数启动反应堆.

Http服务器

Http服务器代码

Http服务器类图如下:

在调用CLibeventHttpFrame的Init函数时,除了初始化框架的日志,配置等模块外,还会生成CHttpServer实例,并运行HttpServer的初始化Init函数,给evhttp设置相应uri对应的回调函数,最后返回.等框架启动反应堆后,当有请求到来,会调用CPacket的DealPacket函数,解析请求,并通过uri分发请求,如果为默认的请求则分发到CPacketModel,并根据Interface分发到不同的CDealModel,自定义URI则分发到别的具体的CPacket实例,例如示例CExamplePacket.

Timer服务器

Timer服务器代码

Timer服务器类图如下:

在调用CLibeventTimerFrame的Init函数时,除了初始化框架的日志,配置等模块外,还会生成CTimerServer实例,并运行CTimerServer的初始化Init函数,生成定时器,最后启动定时器,当定时器激活后根据注册的ItimerServer执行相应的应用代码

Tcp服务器

Tcp服务器代码

Tcp服务器类图如下:

在调用CLibeventTcpFrame的Init函数时,除了初始化框架的日志,配置等模块外,还会生成CTcpServer实例,并运行CTcpServer的初始化Init函数,生成具体的IDealModel实例化对象和IProtocol实例化对象,返回后框架启动反应堆,当有请求到来时生成一个CSocketHandle对象,并记录到CTcpServer中,对发过来的信息,通过IProtocol实例解析报文,并将解析后的信息存放在生成的IPacketModel实例中,将IPacketModel实例传递给IDealModel实例进行业务逻辑的处理.

Rpc服务器

Rpc服务器代码

Rpc服务器类图如下:


在调用CLibevenRpcFrame的Init函数时,除了初始化框架的日志,配置等模块外,还会生成CRpcServer实例,并运行CTcpServer的初始化Init函数,将InterfaceInfo信息通过evrpc_register_generic注册到libevent中,然后返回,框架启动反应堆,如果收到rpc请求则会调用注册的各个回调函数,包括生成请求参数结构体,将请求信息解码到请求信息结构体中,生成返回信息结构体,业务处理回调函数,将返回信息结构体重新编码为字节流的回调函数等.
libevent的rpc框架中存在一个问题,如果请求参数为空会core掉,经查是libevent的一个bug.已经提了Issues.