自己收集的skynet教程
来源:互联网 发布:淘宝查询礼服秋冬女装 编辑:程序博客网 时间:2024/06/15 21:01
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
阅读全文
0 0
- 自己收集的skynet教程
- skynet教程(0)--skynet的获取和编译
- skynet教程(1)--服务的编写
- skynet资源收集
- skynet资源收集
- 一些自己收集到的教程免费发布出来
- SkyNet + Lua 学习教程
- 自己收集的网页
- skynet源码分析【skynet名字的管理】
- skynet的学习过程
- 学习skynet的点滴
- skynet的定时器
- skynet的windows版本
- skynet的线程
- skynet的socket_server库
- skynet的一些整理
- skynet的sproto模块
- skynet的并发处理
- 对称加密与非对称加密
- 【双语】使用ConstraintLayout构建响应式UI(Build a Responsive UI with ConstraintLayout)
- java中的this关键字/内部类
- Android进阶之路
- 给select下拉框赋值,js实现
- 自己收集的skynet教程
- 页面中的label标签本来随着里面字数的增加而增长,我准备设定label标的宽度为固定值,却一直设定不了
- 图解集合LinkedHashMap
- 以太坊不同客户端的定义和用途
- Python函数式编程
- gym/101149/ Right Build 有向spfa
- java性能优化
- 4.1使用一个工具窗口创建扩展
- Jensen不等式概率论形式的证明