网上有很多开源服务器框架,但总感觉用起来不大顺手。于是乎,我利用闲余时间,开发整理了一套自己的分布式游戏服务器框架。这套框架到如今也差不多成型了,于是我准备写一些相应的文章,介绍下这套框架里的一些关键点的实现,旨在与更多人分享交流一下经验。这是一个长期战线,我计划本文先简单介绍一下大概思想,后续再陆续推出其他的实现上的东西。

         至于框架的名字,想了好久也想不出,哎,取名字实在非我所长,干脆来直接点就叫sframe吧,意为server frame。

         源代码链接 https://github.com/hyh111/sframe。

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已经进行了线程同步处理,对于一个服务来说,所有的逻辑都是线程安全的。

 

        下面附上线程模型图:

        

游戏服务器 架构图 游戏服务器分布式架构_框架

        大体介绍就到这里了,关于具体实现的介绍,之后会陆续推出。