写在前面
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 服务