skynet各层表现
skynet重要模块和服务
gate.so:为整个skynet提供socket功能
snlua.so:启动多个lua服务
skynet自带的模块中有一个重要的模块是snlua.so模块,通过snlua.so和指定lua脚本文件可以启动多个lua编写的服务,不用每个服务都是用c来编写,而且大部分逻辑都是在 lua 脚本下开发,只有需要考虑性能的模块才用 C 语言开发成库,直接提供给 lua 调用。
launcher.lua:在lua中启动服务
skynet.lua:lua常用功能封装
skynet.so:lua调用skynet功能
skynet重要文件
skynet_handle.c:管理服务唯一的handle
skynet_module.c:启动c编写的so模块
skynet_monitor.c:监视服务死循环
skynet_mq.c:消息队列
skynet_timer.c:定时器
skynet_socket.c:Socket
skynet_master.c:不同skynet节点服务名字中心服务
skynet_harbor.c:不同skynet节点通讯
每个模块需要实现四个最基本的函数,create/init/release/signal。 create做内存分配。init做初始化,它可能会做一些其它的事情,比如打开网络,打开文件,函数回调挂载等等。relase做资源回收,包括内存资源,文件资源,网络资源等等,signal是发信号,比如kill信号,告诉模块该停了。
网络
网络部分是一个服务器最基础最核心的部分,这个技术也已经是非常成熟了,现在已经很少有人自己实现一个网络相关的库了。skynet的网络库是自己实现的。
实际上云风只实现了epoll和kqueue,windows上的变种请自行搜索吧。
epoll和kqueue的实现分别在skynet_epoll.h和epoll_kqueue.h当中。epoll的函数其实就是epoll_create/epoll_ctl/epoll_del/epoll_wait这几个,要注意的是skynet中的epoll_create的参数是1024。所以连接数上不去的话很可能就是这里限制了。
skynet在skynet_poll.h中根据平台的不同包含了不同的头文件,屏蔽了平台相关性。然后在socket_server.c中实现了网络服务的逻辑。
然后skynet在skynet_socket.c中对socket_server.c中的逻辑再次做了一个封装,还添加了socket客户端相关的函数,就是connect/send/close之类的函数。
为了方便lua层使用socket,在lua-socket.c中再将对skynet_socket.c进行了一次封装。这个封装就是c语言层和lua语言层的相互转换。目前只支持tcp和udp,基于tcp上的http/websocket之类统统是不支持的。
skynet的配置加载
skynet的配置文件是以lua格式来写的。使用过skynet的都清楚skynet的启动命令是skynet config_file_name。配置文件名是作为命令行参数传给skynet进程的。
skynet进程启动以后,会读取config文件,然后解析这个lua文件。然后把相关的配置信息设置到lua的环境变量里。
C层读取配置的话是要从lua环境变量里去取的。
参考:
《skynet_summary》
《Skynet框架之菜鸟手册》
https://www.jianshu.com/p/1aa8b0fc6c11