选择Skynet+Redis+Mysql作为游戏服务器框架

一个人做游戏,服务器的开发也就成了必然的事情

选择服务器框架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中,所以要增加必要的格式检查以免程序操作失误引起意外

  1. 服务器启动时候分析MySQL表结构,将表结构信息缓存在全局常量里
  2. 修改redis使用刚才分析的表数据统一进行格式验证
  3. 落地操作进行日志跟踪

注意

服务器架构部署方案

使用框架自带的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:欢迎评论(。^▽^)

参考

posted on 2020-04-16 14:00  点赞机器人  阅读(2397)  评论(1编辑  收藏  举报