服务器底层,个人任务认为稳定、高效、易用最重要。如果非要排个序的话 稳定 > 易用 > 高效。
我是用的libuv这个库作为基础支持库的。为啥用它,主要是网络库不想自己写了,有现成的最好。这个库是轻量级的库而且跨平台,windows下分装了IOCP,linux下分装了EPOOL。 然后这个库带了一些其他接口,比如说基础的定时器 都是挺好用的,所以就用了。
我写的底层库打算实现一个空的框架,所有业务必须以模块的方式注册进去,给出必要的接口,业务逻辑上层去实现。如下所示:
// 核心服务
#ifndef ServerCore_h__
#define ServerCore_h__
#include "Common.h"
#include <functional>
#include <vector>
namespace SCore
{
#define LOGICSERVICE_PRIVATE_DATA_SIZE 16
// 逻辑服务
class ILogicService
{
// 事件处理函数类型
typedef void (*EventSyncFunc)(ILogicService* self, void* param);
// 定时器回调函数类型
typedef void (*TimerProcFunc)(ILogicService* self, void* param);
friend class ServerCore;
public:
ILogicService();
virtual ~ILogicService();
// 加载配置
virtual void LoadConfig() {};
// 初始化
virtual void OnInit() { }
// 心跳
virtual void OnUpdate() {};
// 销毁时被调用
virtual void OnDestory() { SetDestoryFinish(); };
// 设置销毁完成, 当设置销毁完成后,才能正式从核心服务中移除,所有其他销毁动作必须在此之前执行
void SetDestoryFinish();
// 获取状态
virtual int GetStatus() { return m_nStatus; }
// 设置心跳时间间隔
void SetHeartInterval(int intervalTime = ServiceHeartInterval_None);
// 获取服务类型
int GetServiceType();
// 获取服务器ID
long long GetServiceID();
// 注册事件同步处理接口
void RegisterSyncEvent(int eventID, EventSyncFunc func);
// 移除事件同步处理接口
void UnRegisterSyncEvent(int eventID, EventSyncFunc func);
// 触发同步事件
// @eventID 事件ID
// @param 参数
void TriggerSyncEvent(int eventID, void* param);
// 触发同步事件
// @eventID 事件ID
// @param 参数
// @serviceID 指定serviceID 逻辑服务处理
void TriggerSyncEvent(int eventID, void* param, long long serviceID);
// 触发同步事件
// @eventID 事件ID
// @param 参数
// @serviceType 指定逻辑服务类型处理
void TriggerSyncEventByType(int eventID, void* param, int serviceType);
// 添加定时器
// @startTime 定时器开始执行时间(多少毫秒后开始执行)
// @repeat 非单次执行的定时器,每次执行的时间间隔ms 如果为0 则只执行一次
// @maxRunCount 执行总次数,