skynet之main服务的启动

1 skynet启动的第一个服务

我们知道,skynet服务(service)为基础,那么,当我们输入指令> skynet examples/config之后,skynet启动的第一个服务会是什么呢?

这一点我们先看看最常用的配置文件,通常会有这么两行:

1
2
start = "main"	-- main script
bootstrap = "snlua bootstrap" -- The service for bootstrap

其中,bootstrap是指定启动的第一个服务:snlua,及其参数:bootstrap

snluaskynet内置的一个最常用的c服务,以.so的形式存在于cservice/目录下,简单地说,就是用来启动一个lua服务。

snlua bootstrap则是将bootstrap作为参数传给snlua服务。

snlua的具体功能,可以看代码service_snlua.c,简单地说,就是加载一些库,修改一些函数(coroutine.resume / coroutine.wrap),切换分代CG等等。然后就调用./lualib/loader.lua文件,将参数(bootstrap)传入。

理论上,我们也可以配置成bootstrap="snlua myBoot",使用我们自己的启动脚本,但没必要,skynet默认的bootstrap已经帮我们将事情都处理好了。

2 ./lualib/loader.lua做了些什么

loader.lua可以接收多个参数,其中第一个参数是服务名,其他的是服务启动的参数。

loader如何根据服务名来找到对应的入口文件呢?

答案是配置文件中的luaservice,在示例的配置中,luaservice长这样:

1
luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."examples/?.lua;"..root.."test/?/init.lua"

那么,skynet按顺序依次查找文件service/bootstrap.lua,test/boostrape.lua,examples/bootstrap.lua,test/bootstrap/init.lua,找到第一个存在的文件,然后调用这个文件。如果所有文件都不存在,则抛出错误。

在调用bootstrap.lua之前,如果配置文件配置了preload,则会先调用这个preload文件

理论上,我们也可以配置自己的loader文件,不一定要使用系统的loader.lua,但这通常也是不必要的

3. bootstrap.lua又做了些什么

通过loader.lua,我们找到了service/bootstrap.lua这个文件,这里就是常用的skynetlua服务写法:

1
2
3
4
5
local skynet = require "skynet"
skynet.start(function()
--...
skynet.exit()
end)

这里主要是启动了一些服务:

  • launcher:用来启动、管理lua服务,先启动这个服务,后续才能调用skynet.newservice等函数来启动服务。
  • cdummy:启动harbor服务,基本没什么用
  • datacenterd:数据中心,可以查询、存储一些key/value
  • service_mgr:管理单例服务,skynet.uniqueserviceskynet.queryservice时使用。

启动完这些服务之后,就是启动main服务了,即配置文件中start="main"这里指定的服务名,就是我们自己的服务的入口了~

bootstrap做完所有事情之后,则调用skynet.exit,结束bootstrap服务。

如果配置文件的harbor大于0,则还会启动cmastercslave服务。这是早期的设计,后续skynet已经不建议配置harbor了。

如果配置文件配置了enablessl,这里还会启动相关的服务


skynet之main服务的启动
https://blog.supersource.top/skynet_main_service_bootstrap/
作者
看热闹的咸鱼
发布于
2024年3月29日
许可协议