Leaf 模块详解
LeafServer 中包含了 3 个模块,它们分别是:
- gate 模块,负责游戏客户端的接入
- login 模块,负责登录流程
game 模块,负责游戏主逻辑一般来说(而非强制规定),从代码结构上,一个 Leaf 模块:
放置于一个目录中(例如 game 模块放置于 game 目录中)
- 模块的具体实现放置于 internal 包中(例如 game 模块的具体实现放置于 game/internal 包中)每个模块下一般有一个 external.go 的文件,顾名思义表示模块对外暴露的接口,这里以 game 模块的 external.go 文件为例:
- package game
- import (
- "server/game/internal"
- )
- var (
- // 实例化 game 模块
- Module = new(internal.Module)
- // 暴露 ChanRPC
- ChanRPC = internal.ChanRPC
- )
首先,模块会被实例化,这样才能注册到 Leaf 框架中(详见 LeafServer main.go),另外,模块暴露的 ChanRPC 被用于模块间通讯。
进入 game 模块的内部(LeafServer game/internal/module.go):
- package internal
- import (
- "github.com/name5566/leaf/module"
- "server/base"
- )
- var (
- skeleton = base.NewSkeleton()
- ChanRPC = skeleton.ChanRPCServer
- )
- type Module struct {
- *module.Skeleton
- }
- func (m *Module) OnInit() {
- m.Skeleton = skeleton
- }
- func (m *Module) OnDestroy() {
- }
模块中最关键的就是 skeleton(骨架),skeleton 实现了 Module 接口的 Run 方法并提供了:
- ChanRPC
- goroutine
- 定时器