skynet 是一个为网络游戏服务器设计的轻量框架,采用单进程,多线程架构。

底层是c,中间层和上层都是lua。基于actor模型,使用消息队列进行内部通信。

 

简单说,可以把 skynet 理解为一个简单的操作系统,它可以用来调度数千个 lua 虚拟机,让它们并行工作。每个 lua 虚拟机都可以接收处理其它虚拟机发送过来的消息,以及对其它虚拟机发送消息。每个 lua 虚拟机,可以看成 skynet 这个操作系统下的独立进程,你可以在 skynet 工作时启动新的进程、销毁不再使用的进程、还可以通过调试控制台监管它们。skynet 同时掌控了外部的网络数据输入,和定时器的管理;它会把这些转换为一致的(类似进程间的消息)消息输入给这些进程。

例如:

在网络游戏中,你可以为每个在线用户创建一个 lua 虚拟机(skynet 称之为 lua 服务),姑且把它称为 agent 。用户在不和其它用户交互而仅仅自娱自乐时,agent 完全可以满足要求。agent 在用户上线时,从数据库加载关联于它的所有数据到 lua vm 中,对用户的网络请求做出反应。当然你也可以让一个 lua 服务管理多个在线用户,每个用户是 lua 虚拟机内的一个对象。

你还可以用独立的服务处理网络游戏中的副本(或是战场),处理玩家和玩家间,玩家协同对战 AI 的战斗。agent 会和副本服务通过消息进行交互,而不必让用户客户端直接与副本通讯。

我们通常建议使用一个网关服务(gate),专门监听端口,接受新连接。在用户身份确定后,再把真正的业务数据转交给特定的服务来处理。同时,网关还会负责按约定好的协议,把 TCP 连接上的数据流切分成一个个的包,而不需要业务处理服务来分割 TCP 数据流。业务处理的服务不必直接面对 socket 句柄,而由 skynet 正常的内部消息驱动即可。

 


skynet 由一个或多个进程构成,每个进程被称为一个 skynet 节点。本文描述了 skynet 节点的启动流程。

skynet 节点通过运行 skynet 主程序启动,必须在启动命令行传入一个 Config 文件名作为启动参数。skynet 会读取这个 config 文件获得启动需要的参数

 

启动

Bootstrap第一个启动的服务是 logger ,它负责记录之后的服务中的 log 输出。logger 是一个简单的 C 服务,skynet_error 这个 C API 会把字符串发送给它。在 config 文件中,logger 配置项可以配置 log 输出的文件名,默认是 nil ,表示输出到标准输出。

bootstrap 这个配置项关系着 skynet 运行的第二个服务。通常通过这个服务把整个系统启动起来。默认的 bootstrap 配置项为 "snlua bootstrap" ,这意味着,skynet 会启动 snlua 这个服务,并将 bootstrap 作为参数传给它。snlua 是 lua 沙盒服务,bootstrap 会根据配置的 luaservice 匹配到最终的 lua 脚本。如果按默认配置,这个脚本应该是 service/bootstrap.lua 。

如无必要,你不需要更改 bootstrap 配置项,让默认的 bootstrap 脚本工作。目前的 bootstrap 脚本如下:

skynet.start(function()

 

主要内容

skynet
skynet.register_protocol
skynet.dispatch
搞明白skynet的skynet.register_protocol() 和 skynet.dispatch()

skynet.fork:co_create
skynet.start:skynet lua层开始接口

socket
timer
work
websocket

数据驱动

【专题4】搞明白skynet的C语言到lua环境建立之三(事件发生如何引导lua的coroutine)
搞明白skynet的C语言到lua环境建立之二(lua被加载之后的如何展开)

 

参考:

GettingStarted

相关文章: