一个人做游戏,服务器的开发也就成了必然的事情
选择服务器框架Skynet
选择skynet的原因不仅仅是因为云风是我的偶像,也有一下几个原因
轻量级,会lua就可以开发游戏逻辑
有成熟的项目先例
性能高效,可分布式
配置开发环境
本人用mac开发,windows建议安装Linux虚拟机进行开发
配置 Skynet
clone Skynet下来,进入目录,运行make macosx命令
配置 Mysql
下载Mysql
$ brew install mysql
启动Mysql
$ brew services start mysql
$ mysql_secure_installation
按照提示设置用户和密码继续
$ mysql -uroot -p
输入密码后成功链接mysql
测试
test目录下有一个testmysql.lua 创建一个‘skynet’ database 并且配置好用户密码测试,这时有个链接问题
Client does not support authentication protocol requested by server
解决办法如下:
方案一
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '831015';
FLUSH PRIVILEGES;
root是用户名,localhost是ip地址127.0.0.1都是特指本机,mysql_native_password是旧的密码验证机制,831015是密码,最后别忘了分号;
运行testmysql.lua 链接成功
方案二
修改mysql配置文件:
[mysqld]
default_authentication_plugin=mysql_native_password
Redis 和 Mysql数据同步方案
整体思路
玩家登录后读取Mysql数据缓存到Redis中,逻辑操作再redis中进行,断线后进行落地
Mysql表设计与必要信息
1. user //id自增的角色信息,用来标识玩家
2. money //主键为user id 做游戏,货币是必须的
3. snode //记录服务器信息,包括版本更新迭代信息
4. role //一人多号,id自增
5. item //主键为role id
Redis表设计与Mysql映射
redis数据使用hashmap存储与sql表的关系,以表名+分隔符+数据唯一id作为key来存储
譬如说这条信息'role':${uid}:${rid},其中role为代表role表,${uid}代表此玩家uid作为可变参数${rid}作为此角id可变参数,玩家使用uid与rid作为逻辑参数,服务器查询redis库进行查询验证操作
实现方式
因为要修改redis表并且将redis中的数据落地到Mysql中,所以要增加必要的格式检查以免程序操作失误引起意外
服务器启动时候分析MySQL表结构,将表结构信息缓存在全局常量里
修改redis使用刚才分析的表数据统一进行格式验证
落地操作进行日志跟踪
注意
服务器架构部署方案
使用框架自带的watchdog服务+游戏类服务
部署设计思路
watchdog负责管理连接,从client开始连接到生成agent之前的socket data通信数据,转发到SignInServer进行处理,完成后通知watchdog创建客户端agent并保存,agent是客户端代理,因为lua虚拟机天然的优秀隔离,用户自身状态保存在这里,使用时候取用。所有业务逻辑被agent转发处理并回执,agent收到回执发给客户端完成整个通信声明周期
watchdog服务
修改了watchdogsocket data部分,游戏连接握手使用socket data进行转发给SignInServer(自己实现的注册服务)
游戏类服务
IDServer
SignInServer
DaoServer
LogicServer
IDServer
全局的
可分布式的
无状态
生成guid是门技术,单独取出维护,方便以后拓展优化,因为精力有限,目前方式是开了一个协程周期(每分钟)更新随机种子,使用uuid进行id的生成
SignInServer
全局的
可分布式的
无状态
路由保存在watchdog中,每个客户端连接后分配一个物理SignInServer服务器(可以本机,取决于自己),处理客户端连接握手部分,使用状态机进行状态驱动,处理客户端socket连接后数据,设置好超时时间,处理注册和自动登录逻辑
DaoServer
全局的
可分布式的
无状态
负责客户端上线后的MySql数据拉取到Redis与断线后Redis的落地到MySql操作
LogicServer
全局的
可分布式的
无状态
负责游戏逻辑,玩家状态通过询问agent获取处理,如果是复杂玩法(如多人副本)可以新增一个有状态服务进行拓展,不过有状态服务要分布式的话要维护好与agent的连接关系
结束语
耗时三个月零零散散终于把自己的服务器部分完整了(。・∀・)ノ,已经开始做小游戏了,使用Unity,有完整的热更流程,有完整的服务器部分,程序只有我自己,光杆司令,确实是比较累的,不过我会坚持的。万一财富自由了呢
ε=ε=ε=( ̄▽ ̄)
PS:欢迎评论(。^▽^)