2.2 理解Skynet
本节将带领读者理解Skynet的特有概念,然后进行实践。
2.2.1 节点和服务
在图2-7所示的服务端系统中,每个Skynet进程(操作系统进程)称为一个节点,每个节点可以开启数千个服务。如同1.4.1节中的程序,不同节点可以部署在不同的物理机上,提供分布式集群的能力。
2.1.2节的KV数据库仅开启了一个Skynet进程,它是单节点的服务端系统。
每个Skynet节点可以调度数千个Lua服务,让它们并行工作。对应1.7节的内容可知,每个服务都是一个Actor。
图2-7 开启3个节点5个服务的服务端系统
知识拓展:Skynet的强项在于单个节点内的并行运算,对于分布式集群,它只提供一些基础设施。对于1.4.4节提及的“分布式程序要处理很多异常情况”,在Skynet引擎中,这些异常情况依然要使用者自行处理。
2.2.2 配置文件
Skynet提供了很多配置项,可以打开KV数据库范例(见2.1.2节)的配置文件examples/config查看它的内容。笔者整理了配置模板,见代码2-1。到目前为止,读者仅需关注thread和start这两项,它们的含义见表2-1。
代码2-1 配置模板,可以替换examples/config
(资源:Chapter2/1_config)
--必须配置 thread = 8 --启用多少个工作线程 cpath = "./cservice/?.so" --用C编写的服务模块的位置 bootstrap = "snlua bootstrap" --(固定)启动的第一个服务 --bootstrap配置项 start = "main" --主服务入口 harbor = 0 --(固定)不使用主从节点模式 --lua配置项(暂时固定) lualoader = "./lualib/loader.lua" luas ervice = "./service/?.lua;".."./test/?.lua;".."./examples/?.lua;".."./ test/?/init.lua" lua_path = "./lualib/?.lua;" .. "./lualib/?/init.lua" lua_cpath = "./luaclib/?.so" --后台模式(必要时开启) --daemon = "./skynet.pid" --logger = "./userlog"
表2-1 常见配置项说明
Skynet提供了很多功能,有些功能还提供多种实现方法,因此配置项较多。读者可以打开https://github.com/cloudwu/skynet/wiki/Config查看详细说明。
知识拓展:配置模板的各项说明见表2-2。
表2-2 配置模板的各项说明
2.2.3 目录结构
Skynet的目录结构如图2-8所示,读者(目前)只需关注表2-3中的几项。
图2-8 Skynet的目录结构
表2-3 Skynet的目录结构说明
Skynet提供了很高的灵活性,更改表2-2中的“Lua配置项”,可更改这些目录,但此处暂时无须修改。
知识拓展:更详细的目录结构说明见表2-4。
表2-4 更详细的目录结构说明
2.2.4 启动流程
图2-9展示了Skynet的启动流程。图中①②③步由引擎完成,用户只需在配置文件中指定主服务(表2-1的start项)即可,之后就可以从主服务开始编写程序了。
图2-9 Skynet的启动流程
了解了理论知识,下面开启实践之旅。