1,2,3...Skynet框架

一:启动过程,参考http://www.jianshu.com/p/f7e59559a975

通过解析配置文件来启动服务器

例如简单的一个命令./skynet examples/config,就是解析config文件配置服务器的参数与相关进程的启动顺序,这可以满足我们对服务器的需要。

看我当时给出的注释:


这个配置文件实际上就是一段 lua 代码,通常,我们以 key = value 的形式对配置项赋值。从注释可以看出来。

skynet 在启动时,会读取里面必要的配置项,并将配置项以字符串形式保存在 skynet 内部的 env 表中。这些配置项可以通过 skynet.getenv 获取。


下面看看bootstrap要启动的是哪些服务

首先是

skynet.launch()在manager.lua中

先启动launcher服务。skynet.launch(...)主要通过skynet.core模块中的command()函数执行可变参数中的服务,并返回为服务开辟的地址。skynet.name()函数其实就是给返回的地址起一个名字,这个函数里面会先调用globalname()函数去判断在全局表中是否有这个名字,有的话就直接为这个地址设置名字。没有的话还要调用harbor.lua模块中的harbor.globalname函数去注册地址,设置名字。


下面要判断harbor是0还是非0,因为这个会决定是否启动单节点模式下。此时 master 和 address 以及 standalone 都不能设置。可以从代码中看出来


第一句就是断言standalone 等于nil,然后在全局表中设置standalone为true。然后就是调用pcall函数去调用skynet.newservice()函数启动cdummy服务。问题是这是一个什么服务。看cdummy.lua模块中的start()函数,主要是调用skynet.dispatch函数调度新服务的启动,这个服务好像什么也没做?最后返回一个服务地址,并为该地址命名cslave (也就是说这个cslave服务无事可做?)

非0


启动cmaster服务,主要负责监听端口号,并负责握手连接。看看源码

调用socket.listen()函数监听master_addr,master_addr是standalone的地址。socket.listen()函数其实调用了socketdriven C函数(在lua-socket.c中的luaopen_socketdriver函数,返回LUAMOD_API)中的llisten()函数,监听成功就返回1。接着cmaster会调用socket.start()函数。

这个master_addr是0.0.0.0:2013中心节点

这个函数调用socketdriver的lstart()函数,做的工作是获取skynet中socket的上下文,为下面调用connect()函数做准备,这个connect函数会调用作为参数传进来的回调函数,用的是tcp连接。connect函数会唤醒一个休眠的协程完成连接操纵,返回连接id。

接下来会启动cslave服务。这个服务做的事情有点多,主要是与cmaster建立连接。先看看他拿了一些配置项

master地址,就是我们认为设置要连接的地址;

slave_address地址,这里的配置文件设置的地址与master一样,端口号不一样,不是太懂

可以看到开始监听slave_address地址。接着调用socket.open()函数连接到master_addr

driver.connect()函数返回的是socket池中的id,表示连接的套接字已经设置好,可以进行连接。接着connect()函数就唤醒休眠的协程找到socket池中的套接字进行连接。这里会回调cmaster中start函数里面的回调函数。cmaster会拿到driver.connect()函数返回的socket池中的id,然后准备与该套接字进行连接


然后会进行握手尝试,返回的是slave_id和slave_addr。handshake()函数做的事情是调用read_pakage()函数,从之前的套接字中读取数据,也就是cslave中driver.connect()返回的socket池中的id,拿到要连接的slave_id, slave_addr,然后判断这个slave是否已经注册,没有的话就调用report_slave()函数向slave服务发送handshake回应

然后注册slave_node。如果注册成功的话,为slave创建监控进程monitor_slave

注意handshake过程中cslave也对cmaster作出回应

这里也可以看到slave也为master创建monitor_master()进程。这里是双方相互监听,相互通过套接字读取数据


再回到bootstrap.lua中,还要开启datacenterd服务。来看看这个服务做了什么。

这个服务大概就是调用skynet.dispatch()函数通过解析命令对数据进行读写更新。

最后还开启了一个service_mgr服务,注册.service服务。

然后就是我们自己定义的main或start服务了。


sprotoloader.lua 读取协议文件并注册该协议,通过下标加载协议。

proto.lua是客户端跟服务器之间沟通的消息格式,也就是一个协议。

协议的解析的实现在sprotoparser.lua,有点难看懂,后面看懂了再说

sproto.lua是跟具体的package建立协议

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容