Leaf 服务器的设计
Leaf专注于游戏服务器,因此与一些Web服务器开发的设计和考虑有所不同。在一些游戏服务器中,采用的是分布式架构,即服务器整体被划分为不同的模块,各个模块承担不同的功能,而模块之间通过TCP进行交互。这样的架构能够保证服务器能够在多台机器上部署,单点故障不至于让服务整体崩溃。但是这种服务器有其自身的开发难度,而且有时候做好模块划分并不容易。Leaf是一体式的框架,连最外围的接入服务器也被整合在一起。虽然Leaf中间也划分了不同模块,但是他们是通过InnerRpc进行通讯的。介于现在手游兴起,单机性能提升,不少游戏服务器所需要的性能并不十分苛刻,所以Leaf在这方面的简洁与易于开发有很大的优势。
与一些Web服务器不同,Leaf运行的数据绝大部分都在内存里面,虽然提供了Mongo模块,但是做实时交互的数据一般是保存在内存中的。Mongo只是为了持久化一些用户数据。这与有些无状态,靠数据库做数据交互的Web服务器有很大不同。
Leaf 服务器的主要模块
ChanRpc
Rpc
是远程过程调用的简称,原来是通过Tcp手段使得一个本地的函数调用,将调用信息传递给其他服务器执行,并通过Tcp返回结果的一种技术手段,在分布式中,这种调用十分常见。但是这里的ChanRpc
是在不同协程中进行函数调用,其实现的手段是Chan
,所以成为ChanRpc
。你可以将不同的功能模块实现为ChanRpc
并提供给其他模块调用。
Cluster
Cluster
主要是管理集群,但是Leaf本身专注的还是单机服务,所以这个模块的功能现在还没有实现。
Conf
Conf
是Leaf的配置管理模块。里面主要是Leaf启动的一些必要信息。
Console
Console
模块为Leaf管理提供了一个终端接口,你可以使用Telnet连接上去动态的修改参数,或者指向命令。其内部实现了Help
, CpuProf
, Prof
命令,并提供扩展,可以方便的添加其他命令。另外,扩展命令是通过ChanRpc
实现的。
DB
DB
模块提供里Mongo
支持,也可以在这里聚合其他DB
模块。
Gate
Gate
模块为Leaf提供接入功能。这个模块的功能很重要,是服务器的入口。它能同时监听TcpSocket
和WebSocket
。主要流程是在接入连接的时候创建一个Agent
,并将这个Agent
通知给AgentRpc
。其核心其实是一个TcpServer
和WebScoketServer
,他的协议函数能够将socket
字节流分包,封装为Msg
传递给Agent
。其工作流可以查看Server
模块。
Go
Go
模块是对golang
中go
提供一些额外功能。Go
提供回调功能,LinearContext
提供顺序调用功能。
Log
Log
主要提供日志分级功能。
Module
Module
为Leaf提供模块化支持。Skeleton
是Leaf
的整体骨架,它聚合了Leaf
中其他一些异步调用模块的功能,使得各模块之间能够协同工作。
Network
Network
是Leaf的网络部分,这部分比较大,而且包含一个json
和protobuf
解包模块。
Recordfile
Recordfile
提供序列化和反序列化为文本的功能。
Timer
Timer
主要是提供一个Cron
功能的定时器服务,其中Timer
是time.AfterFunc
的封装,是为了方便聚合到Skeleton
中。
Leaf 服务器的其他设施
主要是util
提供的一些功能
deepcopy
经行深拷贝,建立数据快照,并同步到数据库中。
map
对原始map封装,提供协程安全的访问。
rand
对原始rand
的封装,提供一些高级的随机函数。
semaphore
用chan实现的信号量。