skynet源码分析(一)目录结构

  要学习 skynet 源码,首先需要了解源码的文件分布,skynet 的源码排布还是很有规范的,利于了学习。本篇会以 1.4.0 版本的 skynet 源码为准,对各个文件夹其中包含的代码做一个大致的说明。

3rd 第三方库

  • jemalloc 内存分配默认使用了 jemalloc, 如果不使用也可以,加编译选项 -DNOUSE_JEMALLOC , 参考资料:jemalloc
  • lpeg 一个文本模式匹配库,貌似是 lua 作者写的, 业务里没用,只有 sproto 用到了,可以不管,参考资料:LPeg
  • lua 一直用的最新版的,已经 5.4.4 了,参考资料:lua
  • lua-md5 为 lua 提供 md5 支持,参考资料:md5

examples 示例服务

  • login 一个简单的登录示例模块

lualib lua 库

  • compat10 为了兼容 skynet 1.0 及以前的目录做的一堆兼容转换,如果要用的话,把本目录加到 lua_path 里。

  • http 提供了对 http 的相关支持,不是特别完善,但是基本上也算是该有的都有了,做后台那些可以用。

  • skynet 提供了大量的框架功能相关的 lua 库

    • datasheet 把一个复杂的有一定限制的 lua 表,转换为一块 C 内存,由多个 lua 服务共享读取。参考资料:skynet_datasheet

    • db 提供了数据库的接口

      • redis 包含了两部分,同名子目录里的是 redis 集群的客户端,外面的文件是单机 redis 客户端。
      • mongo 提供了 mongodb 的接口。
      • mysql 提供了 mysql 的接口。
    • sharedata 旧的共享数据模块,已经被上面的 datasheet 取代了。

  • snax 一个由框架提供的简化服务的模块,其实没啥用,本来用法就不复杂,参考资料:snax

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 自旋锁,也是用原子操作来实现的
Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计