终于可以测试work协议了。只要走得通,就代表完成了整套底层框架。
1、主服务修改
我们重新修改主服务,让它智能一些,根据配置文件自动开启服务,无须手动设置。如下代码所示:
local skynet = require "skynet"
local skynet_manager = require "skynet.manager"
local runconfig = require "runconfig"
local cluster = require "skynet.cluster"
skynet.start(function()
--初始化
local mynode = skynet.getenv("node")
local nodecfg = runconfig[mynode]
--节点管理
local nodemgr = skynet.newservice("nodemgr","nodemgr", 0)
skynet.name("nodemgr", nodemgr)
--集群
cluster.reload(runconfig.cluster)
cluster.open(mynode)
--gate
for i, v in pairs(nodecfg.gateway or {}) do
local srv = skynet.newservice("gateway","gateway", i)
skynet.name("gateway"..i, srv)
end
--login
for i, v in pairs(nodecfg.login or {}) do
local srv = skynet.newservice("login","login", i)
skynet.name("login"..i, srv)
end
--agentmgr
local anode = runconfig.agentmgr.node
if mynode == anode then
local srv = skynet.newservice("agentmgr", "agentmgr", 0)
skynet.name("agentmgr", srv)
else
local proxy = cluster.proxy(anode, "agentmgr")
skynet.name("agentmgr", proxy)
end
--退出自身
skynet.exit()
end)
主服务先开启nodemgr(每个节点必有一个),加载cluster(用于跨节点通信),再根据配置依次开启节点内的gate、login等服务。由于nodemgr、gateway、login是“本地服务”,因此使用skynet.name给它命名。agentmgr是“全局服务”,如果它在其他节点,则使用cluster.proxy创建一个代理。
2、代码测试
(1)登录测试
开启节点1运行游戏服务端,使用telnet测试的结果如下图所示。
该图所示的结果表示客户端发送login登录id为101的角色,然后两次发送work协议,每次“打工”金币都会增加。成功执行这一流程意味着服务端框架已经成型,可以在它基础上开发游戏逻辑。
(2)顶号测试
我们再开启一个客户端登录同一个账号,运行结果如下图所示,顶号成功。
3、跨节点测试
单个节点只能部署在一台物理机上,它能承载数千玩家。如果要支撑更多,就需要开启多个节点,如下图所示,请确保节点2的配置文件etc/config.node2存在,它的内容和config.node1一样,仅仅是将node项改成了“node2”。
设置完成后可以开启两个节点进行测试,让不同的客户端连接不同节点的gateway,它们应该都能正常工作。还可以尝试修改配置进行测试,比如将agentmgr放在节点2上,程序也应该能正常工作。
说明:如果开启多个节点,对开启顺序会有要求,应先开启agentmgr所在的节点,再开启其他,否则会报错。
完整代码地址:https://gitee.com/frank-yangyu/ball-server