Giter VIP home page Giter VIP logo

cellmesh_demo's Introduction

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

  • 侦听端口自动分配

    Service默认启动时以地址:0启动,网络底层自动分配端口,由cellmesh将服务信息报告到服务发现

    其他Service发现新的服务进入网络时,根据需要自动连接服务

Agent(网关)

frontend(前端)

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

  • 使用心跳+底层断开通知确认User断开

  • 客户端断开时通知后台服务器(ClientClosedACK消息)

backend(后端)

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

  • 后台认证

    后台服务通过BindBackendACK消息,将后台连接与客户端绑定,客户端固定将对应消息发送到绑定的后台服务器.

  • 后台断线重连

    后台服务断开重连时,自动维护连接,保证客户端正常收发后台消息

routerule(路由规则)

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

  • 阻断(不填写RouteRule)

    消息被路由阻断,无法发送到后台服务器

  • 通透(RouteRule=pass)

    消息始终被路由到后台服务器

  • 后台认证(RouteRule=auth)

    消息需要后台认证后才可被路由

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

  • login

    登录服, 短连接获取服务器列表及平台验证, 通过JWT生成token交由客户端

  • game

    养成服, 网关后负责养成逻辑,使用客户端上传的JWT token验证客户端身份

  • agent

    网关, 负责与客户端保持长连接,通过心跳处理客户端连接生命期, 客户端消息转发

  • hub

    中转, 处理服务器人数负载, 使用模式为订阅分发模式,处理跨服通知

  • client

    模拟客户端, 模拟客户端逻辑

开发进度

  • 基于Consul的服务发现及Watch机制
  • 网关基本逻辑
  • 带服务发现的连接器,侦听器
  • 网关会话绑定
  • 服务发现Consul的KV封装
  • 网关路由规则生成,上传和下载
  • 系统消息响应入口
  • 网关广播
  • 网关心跳处理
  • 频道订阅发布hub
  • 服务在线人数更新及连接选择
  • 支持WebSocket网关及登录协议
  • 登录服务器,JWT验证
  • 玩家数据读取
  • 游戏服务器,成长逻辑,花钱升级等级
  • 社交服务器,聊天逻辑
  • 机器人

参考及使用建议

由于本框架尚在开发中,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

cellmesh_demo's People

Contributors

davyxu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cellmesh_demo's Issues

没有正常的例子

能不能有一个正常的登录流程,client连接固定ip的gate,把服务注册框架独立出来

game里 model.SessionToUser(ev.Session()) nil

agent里 bind
但是game里没有看到bind的地方
所以 model.SessionToUser(ev.Session())为空?
这是什么问题?

我刚才看了下原始代码,Handle_Game_VerifyREQ 里没有model.SessionToUser(ev.Session())
实际上我是想通过user携带用户数据到游戏服务里去,
只能通过gametoken 自己在外面存储?

hub的中转消息

hub的chanByName保存了订阅对应关系,可是我该怎么向hub发送消息,然后转发到其他server呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.