文章目录
写在前面
本系列【Skynet 入门实战练习】所有源码同步:https://gitee.com/Cauchy_AQ/skynet_practice
开发环境搭建
skynet
- skynet 框架地址:https://github.com/cloudwu/skynet
sh
git clone https://github.com/cloudwu/skynet.git
- 编译skynet
sh
make 'linux'
成功编译会在 skynet 文件夹下多出一个 skynet 可执行文件
- 执行 skynet 示例
sh
./skynet examples/config
如上成功跑起了 skynet 的官方示例。
配置文件
skynet 启动服务需要指定配置文件,这里以官方示例 Demo 来简单介绍。
examples/config
:
lua
include "config.path"
-- preload = "./examples/preload.lua" -- run preload.lua before every lua service run
thread = 8
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"
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"
第一行 include "config.path"
,表示当前配置文件包含了另一个配置文件 config.path
,且这个文件相对于 examples/config
在一个目录下。
config.path
:
lua
root = "./"
luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."examples/?.lua;"..root.."test/?/init.lua"
lualoader = root .. "lualib/loader.lua"
lua_path = root.."lualib/?.lua;"..root.."lualib/?/init.lua"
lua_cpath = root .. "luaclib/?.so"
snax = root.."examples/?.lua;"..root.."test/?.lua"
配置文件实际上就是一段 lua
代码,通常,我们以 key = value
的形式对配置项赋值。
skynet 在启动时,会读取里面必要的配置项,并将暂时用不到的配置项以字符串形式保存在 skynet 内部的 env
表中。这些配置项可以通过 skynet.getenv
获取。
需要了解的几个重要参数:
参数 | 描述 |
---|---|
lualoader |
lua 脚本加载器,通常配置为 skynet/lualib/loader.lua |
luaservice |
服务脚本路径,包括 skynet 框架自带服务和自己写的服务 |
lua_path |
lua 脚本路径,即 lua 实现的库文件路径 |
lua_cpath |
用 C 编写的程序库路径,.so 文件路径 |
cpath |
用 C 编写的服务模块的位置,通常指 cservice 下那些 .so 文件 |
thread |
启用的工作线程数量,一般配置为 CPU 核心数 |
harbor |
一般配置为 0 ,采用 cluster 集群模式,skynet 工作在单节点模式下。此时 master 和 address 以及 standalone 都不必设置,否则 master/slave 集群模式,指定 1-255 间的任意整数,表示节点唯一编号 |
start |
主服务的入口 |
bootstrap |
skynet 启动的第一个服务以及其启动参数。默认配置为 snlua bootstrap ,即启动一个名为 bootstrap 的 lua 服务 |
snax |
用 snax 框架编写的服务的查找路径 |
preload |
在设置完 package 中的路径后,加载 lua 服务代码前,loader 会尝试先运行一个 preload 制定的脚本,默认为空 |
daemon |
配置 daemon = "./skynet.pid" 可以以后台模式启动 skynet,同时请配置 logger |
logger |
决定了 skynet 内建的 skynet_error 这个 C API 将信息输出到什么文件中。logger 配置为 nil ,将输出到标准输出 |
详细配置说明参考:https://github.com/cloudwu/skynet/wiki/Config
项目,启动!
在了解了上述的基础配置后,我们可以开始运行自己的 skynet 项目了。
- 首先准备好项目需要的几个文件及文件夹
lualib
跟游戏逻辑无关的通用的 Lua 库代码service
各种游戏服务入口代码,这里的一个文件就是一个服务etc
配置文件,比如配置服务器端口,数据库端口module
游戏逻辑test
测试代码
暂且对上面几个文件夹的作用有个印象,现在我们只需要编写配置文件、一个主服务,就可以先运行一个游戏项目的空壳了。
etc/config.path
lua
root = "./"
lualoader = root .. "skynet/lualib/loader.lua"
luaservice = root .. "service/?.lua;" .. root .. "skynet/service/?.lua"
lua_path = root .. "lualib/?.lua;" .. root .. "skynet/lualib/?.lua;" .. root .. "module/?.lua"
lua_cpath = root .. "luaclib/?.so;" .. root .. "skynet/luaclib/?.so"
cpath = root .. "skynet/cservice/?.so"
snax = root .. "service/?.lua"
etc/config
lua
include "config.path"
-- 启动配置
thread = 4
bootstrap = "snlua bootstrap"
start = "main"
harbor = 0
-- preload = "preload.lua"
-- daemon = "skynet.pid"
-- debug console
debug_console_port = 4040
service/main.lua
lua
local skynet = require "skynet"
local debug_port = tonumber(skynet.getenv("debug_console_port")) or 4040
skynet.start(function()
skynet.error("[main.lua] start")
if not skynet.getenv "daemon" then
-- 不是 daemon 模式启动则开启 console 服务
local console = skynet.newservice("console")
end
-- 开启 debug console 服务
skynet.newservice("debug_console", debug_port)
-- main 服务只作为入口,启动完所需的服务后就可以退出
skynet.exit()
end)
编写好后,就可以通过 ./skynet/skynet etc/config
来启动项目:
debug console
我们在这份代码中,有自行启动一个 debug console
服务,运行在 4040
端口,端口可通过配置文件进行配置。
这是一个 skynet
自带的调试控制台服务,可以通过 telnet
工具来连接,执行 telnet 127.0.0.1 4040
。
- 执行
help
,查看调试工具提供的指令
list
,列出所有服务,以及启动服务的命令参数
mem
,让所有 lua 服务汇报自己占用的内存
更多指令介绍可参考:https://github.com/cloudwu/skynet/wiki/DebugConsole