LollipopGo:游戏主逻辑服务器

视频:

游戏主逻辑服务器    

游戏服务器开发过程中,整个服务器的架构设计对于项目的影响是至关重要的,其中包括登录流程,消息机制流程,消息加密流程 内部服务器消息跳转,定时任务等。 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

      游戏服务器架构丨分布式技术丨大数据丨游戏算法学

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值