资源地址:---------------------------------------------------------------------
https://github.com/sanikoyes/skynet/tree/vs2013
skynet地址: https://github.com/cloudwu/skynet
云风skynet博客:http://blog.codingnow.com/eo/skynet/
编译vs2013项目的pbc及lua绑定:
添加工程到vs2013的skynet项目中
将项目改名为protobuf
将3rd\pbc-master\binding\lua53\pbc-lua53.c添加到工程中
参照其它dll库项目设置输出为dll,扩展名为.so
添加protobuf.def并设置模块定义文件为protobuf.def
在protobuf.def中设置导出函数luaopen_protobuf
设置:右键选择pbc项目->右键菜单选择工程属性->通用属性->引用->添加新引用->选择lua53->确定
将编译出的protobuf.so复制到luaclib下
将3rd\pbc-master\binding\lua53\pbc-lua53复制到lualib目录中
linux编译部署:(centoros7)
下载skynet源码(git clone https://github.com/cloudwu/skynet.git)并解压,编译:make 'linux'
报错:依赖git
解决:装git
报错:依赖jemalloc
解决:下载jemalloc:https://github.com/jemalloc/jemalloc,保存到skynet/3rd/jemalloc/
报错:依赖autoconf
解决:安装autoconf:configure make make install
出错:configure: error: no acceptable m4 could be found in $PATH.
解决:安装m4
wget -O m4-1.4.9.tar.gz http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
tar -zvxf m4-1.4.9.tar.gz
cd m4-1.4.9
./configure
make
make install
出错:Can't locate Data/Dumper.pm in @INC (@INC contains:
解决:yum install 'perl(Data::Dumper)'
报错:lua.c:83:31: fatal error: readline/readline.h: No such file or directory
解决:下载readline:ftp://ftp.cwru.edu/pub/bash/readline-7.0.tar.gz,configure make make install
运行测试:./skynet examples/config
skynet框架:---------------------------------------------------------------------
skynet.pack/unpack:
pack(...) 用默认的 lua 类型打包一个消息,返回可供内部调用的指针和长度。
packstring(...) 用默认的 lua 类型打包一个消息,返回一个 lua 字符串。
unpack(msg [, sz]) 将 pack 或 packstring 打包的消息解包,若没有 sz 则 msg 必须为一个 lua 字符串 。
tostring(msg, sz) 将一个指针和长度定义的消息包转换成一个字符串。
netpack.pack/filter/tostring:
2字节长度+包内容格式打包和解包
string.pack (fmt, v1, v2, ···)
返回一个打包了(即以二进制形式序列化) v1, v2 等值的二进制字符串。 字符串 fmt 为打包格式(参见 §6.4.2)。
游戏框架:---------------------------------------------------------------------
在mysql中创建3个数据库, 分别是center, game, gamelog
harbor = 0 --0-单点 1-master slave
使用cluster+单节点架构模式
main_db服务:一个redis_serv服务池
mysql_db服务:一个mysql_serv和mysql_log_serv服务池
服务器类型
1.
网关服。 客户端入口点, 数据转发。 数据包解析等
2.
协调服。 管理所有游戏房间的服务器
3.
登陆服。 负责验证用户的有效性
4.
房间服。 游戏逻辑服务器,
1)
按应该场景分: 金币房, 私人房(房卡),比赛房等。 第一版实现 私人房功能
2)
每类场景分游戏: 麻将、牛牛、斗地主等。
3)
各游戏又可以开设多个房间。
如: 麻将1号金币房, 麻将2号金币房…
麻将1号私人房, 麻将2号私人房…
麻将比赛房…
房局基本流程:
1.
玩家登陆游戏: 获取玩家的个人信息、游戏房间列表(房间ID、房间类型、游戏类型等数据)
2.
玩家创建房间: 根据请求创建的游戏类型, 选择房间服(同类型游戏房间会有多个的情况,需要做负载均衡)->创建游戏桌子TABLE -> 选择位置(坐下)
3.
玩家加入房间: 根据房间号,选择对应的房间服->查询空位置->坐下
4.
满足游戏要求, 如果3人房,只有三个玩家进入房间并准备好,即开始游戏。
5.
游戏过程
6.
游戏结束, 通知玩家游戏结束, 将需要修改的玩家信息更新到数据库。 并等待玩家准备下一局游戏。 所有玩家都准备好后,重复 4-6步操作
7.
房局结束判断. 根据设定的总局数为判断条件,完成的局等于总局数,第6步不在继续下一局,发送局结算消息。 并将房间内的所有玩家 起立,及执行离开房间。
这里房卡模式, 金币, 比赛。 基本上都差不多的流程
负责对外连接,和解码后根据命令分发到其它进程的的是gate_server。
center_server监控所有结点,gate_server要根据它的监控结果取到可用的结点。
其它的server都是业务级别的server,没有什么特殊性。
这套源码是分布式部署的,也可以布在同一台机器上
---------------------------------------------------------------------------------------------------------
问题列表:
启动异常:可能是重复启动了两个进程
协议报错:可能因协议修改了未重新make
客户端连接不上服务器:服务器有另一个进程未真正退出,可通过监听端口查询是否仍有监听网关服监听端口
启动后短时间内未报错但感觉未启动完全:可能数据库连接失败,是否mysql未启动?或数据库服务器ip地址有变?不可访问
启动后屏幕看不到信息:可能日志服务启动失败,配置文件中luaservice值是否包含了日志服务所在路径,另外,日志服务中是否require了未包含在lua_path范围内的文件,可以在日志服务文件里用print函数来跟踪调试
能看到少量日志信息,可能为端口被占用,通过命令排除所有skynet需要使用的端口(主要为config文件中及我们程序自己私有的端口)是否被占用,windows下命令为:netstat -ano|findstr
注意:config中standalone和master如果被使用,则其ip(0.0.0.0包含具体ip)及端口号必须一至
查内存问题:
云风:
https://github.com/cloudwu/skynet/issues/682
定义 MEMORY_CHECK https://github.com/cloudwu/skynet/blob/master/skynet-src/malloc_hook.c#L13
以及定义 LUA_USE_APICHECK https://github.com/cloudwu/skynet/blob/master/3rd/lua/luaconf.h#L696-L702
然后再查。
杭州-Roc:
我之前弄过一个处理单个 lua_State crash时的栈处理
https://github.com/rocaltair/lua-coredump