go-game-server
go-game-server copied to clipboard
game server by golang
使用golang开发的框架
How?
- 参考 main.go
Features
kernel使用 channel 和 goroutine 模拟的Actor模式
- 使用
channel模拟的消息队列 kernel.Context内部实现了一个ringbuf,用于发起call的时候,由于自身channel满,导致双向阻塞
乞丐版otp框架,核心package:kernel
- 提供了简略版的
supervisor - 提供类型
gen_server的进程回调 - 内置
logger模块 - 支持local名字注册
- 支持进程
link - 内置全局定时器
timer - 提交交互式命令行工具,你可以自己开发自己的
debug命令
框架提供一种热更新方案
-
详情请参考
hotfix相关代码 -
how to use?
- 参考
hotfix/20210119/20210119.go编写更新代码,编译通过后
./gshell -node [email protected] -cookie 6d27544c07937e4a7fab8123291cc4df -cmd "reload 20210119"- 你也可以通过启动交互命令行环境进行更新
- 参考
-
其中
reload的逻辑由main.go中的func reload(echo func(s string), commands []string) string提供
内置mysql支持
- 引用如下代码开始使用
import ( "github.com/liangmanlin/gootp/db" ) tabSlice := []*db.TabDef{ {Name: "account", DataStruct: &global.Account{}, Pkey: []string{"Account"}, Keys: []string{"AgentID"}}, } db.Env.DBConfig = db.Config{Host: "127.0.0.1", Port: 3306, User: "root", PWD: "123456"} db.Start(tabSlice, "dbName", "logDbName")
内置一种定长协议
-
定义文件:
global/pb_def.gotype LoginTosLogin struct { // router:LoginLogin Account string } type LoginTocLogin struct { ID int32 Name string F float32 M map[int32]int32 S []string } -
核心实现package:
github.com/liangmanlin/gootp/gate/pb -
辅助工具:
tool/pbBuild -
router是工具生成的,仅仅提供路由到player包的函数 -
目前可以到处lua代码直接使用(仅支持lua5.3及以上版本)
- 使用如下脚本到处lua代码
%% 假设在game目录 tool\bin\pbBuild.exe -f ./global/pb_def.go -c client -
项目内 require 所有导出文件;接着可以如下:
local function test() local tos = LoginTosLogin() local sendBuf = tos.encode() -- 然后你可以同网络发送这个sendBuf到服务器 -- 假设接收到服务器发来的数据 local recBuff ---@type LoginTocLogin local proto,protoID = ProtoDecode(recBuff) -- proto即为解析到的对象 local a = proto.F end
框架内置一个网关:gate
-
通过如下方式启动
import "github.com/liangmanlin/gootp/gate" gate.Start(flag string, handler *kernel.Actor, port int, opt ...interface{}) -
建议结合内置的定长协议使用
2021.1.28 添加分布式多节点支持
- 目前不支持在windows中运行多节点
Pid支持跨节点传输- 你可以往另外一个节点发送一个本地
pid,然后在那个节点上调用call和cast
- 你可以往另外一个节点发送一个本地
- 向一个远程节点发送数据需要先定义协议,例如:
import "game/node" // 目前尚未找到一种可以直接发送对象的办法,所以这个是一种妥协 // 即使使用grpc,也是要定义一个proto,所以依然选择使用内置协议,减少一层转换 nodeProto := []interface{}{&global.TestCall{},&global.StrArgs{},&global.RpcStrResult{}} Cookie := "6d27544c07937e4a7fab8123291cc4df" node.Start(global.Root, "[email protected]", Cookie, nodeProto) // 更推荐使用命令行方式启动 node.StartFromCommandLine(nodeProto) - 支持
RpcCall- 目前是单线程执行的,如果执行的函数会阻塞,尽量不要使用
- 需要自行调用
node.RpcRegister(fun string,function RpcFunc)注册
2021.2.23 添加excel配置文件支持
-
具体使用参考 Excel/Effect.xlsm 配置文件
- 如需导出配置,请双击
Excel/_打包单个配置.bat
- 如需导出配置,请双击
-
支持热更新配置
## 以热更 Skill 配置为例 ./gshell -node [email protected] -cookie 6d27544c07937e4a7fab8123291cc4df -cmd "reload_config Skill"
2021.4.1 抽离大部分公共代码到一个代码仓库,命名为 gootp
- 同时移除原来使用一个函数对象结构体的做法,直接使用包的全局变量代替导出函数, 这样也可以达到热更新的目的,并且代码编写会轻松一点
Problem
- 为了热更新,框架使用起来比较繁琐,期待有人提出更好的优化方案
- 为了热更新,框架使用大量全局变量、函数指针,会降低函数的执行效率
gate的实现是直接使用net包实现的,为了异步接收数据,开启了一个goroutine,后续是优化方向
Future
db添加缓存