网上有很多开源服务器框架,但总感觉用起来不大顺手。于是乎,我利用闲余时间,开发整理了一套自己的分布式游戏服务器框架。这套框架到如今也差不多成型了,于是我准备写一些相应的文章,介绍下这套框架里的一些关键点的实现,旨在与更多人分享交流一下经验。这是一个长期战线,我计划本文先简单介绍一下大概思想,后续再陆续推出其他的实现上的东西。
至于框架的名字,想了好久也想不出,哎,取名字实在非我所长,干脆来直接点就叫sframe吧,意为server frame。
源代码链接 https://github.com/hyh111/sframe。
sframe是一款跨平台(windows和linux)的分布式游戏服务器框架,主要包括有以下几点核心功能:
1. 网络(只支持TCP)
2. 服务管理与调度。
3. 自动消息序列化,sframe采用的是消息收发的方式实现服务间通信。
4. 消息派发(自动将消息映射到对印的处理函数)
5. 配置加载与管理
6. 文件日志
7. 定时器
sframe采用了现在比较主流的思想,抛弃了传统的服务器(Server)节点的概念,将服务器(Server)节点变成服务节点(Service)。这样使得部署和修改结构变得灵活,也使得逻辑层的开发变得更加简单。
sframe将怎个服务器系统看做一张网络,每个服务是一个节点,每个服务节点有一个唯一ID。sframe屏蔽了逻辑层与具体服务器部署的关联,逻辑层不用关心当前服务器在哪台物理机器上面,当需要发送消息给其他服务时,也不用关心对方的具体部署,而只用知道自己的服务ID和对方的服务ID即可。
Sframe最核心的两个类是,sframe::ServiceDispatcher类和sframe::Service类。
sframe::ServiceDispatcher类,采用单例模式,对于一个进程,全局只有一个对象。它负责线程管理、管理和调度所有的服务、区分本地服务与远程服务、消息的发送、周期定时等功能。
sframe::Service类,顾名思义,就是服务类。所有的服务都要派生自这个类。然后将服务注册到ServiceDispatcher。
对于一个sframe进程,包括一个IO线程和若干个逻辑线程。
1. IO线程
IO线程处理所有的网络IO和定时功能。一个sframe进程仅有一个IO线程。对于定时器,IO线程仅仅只触发定时器,不会处理定时逻辑,定时器触发以后,IO线程将发送定时器消息给服务,然后由逻辑线程处理具体的逻辑。
2. 逻辑线程
逻辑线程处理所有的业务逻辑,一个sframe进程由大于1个逻辑线程,数量由用户指定。若干个逻辑线程的循环读取与处理每一个服务接受的消息,逻辑线程数量与服务数量没有关联。Sframe已经进行了线程同步处理,对于一个服务来说,所有的逻辑都是线程安全的。
下面附上线程模型图:
大体介绍就到这里了,关于具体实现的介绍,之后会陆续推出。