Open crazyjohn opened 9 years ago
这篇要分享下GUAJIA目前的server端的架构,包括它的引擎以及业务。分析下它的有点和缺点,以及如何能更好。 @author crazyjohn 前言
这篇要分享下GUAJIA目前的server端的架构,包括它的引擎以及业务。分析下它的有点和缺点,以及如何能更好。 @author crazyjohn
time flies,目前为止已加入203快8个月了。早期负责一个新项目GONGTING的开发,这个项目的研发至今历历在目,server只有我带着航儿,苦杀了一个月,没早没晚没日没夜,杀得天昏地暗,杀出了一条血路。后期到了WOW负责server端的开发。不过两个项目来看核心的引擎基本没怎么变化,但是GONGTING时期我对引擎的并发部分进行了重构,业务层也相应进行了大改造。下面我把这套结构分享给大家。
先来看类图:
按照包为单元进行结构组织划分:
从部署角度来说,WOW在逻辑上和物理上都是单服,也就是所有的业务处理都放到一个进程里,然后部署到单台CVM云虚拟机上。下面分模块来说。
也就是HawkThread体系。这里是server引擎中线程的部分,是重中之重,引擎的发动机。一个HawkThread扩展子一个Thread类,内部聚合了一个任务队列,并且对外暴露了addTask方法,用来供外部调用给thread添加执行任务。HawkThread是线程安全的,通过ReentrantLock可重入锁来保证并发的安全性。HawkTask是对任务的抽象,根据不同的应用场景它又派生了一些典型的子类,比如HawkProtolTask用来代表client发送过来的协议任务,HawkMsgTask代表服务器内部的事件任务等。HawkThreadPool是线程池的概念,也就是HawkThread的管理器,提供了一些对线程生命周期的管理办法,比如start启动和stop停止等。而且也可以通过参数来配置启动的线程数目,方便scale up纵向扩展。
HawkConfigBase是所有模板的基类,各个业务的模板都从此处派生。HawkConfigStorage是模板的容器类,每类型的模板都放到自己的容器中。HawkConfigManager是模板服务的入口,对外暴露了获取指定模板的各种接口。模板数据对外是只读的,不暴露写接口。
基础对象结构。HawkObjeBase体系。这是游戏中的基础对象,HawkObjManager是它的管理器,提供一系列的生命周期管理方法,比如queryObject查询对象,freeObject释放对象,removeTimeoutObj移除超时对象等等。还有很重要的两个方法就是:管理器提供对基础对象锁定lockObject和解锁unlockObject方法,用来解决在有并发操作时候的问题。
业务层按照Module模块进行划分。模块这里有几个典型接口:
网络协议处理这里后期我们又添加了注解代替注册来减少出错几率。如图:
日志使用self4j + log4j。基础组件使用log4j的DailyRollingFileAppender来记录行为日志按照天为单位进行文件分割。一些功能性的日志比如异常之类的也是一样的机制。
核心循环:
这个时序图很简单,介绍的是引擎组件的心跳时序,大概机制跟下面介绍到的实体Player和Manager跟对应的线程绑定,然后由指定线程触发实体的心跳的机制是一样的,结合着看。
核心时序:
时序图介绍的是一次网络消息的处理流,这里不详细介绍,可以结合底下优点部分的分析一起看。
相对完善的周边服务:
并发处理方式
4被谁吃了? @田志远
time flies,目前为止已加入203快8个月了。早期负责一个新项目GONGTING的开发,这个项目的研发至今历历在目,server只有我带着航儿,苦杀了一个月,没早没晚没日没夜,杀得天昏地暗,杀出了一条血路。后期到了WOW负责server端的开发。不过两个项目来看核心的引擎基本没怎么变化,但是GONGTING时期我对引擎的并发部分进行了重构,业务层也相应进行了大改造。下面我把这套结构分享给大家。
1. 整体结构
先来看类图:
按照包为单元进行结构组织划分:
从部署角度来说,WOW在逻辑上和物理上都是单服,也就是所有的业务处理都放到一个进程里,然后部署到单台CVM云虚拟机上。下面分模块来说。
1.1 线程结构
也就是HawkThread体系。这里是server引擎中线程的部分,是重中之重,引擎的发动机。一个HawkThread扩展子一个Thread类,内部聚合了一个任务队列,并且对外暴露了addTask方法,用来供外部调用给thread添加执行任务。HawkThread是线程安全的,通过ReentrantLock可重入锁来保证并发的安全性。HawkTask是对任务的抽象,根据不同的应用场景它又派生了一些典型的子类,比如HawkProtolTask用来代表client发送过来的协议任务,HawkMsgTask代表服务器内部的事件任务等。HawkThreadPool是线程池的概念,也就是HawkThread的管理器,提供了一些对线程生命周期的管理办法,比如start启动和stop停止等。而且也可以通过参数来配置启动的线程数目,方便scale up纵向扩展。
1.2 网络层
1.3 数据层
1.4 模板层
HawkConfigBase是所有模板的基类,各个业务的模板都从此处派生。HawkConfigStorage是模板的容器类,每类型的模板都放到自己的容器中。HawkConfigManager是模板服务的入口,对外暴露了获取指定模板的各种接口。模板数据对外是只读的,不暴露写接口。
1.5 基础对象层
基础对象结构。HawkObjeBase体系。这是游戏中的基础对象,HawkObjManager是它的管理器,提供一系列的生命周期管理方法,比如queryObject查询对象,freeObject释放对象,removeTimeoutObj移除超时对象等等。还有很重要的两个方法就是:管理器提供对基础对象锁定lockObject和解锁unlockObject方法,用来解决在有并发操作时候的问题。
1.6 业务层
业务层按照Module模块进行划分。模块这里有几个典型接口:
网络协议处理这里后期我们又添加了注解代替注册来减少出错几率。如图:
1.7 日志
日志使用self4j + log4j。基础组件使用log4j的DailyRollingFileAppender来记录行为日志按照天为单位进行文件分割。一些功能性的日志比如异常之类的也是一样的机制。
2. 核心循环
核心循环:
这个时序图很简单,介绍的是引擎组件的心跳时序,大概机制跟下面介绍到的实体Player和Manager跟对应的线程绑定,然后由指定线程触发实体的心跳的机制是一样的,结合着看。
3. 核心时序
核心时序:
时序图介绍的是一次网络消息的处理流,这里不详细介绍,可以结合底下优点部分的分析一起看。
4. 其它服务
相对完善的周边服务:
5. 架构优点
并发处理方式
6. 更好的结构