https://github.com/cloudwu/skynet
https://github.com/cloudwu/skynet/wiki
http://blog.codingnow.com/eo/skynet/
云风skynet服务端框架研究
skynet非官方网站http://skynetclub.github.io/
skynet资源收集
linux安装skynet问题总结
Skynet基础入门例子详解(1)
Skynet基础入门例子详解(2)
Skynet基础入门例子详解(3)
Skynet基础入门例子详解(4)
Skynet基础入门例子详解(5)
Skynet基础入门例子详解(6)
Skynet基础入门例子详解(7)
从零开始学习Skynet_examples研究
skynet启动过程_1
##skynet 相关
*. 网络:gate.lua、gateserver.lua、socketdriver .lua、netpack.lua是一套东西,完整的实现了封包的处理,即两个字节的数据大小+数据
netpack是个关键的,在gateserver里面dispatch_queue跟dispatch_msg形成了数据的解包的处理,再投递给上层已经是解之后的数据,即{msg,sz, fd}
*. 网络:socket_server.c && skynet_socket.c 是网络处理的核心,暴露了大量线程安全的方法,利用epoll作请求的分发,send的时候,只是往一个fd write一个请求,以完成异步的过程
*. 网络:使用域名之前必须先将域名解析成ip再传入,不然socket_server在open_socket的时候调用getaddinfo会卡住整个流程,因为处理整个消息分发的是一个单线程的,在poll的时候取
出各个请求来处理,包括 发送数据、打开socket等等,都是在一个poll中完成的
*. 网络:agent跟客户端约定的单个消息包的长度,即包头是一个2字节的无符整数,实际上可以达到2^16即65536的长度的,并且用了大端序
*. sproto:sprotoloader将sproto load到了内存里面,并且使用index去索引相应的
*. sproto:sproto.lua使用metatable的方式new出一个sproto的实例,共享了内存,另外的attach函数主要是处理了主动发送的情况下,如何encode的问题,
只是返回了一个闭包函数,用于encode
*. sproto : sproto.lua里面的sproto:host传入的参数,即packagename,这个主要是用于rpc的一种实现,即每个包,都加上.package这个结构体指定的包头,
用于实现rpc,包含了type跟session,那么在回包的时候也写上这样的数据,可以让调用方知道回应包是对应的哪个session
*. sproto : lsproto.c 指定了encode的maxsize,即0x1000000, encode的level是64
*. 主程序入口: skynet_main.c, 具体的:skynet_start.c 启动了各种线程,传入各种参数,初始化,开始干活
*. 主逻辑:skynet_server.c,消息的分发,逻辑的传递,skynet_context的创建, skynet_context_new :加载模块,调用skynet_handle_register进行绑定,初始化,创建mq,加入到全局mq
*. skynet_context: skynet里面一个重要的概念,其实就是一个服务的载体,所谓一个符合skynet标准的服务,即是包含一系列"服务名_*"这样的函数,*包括”create, release, init, signal,
而这些函数的指针的初始化(即从名字映射为实际的指针是在skynet_module.c完成的,使用了dlsym函数,从模块里面加载对应名字的函数出来)
*. 符合规范的c模块:需要包含一系列"服务名_*"这样的函数,*包括”create, release, init, signal, 其中signal是可选的
*. service_snlua.c:这是一个服务,在skynet_start.c的bootstrap里面第一次使用,在cofig.xxx里面配置bootstrap为snlua bootstrap,则会
skynet_context_new("snlua", "bootstrap"),即启动snlua服务,并把bootstrap这个参数传递进去
*. bootstrap.lua:这个标准的模块,首先启动了launcher服务,这个用于newservice的时候加载模块起来运行
*. 消息包:消息包的大小限制是2^56字节,SIZE_MAX >> 8这么大
*. 消息分发:skynet_server.c里面的skynet_context_message_dispatch是整个核心,由skynet_start.c的thread_worker循环的调用
*. skynet.launch:用于启动一个c服务,skynet里面c服务不多,就service_snlua, service_logger等几个,而那些lua服务全部是由snlua启动的,
所以skynet.newservice最终是调用到skynet.launch,而这个又是调用到skynet_server.c里面的cmd_launch,而这个,yi
*. skynet.lua : 大部分的操作都关联回skynet_context去了,skynet.dispatch_message就注册成为了一个lua服务的cb,在context有消息的时候被cb调用,
然后再调用raw_dispatch_message,解析出消息类型,并且利用skynet_register_protocol指定的pack或unpack函数解析出msg、sz,再dispatch回具体的函数
去处理
*. skynet.lua : 关于skynet.timeout的工作原理,首先使用传入的func建立一个coroutine,然后调用skynet-server的timeout功能,会返回一个session,将此session值与
co关联起来,到时被timer回调的时候通过session值找回co,然后resume,skynet-server的timeout那里只是将调用方的handle&session记录了下来,到达时间之后,
dispatch消息到对应的handle上面,并传递session值回去
*. skynet.lua : 关于skynet.sleep的工作原理,同skynet.timeout相似,但不用创建一个新的co,只是将当前的co yield掉,等待被resume