启动skynet需要一个配置文件 我们看下examples/config
root = "./" 表示根目录是skynet启动时的目录
thread = 8 启动的工作线程数
logger = nil 它决定了 skynet 内建的 skynet_error
这个 C API 将信息输出到什么文件中。如果 logger 配置为 nil ,将输出到标准输出,你可以指定一个路径和文件名,这样 “终端”输出的内容就写到日志中文件了
logpath = "."
harbor = 1
address = "127.0.0.1:2526"
master = "127.0.0.1:2013"
start = "main" -- main script
bootstrap = "snlua bootstrap" -- The service for bootstrap
standalone = "0.0.0.0:2013"
luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."examples/?.lua"
lualoader = "lualib/loader.lua"
-- preload = "./examples/preload.lua" -- run preload.lua before every lua service run
snax = root.."examples/?.lua;"..root.."test/?.lua"
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"
实际上是被当做一段lua代码所加载, 以key = value的形式配置项赋值
必要的配置项保存在struct skynet_config config里,暂时用不到的配置项以字符串的形式保存在skynet内部的env表里
可以通过skynet.getenv获取
集群服务用到的配置项:
lua 服务由 snlua 提供,它会查找一些配置项以加载 lua 代码:
另外,你也可以把一些配置选项配置在环境变量中。比如,你可以把 thread 配置在 SKYNET_THREAD
这个环境变量里。你可以在 config 文件中写:
thread=$SKYNET_THREAD
这样,在 skynet 启动时,就会用 SKYNET_THREAD
这个环境变量的值替换掉 config 中的 $SKYNET_THREAD
了。
daemon 配置 daemon = "./skynet.pid" 可以以后台模式启动 skynet 。注意,同时请配置 logger 项输出 log 。
总结: log bootstrap 是启动的2个服务, 默认的 bootstrap 配置项为 "snlua bootstrap"
,这意味着,skynet 会启动 snlua 这个服务,并将 bootstrap 作为参数传给它。snlua 是 lua 沙盒服务,bootstrap 会根据配置的 luaservice 匹配到最终的 lua 脚本。如果按默认配置,这个脚本应该是 service/bootstrap.lua ,bootstrap最后一行会从config读取start配置项, 这个才是用户定义的启动脚本。作为用户定义的服务启动入口脚本运行。成功后,把自己退出
具体代码参考:http://www.cnblogs.com/lycokcc/p/4277113.html
skynet通过skynet_context_new函数来实例化一个服务:先是从logger.so文件把模块加载进来
启动完成logger服务后,系统接下来要启动的服务是bootstrap,但先要加载snlua模块,所有的lua服务都属于snlua模块的实例
和加载logger服务类似,先是把snlua.so文件作为模块加载进来,调用模块自身的_create函数产生一个snlua实例,在service_snlua.c文件中
在方法中启动了新生成了一个lua VM,出就是lua沙盒环境,这一点也比较重要,因为所有的lua服务都是是一个独立的VM中运行的,这也是云风的设计初衷