视频:
游戏主逻辑服务器
游戏服务器开发过程中,整个服务器的架构设计对于项目的影响是至关重要的,其中包括登录流程,消息机制流程,消息加密流程 内部服务器消息跳转,定时任务等。 centos 系统为例,给大家梳理下游戏架构的基础设计思想。
Index
返回首页
如何设计
流程分析
实例代码
注意事项
如何设计
1. 游戏主逻辑服务器会根据策划的需求不同而不同,大致包括:邮件、好友、排行榜、聊天等功能或者功能入口
2. 邮件系统可以直接将主逻辑写在游戏主逻辑服务器,而聊天系统游戏主逻辑则可以单独创建聊天服
3. 消息数量从经验上看,如果一款偏重度的游戏,消息量还是很多的,所以在消息设计上尽量共用
4. 游戏主逻辑服务器需要保存玩家的状态,主要是断线重连会用到
5. 游戏主逻辑服务器是唯一一个内网与DB反向代理通信的服务器,主要确保数据一致性
流程分析
1. 整个流程也比较简单,主要是主场景的逻辑,就是玩家进入主场景“所见功能” 2. 数据保存及读取必经服,拉取玩家数据等 3. 玩家状态的保存,断线重连会用到
实例代码
// 主函数 type Game struct { Connection *websocket.Conn StrMD5 string MapSafe *concurrent.ConcurrentMap } var ( cache *cache2go.CacheTable M *concurrent.ConcurrentMap ConnXZ *websocket.Conn ) func main() { conf.InitConfig() gamedb.DBInit() runtime.GOMAXPROCS(runtime.NumCPU()) http.Handle("/"+conf.GetConfig().Server.URL, websocket.Handler(BuildConnection)) if err := http.ListenAndServe(conf.GetConfig().Server.WSAddr, nil); err != nil { glog.Info("Entry nil", err.Error()) glog.Flush() return } } func BuildConnection(ws *websocket.Conn) { data := ws.Request().URL.Query().Get("_config") if data == "" { glog.Info("_config is Nil") glog.Flush() return } impl.InitConnection(ws) } // 注册函数 var addrXZ = flag.String("addrXZ", twlib_server.ProxyIp, "http service address") // 链接Proxy func init() { LollipopGo.Run() impl.IMsg = new(Game) cache = cache2go.Cache("Battle_Cache") M = concurrent.NewConcurrentMap() initGateWayNet() } func init() { url := "ws://" + *addrXZ + "/BaBaLiuLiu?data={ID:1}" conn, err := websocket.Dial(url, "", "test://golang/") if err != nil { glog.Errorln("err:", err.Error()) return } ConnXZ = conn // 发送保存链接 data := Proto_Proxy.G2Proxy_ConnData{ Protocol: twlib_proto.GameDataProto, Protocol2: Proto_Proxy.G2Proxy_ConnDataProto, ServerID: util.MD5_LollipopGO(strconv.Itoa(twlib_server.GameServerId)), } impl.PlayerSendToServer(conn, data) go GameServerReceive(ConnXZ) } func GameServerReceive(ws *websocket.Conn) { for { var content string err := websocket.Message.Receive(ws, &content) if err != nil { continue } glog.Info(strings.Trim("", "\"")) glog.Info(content) content = strings.Replace(content, "\"", "", -1) contentstr, errr := base64Decode([]byte(content)) if errr != nil { glog.Errorln(errr) continue } go SyncMeassgeFun(string(contentstr)) } } func SyncMeassgeFun(content string) { var r Requestbody r.req = content if ProtocolData, err := r.Json2map(); err == nil { HandleCltProtocolXL(ProtocolData["Protocol"], ProtocolData["Protocol2"], ProtocolData) } else { glog.Info("解析失败:", err.Error()) } }
注意事项
1. 启动顺序
以LollipopGo分布式游戏架构为例: 1. 需要在反向代理服启动后启动,主要此时游戏主逻辑服相对于反向代理服务器是客户端角色 2. 内网服启动顺序无先后,等级是平级
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
Golang语言社区
ID:Golangweb
www.GameAIs.Com
www.ByteEdu.Com
www.ByteEdu.Org
游戏服务器架构丨分布式技术丨大数据丨游戏算法学