首页 > 其他分享 >skynet之main服务的启动

skynet之main服务的启动

时间:2024-03-30 17:44:52浏览次数:22  
标签:服务 启动 bootstrap snlua lua skynet main

1 skynet启动的第一个服务

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

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

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长这样:

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服务写法:

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,这里还会启动相关的服务

标签:服务,启动,bootstrap,snlua,lua,skynet,main
From: https://www.cnblogs.com/lcc9527/p/18105784

相关文章

  • skynet非单点类型节点的管理(一):玩家代理节点
    单个skynet进程,或者说单台机器的承载业务能力是有上限的,对于负责玩家主要业务的节点,横向扩展以提高游戏承载能力是必须的。对于滚服架构,玩家角色与指定业务节点(单服)固定对应,连接游戏业务前通过中央后台获取到指定信息进行连接。承载能力通过新增单服完成,这里我们只对世界服架构做......
  • MogDB/openGauss 坏块测试-对启动的影响-测试笔记1
    MogDB/openGauss坏块测试-对启动的影响-测试笔记1在UPDATE操作提交后,脏块落盘前kill掉mogdb数据库,然后对UPDATE修改的坏进行以下破坏操作,仍然能够启动数据库,数据未丢失。1、用旧数据文件替换,可以启动2、修改成错误的checksum,可以启动3、数据块修改成错误的lsn,可......
  • k8s的安装与启动
    k8s是一个非常庞大的组件,对新手不太友好,由于版本升级和环境问题常常安装失败。这里记录一下2024年3月29日使用最新的k8s的安装和启动流程。我是在一台虚拟机中进行实验的,当前的虚拟机比较干净。先装一个docker,这个比较容易,在docker官网可以找到安装最新docker的教程。kernelmod......
  • KingbaseES V8R3集群运维案例之---failover切换后新主库启动过程
    案例说明:KingbaseESV8R3集群failover切换后,在生产环境中,新主库启动过程中可能会有业务访问,出现‘系统只读’的问题。如下图所示:适用版本:KingbaseESV8R3一、问题分析1、如下所示,failover切换过程:1)在master节点执行failover_stream.sh脚本执行failover切换。2)ping网关地......
  • KingbaseES V8R3集群运维案例之---集群启动“DATA_SIZE_DIFF 16 (MB)”故障
    案例说明:为保证集群数据的一致性安全,在主备库的数据相差“DATA_SIZE_DIFF>=16M"以上时,该备库不能参与主备切换,并且通过kingbase_monitor.sh启动集群时,集群将无法启动;本案例对此种故障做了复现,并测试了解决方法。适用版本:KingbaseESV8R3适用版本:KingbaseESV8R3一、案例......
  • Launcher 启动流程
    Launcher启动过程介绍Launcher是一个应用进程,用来显示系统中已经安装的应用程序Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标显示在系统屏幕上,这样用户就能点击这些快捷图标来启动相应的应用程序。......
  • 启动filezilla后自动连接指定站点及进入指定的目录
    自动连接指定的站点操作步骤<aside>......
  • ESP32-P4 --- 启动流程
     PROCPU执行一级引导程序(内含复位向量代码)根据复位原因及GPIO_STRAP_REG寄存器的值确定启动模式,比如UART下载模式、从FLASH加载二级引导程序执行加载二级引导程序,并执行入口函数call_start_cpu0()根据分区表的配置,加载应用程序通过应用程序二进制文件的头......
  • 启动应用程序出现FirewallAPI.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个FirewallAPI.dll文件(挑选合适的版本文件)把......
  • 启动应用程序出现fthsvc.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个fthsvc.dll文件(挑选合适的版本文件)把它放......