zoukankan      html  css  js  c++  java
  • skynet配置文件

    启动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获取

    • bootstrap skynet 启动的第一个服务以及其启动参数。默认配置为 snlua bootstrap ,即启动一个名为 bootstrap 的 lua 服务。通常指的是 service/bootstrap.lua 这段代码。
    • cpath 用 C 编写的服务模块的位置,通常指 cservice 下那些 .so 文件。如果你的系统的动态库不是以 .so 为后缀,需要做相应的修改。这个路径可以配置多项,以 ; 分割
    • standalone 如果把这个 skynet 进程作为主进程启动(skynet 可以由分布在多台机器上的多个进程构成网络),那么需要配置standalone 这一项,表示这个进程是主节点,它需要开启一个控制中心,监听一个端口,让其它节点接入。
    • master 指定 skynet 控制中心的地址和端口,如果你配置了 standalone 项,那么这一项通常和 standalone 相同
    • address当前 skynet 节点的地址和端口,方便其它节点和它组网。注:即使你只使用一个节点,也需要开启控制中心,并额外配置这个节点的地址和端口
    • harbor 可以是 1-255 间的任意整数。一个 skynet 网络最多支持 255 个节点。每个节点有必须有一个唯一的编号
    • 如果 harbor 为 0 ,skynet 工作在单节点模式下。此时 master 和 address 以及 standalone 都不必设置
    • start 这是 bootstrap 最后一个环节将启动的 lua 服务,也就是你定制的 skynet 节点的主程序。默认为 main ,即启动 main.lua 这个脚本。这个 lua 服务的路径由下面的 luaservice 指定

    集群服务用到的配置项:

    • cluster 它决定了集群配置文件的路径。

    lua 服务由 snlua 提供,它会查找一些配置项以加载 lua 代码:

    • lualoader 用哪一段 lua 代码加载 lua 服务。通常配置为 lualib/loader.lua ,再由这段代码解析服务名称,进一步加载 lua 代码。snlua 会将下面几个配置项取出,放在初始化好的 lua 虚拟机的全局变量中。具体可参考实现。
      • SERVICE_NAME 第一个参数,通常是服务名。
      • LUA_PATH config 文件中配置的 lua_path 。
      • LUA_CPATH config 文件中配置的 lua_cpath 。
      • LUA_PRELOAD config 文件中配置的 preload 。
      • LUA_SERVICE config 文件中配置的 luaservice 。
    • luaservice lua 服务代码所在的位置。可以配置多项,以 ; 分割。 如果在创建 lua 服务时,以一个目录而不是单个文件提供,最终找到的路径还会被添加到 package.path 中。比如,在编写 lua 服务时,有时候会希望把该服务用到的库也放到同一个目录下。
    • lua_path 将添加到 package.path 中的路径,供 require 调用。
    • lua_cpath 将添加到 package.cpath 中的路径,供 require 调用。
    • preload 在设置完 package 中的路径后,加载 lua 服务代码前,loader 会尝试先运行一个 preload 制定的脚本,默认为空。
    • snax 用 snax 框架编写的服务的查找路径。

    另外,你也可以把一些配置选项配置在环境变量中。比如,你可以把 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中运行的,这也是云风的设计初衷

  • 相关阅读:
    【SCOI 2011】 糖果
    【POJ 3159】 Candies
    【POJ 1716】 Integer Intervals
    【POJ 2983】 Is the information reliable?
    【POJ 1364】 King
    【POJ 1201】 Intervals
    【POJ 1804】 Brainman
    6月10日省中提高组题解
    【POJ 3352】 Road Construction
    【POJ 1144】 Network
  • 原文地址:https://www.cnblogs.com/huoxl/p/4611154.html
Copyright © 2011-2022 走看看