cellmesh

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 13, 2019 License: MIT Imports: 0 Imported by: 0

README

Build Status Go Report Card MIT licensed GoDoc

cellmesh

基于cellnet的游戏服务框架

特点

Based On Service Discovery(基于服务发现)

通过服务发现自动实现服务互联,探测,挂接.无需配置服务器间的端口.

Zero Config File(零配置文件)

任何服务器配置均通过服务发现的KV存取,无任何配置文件.

Code Generation(代码生成)

基于github.com/davyxu/protoplus的代码生成技术,迅速粘合逻辑与底层,代码好看易懂且高效.

使用更简单更强大的schema编写协议, 并自动生成protobuf schema.

Transport based on cellnet(基于cellnet的网络传输)

提供强大的扩展及适配能力.

运行Demo

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

下载cellmesh源码

    go get -u -v github.com/davyxu/cellmesh

准备第三方包

    # 转到cellmesh的shell目录
    cd github.com/davyxu/cellmesh/shell
    sh ./DownloadThirdParty.sh

准备服务发现

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

服务器发现同时也是一个高性能的KV数据库,可以用于保存配置,实现配置的自动分发。
    # 转到cellmesh的shell目录
    cd github.com/davyxu/cellmesh/shell

    # 这里会自动编译和运行服务发现服务
    sh ./StartDiscovery.sh

更新协议及上传路由规则

执行下面指令更新路由规则到Consul

    cd github.com/davyxu/cellmesh/demo/proto
    sh ./MakeProto.sh

启动demo服务

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

    cd github.com/davyxu/cellmesh/shell

    sh ./RunDemoSvc.sh login

启动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转发过来的协议。
discovery
   consul
      consul的服务发现实现及底层封装(不再维护,请换用memsd)。
   kvconfig
      配置的快速获取接口。
   memsd
      面向游戏优化的服务发现实现。
service
   服务通信基础,以及服务发现封装。
shell
   框架通用的shell脚本。
tools
   protogen
      协议生成器,生成Go的消息绑定以及消息响应入口。
   routegen
      路由配置生成器。生成的配置可由agent动态读取并更新路由规则。
util
   所有框架通用的工具代码。

服务参数

service包为服务进程提供命令行参数支持。服务进程的命令行参数同时也可以使用FlagFile像使用配置文件一样批量设置进程配置(参考demo/cfg/LocalFlag.cfg)

详细参数说明如下:

  • sdaddr

    指定服务发现服务器(memsd)地址, 通过服务发现,服务器可以快速获取配置以及其他可连接服务器地址,实现服务互联.

  • svcgroup

    指定服务器分组. 一般情况下,认为一台物理机归属于一个svcgroup. 当然,也可以在一台物理机上放置多个分组,比如开发阶段.

    服务器分组也能方便服务器打包以及定位服务器位置.

  • svcindex

    指定服务器索引, 标识同类服务器的多个不同进程,同类中的svcindex必须唯一,逻辑上,svcindex还会与uuid关联.

  • wanip

    指定服务器所在物理机的外网IP,方便通知客户端要连接的IP,例如:login通知客户端game的外网IP.

  • logcolor

    对日志着色, 规则参见github/davyxu/golog中的color.go, 写入文件时,请关闭此选项,避免日志中出现着色字符.

  • logfile

    将日志写入文件,并不再输出到控制台.

  • logfilesize

    指定输出日志文件单个大小,可使用B/M/G标识, 注意: golog默认不是rolling方式,日志会写入到尾数最大的日志文件.

  • loglevel

    指定日志输出级别, 格式 日志名|级别, 日志名支持正则表达式, 级别可以为error, info等

  • mutemsglog

    屏蔽指定消息的日志,多个消息使用'|'分割

  • flagfile

    使用FlagFile格式(参考demo/cfg/LocalFlag.cfg),作为进程的命令行参数

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, 谢谢!

开源讨论群: 527430600 验证请发cellmesh

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

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

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
demo
proto
Generated by github.com/davyxu/protoplus DO NOT EDIT!
Generated by github.com/davyxu/protoplus DO NOT EDIT!
memsd/proto
Generated by github.com/davyxu/protoplus DO NOT EDIT!
Generated by github.com/davyxu/protoplus DO NOT EDIT!
tools

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL