cellmesh
基于cellnet的游戏服务框架
特点
Based On Service Discovery(基于服务发现)
通过服务发现自动实现服务互联,探测,挂接.无需配置服务器间的端口.
Cloud Config File(云配置文件)
任何服务器配置均通过服务发现的KV存取,本地不保存配置,更新配置更为方便
Code Generation(代码生成)
基于github.com/davyxu/protoplus的代码生成技术,迅速粘合逻辑与底层,代码好看易懂且高效.
使用更简单更强大的schema编写协议, 并自动生成protobuf schema.
Transport based on cellnet(基于cellnet的网络传输)
提供强大的扩展及适配能力.
使用cellmesh
cellmesh 使用go module管理源码依赖, 所以确保go版本在1.12以上
下载cellmesh源码
go get github.com/davyxu/cellmesh
cellmesh demo
demo工程请参见
https://github.com/davyxu/cellmesh_demo
Demo包含服务进程及工具配套等
服务发现(memsd)
服务启动方法
go run github.com/davyxu/cellmesh/discovery/memsd
服务启动参数
-
datafile 开启持久化,默认每隔1分钟将内存数据落地到指定的datafile中,格式为JSON
-
addr 按给定的地址侦听,例如memsd -addr=localhost:9099
memsd客户端功能
客户端通用参数
- addr 连接指定地址的服务发现, 例如:-addr=localhost:9099
查看注册的服务
go run github.com/davyxu/cellmesh/discovery/memsd -viewsvc
清空注册的服务
go run github.com/davyxu/cellmesh/discovery/memsd -clearsvc
查看配置的key
go run github.com/davyxu/cellmesh/discovery/memsd -viewkey
获取配置值
go run github.com/davyxu/cellmesh/discovery/memsd -getvalue <key>
设置配置值
go run github.com/davyxu/cellmesh/discovery/memsd -setvalue <key> <value>
删除配置值
go run github.com/davyxu/cellmesh/discovery/memsd -deletevalue <key>
清空配置
go run github.com/davyxu/cellmesh/discovery/memsd -clearvalue
概念
Service(服务)
一个Service为一套连接器或侦听器,挂接消息处理的派发器Dispatcher
-
侦听端口自动分配
Service默认启动时以地址:0启动,网络底层自动分配端口,由cellmesh将服务信息报告到服务发现
其他Service发现新的服务进入网络时,根据需要自动连接服务
Connection Management(连接维护)
从服务发现的服务信息,创建到不同服务间的长连接。同时在这些连接断开时维护连接
逻辑中根据策略从已有连接及信息选择出连接与目标通信,例如:选择负载最低的一台游戏服务器
目录结构
discovery
kvconfig
配置的快速获取接口。
memsd
面向游戏优化的服务发现实现。
service
服务通信基础,以及服务发现封装。
tool
protogen
协议生成器,生成Go的消息绑定以及消息响应入口。
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格式(参考 LocalFlag),作为进程的命令行参数
Tips
为什么使用memsd的服务发现替换consul?
早期版本的cellmesh使用consul作为服务发现,cellmesh使用主动汇报服务信息的方式保证consul中能及时更新服务信息。 但实际使用中发现有如下问题:
- 偶尔出现高CPU占用,Windows休眠恢复后也会造成严重的高CPU现象。
- consul的API并没有本地cache,需要高速查询时,并没有很好的性能。
- 多服更新时没有原子更新,容易形成严重的不同步现象。
- 依赖重,代码量巨大,使用vendor而不是go module方式管理代码,编译慢。 基于以上考虑,决定兼容服务发现接口,同时编写对游戏服务友好的发现系统:memsd。
备注
感觉不错请star, 谢谢!