skynet初学
记录下命令
git clone https://github.com/cloudwu/skynet.git
sudo apt-get install autoconf
sudo apt-get install libreadline-dev
make linux
lua5.3.0
发现个不错的skynet研究网站http://forthxu.com/blog/skynet.html
- Read Wiki https://github.com/cloudwu/skynet/wiki
- The FAQ in wiki https://github.com/cloudwu/skynet/wiki/FAQ
编译之后 看下skynet下的文件:
-3rd 第三方库的代码 jemalloc (内存管理) lpeg(Lua所使用的新的模式匹配库,基于解析表达式语法) lua lua-md5 (lua的md5库)
-examples 一些例子 lua脚本
-lualib 使用lua写的库
-luaclib lualib-src编译之后生成的库 供lua脚本使用
-lualib-src
-service skynet的服务器模块 使用lua编写
-cservice service-src编译之后生成的库
-skynet-src skynet的源码
skynet可以启动多进程 称之为节点, 不同节点服务地址相互唯一,同一节点内的服务数量被地址限制, 32bit整数,但是高8位用于区分节点
因此,skynet最终可以有255个节点部署在不同的机器上协作,每个节点最多有16M个服务。
skynet 是可以启动多个节点,不同节点内的服务地址是相互唯一的。服务地址是一个 32bit 整数,同一进程内的地址的高 8bit 相同。这 8bit 区分了一个服务处于那个节点。
每个节点中有一个特殊的服务叫做 harbor (港口) ,当一个消息的目的地址的高 8 位和本节点不同时,消息被投递到 harbor 服务中,它再通过 tcp 连接传输到目的节点的 harbor 服务中。虽然设计上围绕单进程多线程模块进行的,但 skynet 其实并不仅限于单进程。它实际是可以部署到不同机器上联合工作的。这虽然不是核心特性,但核心层为此做了许多配合。
我们最终允许 255 个 skynet 节点部署在不同的机器上协作。每个 skynet 节点有不同的 id 。这里被称为 harbor id 。这个是独立指定,人为管理分配的(也可以写一个中央服务协调分配)。每个消息包产生的时候,skynet 框架会把自己的 harbor id 编码到源地址的高 8 位。这样,系统内所有的服务模块,都有不同的地址了。从数字地址,可以轻易识别出,这个消息是远程消息,还是本地消息。
集群间的通讯,是由一个独立的 harbor 服务来完成的。所有的消息包在发送时,skynet 识别出这是一个远程消息包时,都会把它转发到 harbor 服务内。harbor 服务会建立 tcp 连接到所有它认识的其它 skynet 节点内的 harbor 服务上。
Harbor 间通过单向的 tcp 连接管道传输数据,完成不同的 skynet 节点间的数据交换。
skynet 目前支持一个全局名字服务,可以把一个消息包发送到特定名字的服务上。这个服务不必存在于当前 skynet 节点中, 可以单独为一个进程,也可以附属在某一个 skynet 节点内部(默认配置)。这样,我们就需要一个机构能够同步这些全局名字。这就是 master 的服务。它的作用就是广播同步所有的全局名字,以及加入进来的 skynet 节点的地址。本质上,这些地址也是一种名字。同样可以用 key-value 的形式储存。即,每个 skynet 节点号对应一个字符串的地址。
具体的, master 会监听一个端口(在 config 里配置为 standalone 项),每个 skynet 节点都会根据 config 中的 master 项去连接 master 。master 再安排不同的 harbor 服务间相互建立连接