【skynet】skynet 服务间通信

写在前面

skynet 服务之间有自己的一套高效通信 API 。本文给出简单的示例。


准备工作

首先要有一个编译好,而且工作正常的 skynet 。

编写代码

  • 在 skynet/service 添加一个 calc 服务

    local skynet = require "skynet"
    
    local HANDLE = {}
    
    -- 处理加法
    function HANDLE.add(...)
        local res = 0
        for i, v in ipairs{...} do
            res = res + v
        end
        return res
    end
    
    -- 处理减法
    function HANDLE.sub(lhs, rhs)
        local res = lhs - rhs
        skynet.error(lhs .. " - " .. rhs .. " = " .. res)
    end
    
    -- 处理 lua 消息
    local function lua_dispatch(session, source, cmd, ...)
        local f = assert(HANDLE[cmd])
        skynet.retpack(f(...))
    end
    
    skynet.start(function()
        -- 注册 lua 消息的处理函数
        skynet.dispatch("lua", lua_dispatch)
    end)
    
  • 在 skynet/lualib 做一层 calc 模块封装

    local skynet = require "skynet"
    
    local M = {}
    local service
    
    skynet.init(function()
        service = skynet.uniqueservice(true, "calc")
    end)
    
    function M.add(...)
        local ret = skynet.call(service, "lua", "add", ...)
        return ret
    end
    
    function M.sub(lhs, rhs)
        skynet.send(service, "lua", "sub", lhs, rhs)
    end
    
    return M
    
  • 在 skynet/service 添加一个 main_test 服务

    local skynet = require "skynet"
    local calc = require "calc"
    
    -- 服务函数
    local function task_add()
        while true do
            -- 加法
            local a = math.random(1, 100)
            local b = math.random(1, 100)
            local c = math.random(1, 100)
            local ret = calc.add(a, b, c)
            skynet.error(a .. " + " .. b .. " + " .. c .. " = " .. ret)
    
            -- 睡眠 1000ms
            skynet.sleep(100)
        end
    end
    
    local function task_sub()
        while true do
            -- 减法
            local lhs = math.random(1, 100)
            local rhs = math.random(1, 100)
            calc.sub(lhs, rhs)
    
            -- 睡眠 1500ms
            skynet.sleep(150)
        end
    end
    
    -- 注册初始化函数
    skynet.init(function()
        math.randomseed(math.floor(skynet.time()))
    end)
    
    -- 启动服务
    skynet.start(function()
        skynet.fork(task_add)
        skynet.fork(task_sub)
    end)
    
  • 在 skynet/example 添加一份 config_test 配置

    -- 启动多少个工作线程
    thread = 8
    
    -- skynet 工作在单节点模式下
    harbor = 0
    
    -- skynet 节点的主程序
    start = "main_test"
    

运行结果

root@macbook:~/skynet# ./skynet examples/config_test 
[:00000002] LAUNCH snlua bootstrap
[:00000003] LAUNCH snlua launcher
[:00000004] LAUNCH snlua cdummy
[:00000005] LAUNCH harbor 0 4
[:00000006] LAUNCH snlua datacenterd
[:00000007] LAUNCH snlua service_mgr
[:00000008] LAUNCH snlua main_test
[:00000009] LAUNCH snlua calc
[:00000008] 78 + 42 + 13 = 133
[:00000002] KILL self
[:00000009] 90 - 14 = 76
[:00000008] 89 + 2 + 83 = 174
[:00000009] 58 - 70 = -12
...

总结

skynet 把请求做得很像普通的函数调用,原因在于封装。

  • 创建服务被封装起来,在 require() 的时候才尝试创建服务
  • 请求被封装起来,成为模块的一部分
  • 如果用不到 calc ,不需要创建 calc 服务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值