Leaf 模块详解

LeafServer 中包含了 3 个模块,它们分别是:

  • gate 模块,负责游戏客户端的接入
  • login 模块,负责登录流程
  • game 模块,负责游戏主逻辑一般来说(而非强制规定),从代码结构上,一个 Leaf 模块:

  • 放置于一个目录中(例如 game 模块放置于 game 目录中)

  • 模块的具体实现放置于 internal 包中(例如 game 模块的具体实现放置于 game/internal 包中)每个模块下一般有一个 external.go 的文件,顾名思义表示模块对外暴露的接口,这里以 game 模块的 external.go 文件为例:
  1. package game
  2.  
  3. import (
  4. "server/game/internal"
  5. )
  6.  
  7. var (
  8. // 实例化 game 模块
  9. Module = new(internal.Module)
  10. // 暴露 ChanRPC
  11. ChanRPC = internal.ChanRPC
  12. )

首先,模块会被实例化,这样才能注册到 Leaf 框架中(详见 LeafServer main.go),另外,模块暴露的 ChanRPC 被用于模块间通讯。

进入 game 模块的内部(LeafServer game/internal/module.go):

  1. package internal
  2.  
  3. import (
  4. "github.com/name5566/leaf/module"
  5. "server/base"
  6. )
  7.  
  8. var (
  9. skeleton = base.NewSkeleton()
  10. ChanRPC = skeleton.ChanRPCServer
  11. )
  12.  
  13. type Module struct {
  14. *module.Skeleton
  15. }
  16.  
  17. func (m *Module) OnInit() {
  18. m.Skeleton = skeleton
  19. }
  20.  
  21. func (m *Module) OnDestroy() {
  22.  
  23. }

模块中最关键的就是 skeleton(骨架),skeleton 实现了 Module 接口的 Run 方法并提供了:

  • ChanRPC
  • goroutine
  • 定时器