Skynet 游戏服务器:3 步跑通第一个服务节点
【免费下载链接】skynetA lightweight online game framework项目地址: https://gitcode.com/GitHub_Trending/sk/skynet
一个 3 人小团队想在两天内上线战斗服,自己写 TCP 重连、消息分帧、跨节点路由,时间肯定不够。Skynet 是一个基于 Actor 模型的轻量级游戏服务器框架,单进程跑几十个互相隔离的服务,靠消息通信,核心业务全部用 Lua 写。照着做完下面这些步骤,你能独立编译框架、把示例服务器启动起来,并跑通一个带 echo 功能的服务节点。
Actor 模型实战:它凭什么扛住并发
- 一个服务就是一个独立的 Lua 虚拟机,业务逻辑之间不共享内存,天然没有锁竞争。
- 服务之间只能传消息,跨服调用在你眼里像普通函数调用,底层其实都是异步消息,写起来不卡线程。
- 网络收发、内存管理(jemalloc)、定时器全部下沉到 C 层,Lua 层只写业务,单进程就能撑起上万条客户端连接。
Lua 游戏框架搭建:从零到第一次启动
环境要求:Linux/macOS、gcc、git,Linux 上先装好 autoconf(jemalloc 依赖)。
git clone https://gitcode.com/GitHub_Trending/sk/skynet cd skynet make linux # macOS 用 macosx ./skynet examples/config # 另开一个终端: ./3rd/lua/lua examples/client.lua示例配置 examples/config 拿来即用,几个关键字段:
| 字段 | 作用 |
|---|---|
| thread | 工作线程数,示例为 8 |
| harbor | 节点编号,单机填 1 |
| start | 入口服务,对应 examples/main.lua |
| address / master | 集群通信地址 |
启动成功后日志长这样,能对上的话说明环境没问题:
[:01000002] LAUNCH snlua launcher [:01000003] LAUNCH snlua cmaster [:01000004] LAUNCH snlua cslave [:01000005] LAUNCH snlua datacenterd [:01000006] LAUNCH snlua service_mgr [:01000007] LAUNCH snlua main客户端连上后,服务端 examples/main.lua 会拉起 watchdog、gate 和一个内存数据库,你发一个 get 请求,就会看到 set 过的值被原样取回来。启动流程由 service/bootstrap.lua 串起来,读一遍就能看懂整条引导链。
三个场景:接客户端、跨节点、落数据
场景一:客户端连进来。示例里是三段式:service/gate.lua 负责端口,每个新连接由 examples/watchdog.lua 派发一个 examples/agent.lua 服务单独服务,互不干扰。想快速验证一个端口,几行 Lua 就够:
local socket = require "skynet.socket" local id = socket.listen("0.0.0.0", 8888) socket.start(id, function(clientid, addr) socket.write(clientid, "Welcome to Skynet!") end)底层实现在 lualib-src/lua-socket.c,Lua 封装在 lualib/skynet/socket.lua。
场景二:两台服务器要互通。节点配置好 harbor 和 address 后,用集群代理按服务名发消息即可:
local cluster = require "skynet.cluster" local proxy = cluster.proxy("node2") proxy:send("testservice", "PING", "hello")实现看 lualib/skynet/cluster.lua,双节点完整跑法在 examples/cluster1.lua。
场景三:数据要落库。框架自带 MongoDB 驱动,协议细节都不用管:
local mongo = require "skynet.db.mongo" local db = mongo.client{host = "127.0.0.1", port = 27017}:getDB("game") local users = db:getCollection("users") users:insert{ _id = "player1001", name = "TestPlayer", level = 1 }Lua 封装在 lualib/skynet/db/mongo.lua,C 驱动是 lualib-src/lua-mongo.c;进程内共享数据则可以走 service/sharedatad.lua。
第一次运行最容易卡的 3 个地方
- ❗ Linux 下 make 卡在 jemalloc:缺 autoconf,装完再编译即可。
- ⚠️ 客户端起不来:examples/client.lua 会硬校验 Lua 版本,必须 5.4,直接用仓库自带的
./3rd/lua/lua,别用系统 lua。 - ⚠️ 端口冲突:示例占用 8888(游戏端口)和 8000(调试控制台),被占了就去 examples/main.lua 改端口参数。
接下来往哪走
- 想看完整的登录流程,读 examples/login/ 里的 gate、login、msgagent 五件套。
- 想按面向对象方式组织服务,看 lualib/snax/ 的服务模板。
- 想逐个功能动手验证,test/ 下的测试脚本可以直接照着写自己的小服务。
【免费下载链接】skynetA lightweight online game framework项目地址: https://gitcode.com/GitHub_Trending/sk/skynet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考