代码拉取完成,页面将自动刷新
分布式游戏服务器框架
玩家数据落地使用mongodb(支持扩展为mysql),玩家上线时,从mongodb拉取玩家数据,玩家下线时,把玩家数据保存到mongodb
缓存使用redis,玩家在线期间修改的数据,即时保存到redis,防止服务器crash导致数据丢失
gserver提供了数据绑定的方案,业务层只需要标记哪些数据需要保存,无需自己写代码操作数据库
使用go的struct tag,设置对象组件的字段,框架接口会自动对这些字段进行数据库读取保存和缓存更新,极大的简化了业务代码对数据库和缓存的操作
设置组件保存数据
// 玩家的一个组件
type Money struct {
PlayerDataComponent
// 该字段必须导出(首字母大写)
// 使用struct tag来标记该字段需要存数据库,可以设置存储字段名(proto格式存mongo时,使用全小写格式)
Data *pb.Money `db:"money"`
}
//调用player.SaveDb()会自动把Money.Data保存到mongo,保存时会自动进行proto序列化
//调用player.SaveCache()会自动把Money.Data缓存到redis,保存时会自动进行proto序列化
支持明文方式保存数据
// 玩家基础信息组件
type BaseInfo struct {
PlayerDataComponent
// plain表示明文存储,在保存到mongo时,不会进行proto序列化
Data *pb.BaseInfo `db:"baseinfo;plain"`
}
支持组合模式
// 玩家的任务组件
type Quest struct {
BasePlayerComponent
// 保存数据的子模块:已完成的任务
Finished *FinishedQuests `child:"finished"`
// 保存数据的子模块:当前任务列表
Quests *CurQuests `child:"quests"`
}
// 已完成的任务
type FinishedQuests struct {
BaseDirtyMark
Finished []int32 `db:"finished;plain"`
}
// 当前任务列表
type CurQuests struct {
BaseMapDirtyMark
Quests map[int32]*pb.QuestData `db:"quests"`
}
支持自动注册消息回调
// 客户端发给服务器的完成任务的消息回调
// 这种格式写的函数可以自动注册客户端消息回调
func (this *Quest) OnFinishQuestReq(reqCmd gnet.PacketCommand, req *pb.FinishQuestReq) {
// logic code ...
}
// 这种格式写的函数可以自动注册非客户端的消息回调
func (this *BaseInfo) HandlePlayerEntryGameOk(cmd gnet.PacketCommand, msg *pb.PlayerEntryGameOk) {
// logic code ...
}
每个玩家分配一个独立的逻辑协程,玩家在自己的逻辑协程中执行只涉及自身数据的代码,无需加锁
安装mongodb
安装redis,单机模式和集群模式均可
修改config目录下的配置文件
编译运行
测试客户端gtestclient
https://github.com/uber-go/guide
https://github.com/xxjwxc/uber_go_guide_cn
QQ群: 764912827
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。