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

本文介绍了一个人开发游戏服务器时选择Skynet作为框架的原因,包括其轻量级、成熟项目和高性能等优点。详细阐述了配置Skynet、Mysql的过程,解决Mysql连接问题的方法,并提出了Redis和Mysql数据同步方案。还讨论了服务器架构部署,包括watchdog服务、游戏类服务(IDServer、SignInServer、DaoServer、LogicServer)的角色和职责。最后分享了作者耗时三个月完成服务器部分的感想。
摘要由CSDN通过智能技术生成

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

选择服务器框架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:欢迎评论(。^▽^)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值