要学习 skynet 源码,首先需要了解源码的文件分布,skynet 的源码排布还是很有规范的,利于了学习。本篇会以 1.4.0 版本的 skynet 源码为准,对各个文件夹其中包含的代码做一个大致的说明。
3rd 第三方库
- jemalloc1 Skynet 的内存分配库默认使用了 jemalloc,也可以不使用。
- lpeg2 一个文本模式匹配库,作者也是 Lua 的作者,用在 sproto 中。
- lua3 Skynet 一般使用最新版的 Lua,本版本使用 lua 5.4.4。
- lua-md54 为 lua 提供 md5 支持。
examples 示例服务
- login 一个简单的登录示例模块
lualib lua 库
- compat10 为了兼容 skynet 1.0 及以前的目录做的一堆兼容转换,如果要用的话,把本目录加到 lua_path 里。
- http 提供了对 http 的相关支持,不是特别完善,但是基本上也算是该有的都有了,做后台那些可以用。
- skynet 提供了大量的框架功能相关的 lua 库
- snax7 一个用来简化服务的模块。
lualib-src lua 库的 C 源码
- sproto 内置了一份 sproto 的代码,如果项目用 protobuf 那就不用看了,貌似几乎没人用这个东西,参考资料:sproto
service 内置服务
service-src C 模块源码
- service_gate C 层的一个网关模块,貌似已经用 lua 重构了,参考资料:skynet_gate_lua_version
- service_harbor harbor, 这个应该没啥人用吧,本意是想抹平本进程和跨进程服务之间的通信的差距,参考资料:skynet_harbor_redesign
- service_logger 日志模块
- service_snlua 最重要的提供 lua 服务能力的模块,所有 lua 服务都是从该模块启动的。
skynet-src 框架源码
- atomic 封装了原子操作的宏定义,在支持 C11 的编译器中,直接用了标准库的 atomic 库,参考资料:原子操作库、skynet_stdatomic
- malloc_hook 内存相关的操作在这里,包括了服务的内存统计,内存泄露检查等
- rwlock 提供了一份读写锁的实现,使用了原子操作来实现
- skynet_daemon 封装了 daemon 相关的操作,提供了把指定 pidfile 文件相关的进程转为 daemon 或者取消 daemon 的接口
- skynet_env 提供了全局 env 变量的操作,使用了一个 lua 虚拟机进行管理
- skynet_error 处理服务的错误信息,把错误信息发送给之前设置过的 logger 服务
- skynet_handle 提供了服务名字到 handle 和从 handle 到服务结构的两个映射关系,要通过名字查服务的话都要过这里
- skynet_harbor harbor 功能的实现
- skynet_imp 一些乱七八糟的东西扔在这里,估计是没地方放的东西
- skynet_log 日志功能的实现
- skynet_main 进程入口文件,定义了 main 函数,处理了配置
- skynet_malloc 声明了内存操作的接口,实际调用了 malloc_hook 中的定义
- skynet_module C 模块的管理部分,提供了 C 模块的全局注册,查询等功能
- skynet_monitor 每个 work 线程有一个 skynet_monitor 结构,用来给 monitor 线程检查用的
- skynet_mq 消息队列,包括了全局队列和服务队列的实现都在这里
- skynet_server 服务的管理模块,包含了全局管理结构和各种服务相关的操作接口
- skynet_socket socket 相关的功能实现,包括了全局 socket 管理器和 socket 的操作接口实现
- skynet_start 框架启动函数,包括了各种线程的启动,各类全局管理模块的初始化
- skynet_timer 时间相关功能的实现,除了全局时间管理模块,还有定时器的实现,时间轮
- socket_buffer 给 socket 定义了一个发送缓冲结构
- socket_epoll IO 复用的 epoll 实现
- socket_info 定义了 socket 的连接信息结构
- socket_server socket 线程的核心操作,定义了 socket 相关的几乎全部操作
- spinlock 自旋锁,也是用原子操作来实现的