前言
这段时间有空,正好有时间总结之前的东西。
框架
最早做棋牌,cpp的框架,后来又接触到了nodejs的,golang的框架,也看了一些网上开源的游戏框架,记录总结一下。
框架图:
-
LogicManger:这个框架是支持分区的,每个 logicManager Server管理着一组gate Server 和一组 GameLogic Server,代表一个区。LogicManager会根据游戏类型和分发策略把不同用户分到不同的GameLogic服务器上。
-
GameLogic:游戏逻辑处理服务器, 一个gameLogic 可以是支持一种游戏,也可以支持多种,logic Server启动后连接logicManager,注册自己的信息,包括可以支持哪种游戏等信息。
-
Gate: 是网关,直接和client连接,长连接。屏蔽后面的GameLogic,和LogicManager等服务器,保存用户socket等信息,根据用户状态和消息号区分客户端发过来的消息,分发到不同的服务器上(GameLogic和 logicManager)。
-
login: 登录服务器,主要处理用户登录,可以多个,直接连center服务器。login服务器没有具体处理逻辑,它会把用户登录信息转发给center服务器,然后再把消息回传给client服务器。收到其他消息会直接断开client连接。
-
center: 中心服务器,主要是管理多区manger的。保存用户基本信息,同时同步不同区用户信息变化。LogicManager会在center服务器注册自己的信息,包括manager管理的gate的id,ip:port 。
-
db: db数据库服务器,连接数据库,赋值读写数据库。
功能模块
接下来会通过细分讲解每个部分,因为每个服务器基础功能是通用的, 所以会先讲解通用基础模块,然后在每个服务器依次的讲解。
- 通用基础模块,分为 网络模块,数据库模块
- 服务器模块, login,gate,logic,manager ,center,db, 缓存模块
通用基础模块
网络模块
网络模块:底层用的是boost asio 网络模块。LSocket 类是对asio api的封装。
网络模型实际是多Reactor线程模式:
多Reactor线程模式将“接受客户端的连接请求”和“与该客户端的通信”分在了两个Reactor线程来完成。mainReactor完成接收客户端连接请求的操作,它不负责与客户端的通信,而是将建立好的连接转交给subReactor线程来完成与客户端的通信,这样一来就不会因为read()数据量太大而导致后面的客户端连接请求得不到即时处理的情况。并且多Reactor线程模式在海量的客户端并发请求的情况下,还可以通过实现subReactor线程池来将海量的连接分发给多个subReactor线程,在多核的操作系统中这能大大提升应用的负载和吞吐量。
关于接收到报文以后的处理流程会在消息协议的部分分析。