davyxu / cellmesh_demo

cellmesh game server framework demo
50 stars 25 forks source link

MIT licensed GoDoc

cellmesh demo

基于cellmesh框架的游戏服务器demo

cellmesh服务器框架

本Demo使用的cellmesh框架请参考

https://github.com/davyxu/cellmesh

运行Demo

使用go module管理源码依赖, 所以确保go版本在1.12以上

请确认cellmesh_demo的工程结构为

任意文件夹\github.com\davyxu\cellmesh_demo

准备服务发现

服务发现系统用于记录已经运行的服务的基本信息,如: IP、内网端口、外网端口等。

服务器发现同时也是一个高性能的KV数据库,可以用于保存配置,实现配置的自动分发。
    # 在cellmesh_demo根目录启动服务器发现 以下shell会自动编译和运行服务发现服务
    go run github.com/davyxu/cellmesh/discovery/memsd -datafile=persist.json

更新协议及上传路由规则

执行下面指令更新路由规则到服务发现

    cd proto
    sh ./MakeProto.sh

启动demo服务

按照下面shell分别启动login, agent, game, hub 服务

    # 在cellmesh_demo根目录启动以下服务

    go run github.com/davyxu/cellmesh_demo/svc/hub

    go run github.com/davyxu/cellmesh_demo/svc/login

    go run github.com/davyxu/cellmesh_demo/svc/agent

    go run github.com/davyxu/cellmesh_demo/svc/game

确认服务器启动完成后,启动模拟客户端

    go run github.com/davyxu/cellmesh_demo/svc/client

启动client后,可在命令行中输入文字作为聊天内容发送

概念

Service(服务)

一个Service为一套连接器或侦听器,挂接消息处理的派发器Dispatcher

Agent(网关)

frontend(前端)

与客户端连接的前端通信的侦听器

backend(后端)

与后台服务器通信的侦听器

routerule(路由规则)

在proto文件中,消息的RouteRule属性描述如何路由消息到指定的后台服务器

Connection Management(连接维护)

从服务发现的服务信息,创建到不同服务间的长连接。同时在这些连接断开时维护连接

逻辑中根据策略从已有连接及信息选择出连接与目标通信,例如:选择负载最低的一台游戏服务器

目录结构

demo
   basefx
     项目专有框架封装,不跨项目共享
   cfg
     开发阶段的快速配置
   proto
     协议文件,协议生成代码。
   svc
     login
       登录,用户的固定接入入口,通过login拿到agent地址,让用户连接到agent(做了一个负载均衡的简易策略,获取人数最少的agent)。
     agent
       代理,可以启动多个,agent后面有挂载的服务,如game。
     hub
       中心服务,各服务的状态,通过发布和订阅的形式,由hub做中转共享,如在线人数等。
     game
       业务逻辑服务,处理通过agent转发过来的协议。
tool   
   routegen
      路由配置生成器。生成的配置可由agent动态读取并更新路由规则。
util
   所有框架通用的工具代码。

demo工程架构

arch

开发进度

参考及使用建议

由于本框架尚在开发中,demo在不断完善添加新功能. 因此响应的接口和设计会经常性发生变化.

Tips

为什么使用memsd的服务发现替换consul?

早期版本的cellmesh使用consul作为服务发现,cellmesh使用主动汇报服务信息的方式保证consul中能及时更新服务信息。 但实际使用中发现有如下问题:

  1. 偶尔出现高CPU占用,Windows休眠恢复后也会造成严重的高CPU现象。
  2. consul的API并没有本地cache,需要高速查询时,并没有很好的性能。
  3. 多服更新时没有原子更新,容易形成严重的不同步现象。
  4. 依赖重,代码量巨大,使用vendor而不是go module方式管理代码,编译慢。 基于以上考虑,决定兼容服务发现接口,同时编写对游戏服务友好的发现系统:memsd。

友情提示: demo工程仅是随框架附带的实例代码,建议将demo为蓝本建立自己的工程蓝本。

备注

感觉不错请star, 谢谢!

知乎: http://www.zhihu.com/people/sunicdavy

提交bug及特性: https://github.com/davyxu/cellmesh/issues