skynet master/slave 测试

master / slave 配置文件均沿用前一篇文章:skynet master/slave 模式。

一、测试脚本

main.lua:根据配置文件判断当前节点是否为 master,并对指定地址进行监听。

local skynet  = require "skynet"
local socket  = require "skynet.socket"
local cluster = require "skynet.cluster"

skynet.start(function()
        local nodeName = skynet.getenv("nodename")		--根据配置项:nodename,判断当前节点是否为 master
        local isMaster = nodeName  == "cluster_center"

        if isMaster then
        		--[[
        		cluster.reload:主要用来将节点名与地址保存到表 node_address 中,方便后续发起远程请求,如 cluster.send 或者 cluster.call。
        		
        		__nowaiting解释:当一个名字没有配置在配置表中时,如果你向这个未命名节点发送一个请求,skynet 的默认行为是挂起,
                一直等到这个名字对应项的配置被更新。你可以通过配置节点名字对应的地址为 false 来明确指出这个节点已经下线。
                另外,可以通过在配置表中插入 __nowaiting = true 来关闭这种挂起行为
        		--]]
                cluster.reload({
                        __nowaiting = true,
                        tunnel1 = "192.168.255.128:50001",	-- master 监听通道1(普通通道)
                        tunnel2 = "192.168.255.128:50002",	-- master 监听通道2(优先通道),两个通道的原因是因为有些消息具有较高的优先级

                        tunnel3 = "192.168.255.128:60001",	-- master 可访问的其他服务节点
                        })
				
				-- master 打开并监听这两个地址
                cluster.open("tunnel1")
                cluster.open("tunnel2")
        else
                cluster.reload({
                        __nowaiting = false,
                        tunnel1 = "192.168.255.128:50001",	-- master 普通通道
                        tunnel2 = "192.168.255.128:50002", 	-- master 优先通道

                        tunnel3 = "192.168.255.128:60001", -- 当前 slave 节点监听地址
                })

                cluster.open("tunnel3")
        end

        local theService = skynet.newservice("glpTestCluster")

        skynet.exit()
end)

glpTestCluster.lua:slave 节点首先走 tunnel1 通道,调用 master 节点注册的 fish 服务的 testA 方法;master 节点收到消息后,testA 方法会判断当前是否为 master,是的话就 fork 一个新协程走 tunnel3 通道,调用 slave 节点注册的 fish1 服务的 testA 方法。

local skynet = require "skynet"
require "skynet.manager"
local cluster = require "skynet.cluster"

local isMaster = false

function clusterPrint(...)
    print("glpTestCluster [" .. skynet.address(skynet.self()) .. "] " .. os.date("%Y-%m-%d %X") .. ']:', ...)
end

local Funcs = {}
function Funcs.testSelf(agent)
    clusterPrint("testSelf agent==self", agent == skynet.self(), skynet.address(agent))
end

function Funcs.test(val)
    clusterPrint("test val=", val)
    return val
end

function Funcs.testA(val, usr)
    clusterPrint("testA usr=", usr, "val=", val)

    if isMaster then
            skynet.fork(function()
                    skynet.sleep(100)

                    local status, ret = pcall(function()
                            return cluster.call("tunnel3", "@fish1", "testA", 3, "American")
                    end)
                    clusterPrint("status=", status, "ret=", ret)
            end)
    end

    return val
end

-- 测试cluster组网
skynet.start(function()
        clusterPrint("skynet.start glpTestCluster")
        isMaster = skynet.getenv("nodename") == "cluster_center"

        skynet.dispatch("lua", function(session, source, funcName, ...)

                clusterPrint("test dispatch", session, source, funcName, ...)
                local f = Funcs[funcName]
                if f then
                        skynet.retpack(f(...))
                else
                        clusterPrint("Error no function =", funcName)
                end
        end)

        local f
        if isMaster then
        		--[[
        		注册本服务的名字
        		注意:若服务只用于当前节点,则名字最好以“.”开头,表示本地节点服务,不能被其他节点调用(如果调用会报错)
            	若需被其他节点调用,则前面不带点
        		--]]
                cluster.register("fish")
        else
                cluster.register("fish1")
                f = function()
                        clusterPrint("call the tunnel1")
                        local status, ret = pcall(function()
                        		--[[
                        		cluster.call():
                        		参数一:想走的通道,切忌调用自己监听的通道,这样会报错。
                        		参数二: @ + 服务名称
                        		参数三:方法名
                        		参数四:方法的参数
                        		--]]
                                return cluster.call("tunnel1", "@fish", "testA", 1, "Chinese")
                        end)

                        clusterPrint("status=", status, "ret=", ret)
                        skynet.timeout(300, f)
                end
        end

        if f then
                f()
        end
end)

二、测试结果

master:
在这里插入图片描述
slave:
skynet master/slave 测试_第1张图片

你可能感兴趣的:(skynet)