Skynet的examples目录下的config文件设定了main.lua为第一个启动的服务,启动一个服务,会先调用这个服务
的skynet.start()函数,examples中的main.lua:
local skynet = require "skynet"
local sprotoloader = require "sprotoloader"
local max_client = 64
skynet.start(function()
skynet.error("Server start")
skynet.uniqueservice("protoloader")
if not skynet.getenv "daemon" then
local console = skynet.newservice("console")
end
skynet.newservice("debug_console",8000)
skynet.newservice("simpledb")
local watchdog = skynet.newservice("watchdog")
skynet.call(watchdog, "lua", "start", {
port = 8888,
maxclient = max_client,
nodelay = true,
})
skynet.error("Watchdog listen on", 8888)
skynet.exit()
end)
下面我以一个自己写的简单的登录服务为例子讲解下服务的启动流程:(main.lua)
local skynet = require "skynet"
local max_client = 64
skynet.start(function()
skynet.error("Server start")
local loginserver = skynet.newservice("myloginserver")
skynet.call(loginserver,"lua" ,"HELLO", "world"))
skynet.error("loginserver listen on", 8888)
end)
首先,newservice是创建服务,我这里有有个myloginserver.lua文件,也就是一个登录服务,后面会讲到。
然后,使用skynet.call发送消息 ,skynet.call(addr, type, ...),
这就是一个RPC调用
第一个参数是你想要调用的服务地址,也可以是服务的名称
用type
类型发送一个消息到addr
,并等待对方的回应。
local watchdog = skynet.newservice("watchdog")
skynet.call(watchdog, "lua", "start", {
port = 8888,
maxclient = max_client,
nodelay = true,
})
传入的addr
就是服务地址;
skynet.call("simpledb", "lua", "get", "hello")
传入的addr
就是服务的名称。
至于type
,如果是service之间的RPC调用,其值一般都是lua
,如果涉及到自定义的类型,才使用你在注册协议时候的类型名。
后面的...
是可变参数,一般我们传一个命令和命令参数过去。