..
瀏覽 skynet 的 wiki
概述
skynet 本身并不是一個完整可用的游戲服務(wù)端程序, 而僅提供用于搭建完整程序的基本組件 服務(wù)。
所以作為使用者你需清楚知道自己需要什么,因而才能構(gòu)建什么。
好比給你足夠的積木, 能搭出個什么玩意,那便是你的事了。
服務(wù)
服務(wù) 是 skynet 框架中代碼執(zhí)行的基礎(chǔ)載體, 好比程序中的線程, 程序可以是單線程運(yùn)行也可以多線程運(yùn)行, skynet 也可以啟動多個 服務(wù), 并且可以認(rèn)為啟動服務(wù)的代價比啟動一個線程的代價要小的多, 所以我們大可啟動幾千上萬個 服務(wù)。
以游戲為例, 服務(wù)器端通常會為每一個在線的用戶啟動一個 服務(wù), 我們稱之為 用戶服務(wù), 類似你還可以啟動 聊天服務(wù), 戰(zhàn)斗服務(wù), 場景服務(wù), 排行榜服務(wù), 他們都屬于 skynet 的 親兒子, 處于并列同級的關(guān)系. 某個時刻是哪個兒子在執(zhí)行, 已由 skynet 分配好了, 大可暫且不必深究, 放心使用即可。
那么服務(wù)如何作為我們的實(shí)際的業(yè)務(wù)服務(wù)呢? 答案是接收消息、處理消息。skynet 的服務(wù)實(shí)際在做的事情就是接收消息 和 處理消息。聊天服 接收到一條a發(fā)來的消息,說要發(fā)給b,處理動作就是 把消息發(fā)給b。 場景服 收到一條 把a(bǔ)移動到(g,g)的坐標(biāo) 的消息, 處理動作是 移動a的位置到(g,g)。
因而可以簡單理解為,實(shí)現(xiàn)一個具體的服務(wù)就是定義具體業(yè)務(wù)的消息接收和處理方式。
參考wiki: gettingstart
跑一個簡單的服務(wù)出來
簡單的愿望是:啟動一個服務(wù),輸出一行文字 first service start!。
新建 game_s 目錄并使用該目錄進(jìn)行學(xué)習(xí)測試
在 game_s 下建立 service 和 etc 子目錄
service 用于放置自己寫的服務(wù)代碼
etc 用于放置 配置文件,因為可能有不用的啟動配置,所以做成目錄的形式, 眾多配置都放在改目錄下
新建 service/main.lua 作為第一個服務(wù)的實(shí)現(xiàn)
新建 etc/config 作為配置文件
>> mkdir game_s
>> cd game_s
>> mkdir service etc
clone skynet 代碼到 game_s /skynet 下
>> git clone https://github.com/cloudwu/skynet
目錄結(jié)構(gòu)如
.
├── etc
│ └── config
├── service
│ └── main.lua
└── skynet
├── 3rd
├── cservice
├── examples
├── ...
編譯
在skynet 目錄中 make linux, 過程中會下載依賴的其他倉庫
>> cd skynet
>> make linux
之后會在下得到可執(zhí)行文件 skynet
簡單的配置
skynet是需要通過載入一些配置信息來啟動的。
文件 etc/config 中寫入一下信息
root = "./"
thread = 4
logger = nil
start = "main"
harbor = 0
bootstrap = "snlua bootstrap"
lualoader = root .. "skynet/lualib/loader.lua"
luaservice = root .. "skynet/service/?.lua;" ..
root .. "service/?.lua;"
lua_path = root.."skynet/lualib/?.lua;"..root.."skynet/lualib/?/init.lua;"
cpath = root .. "skynet/cservice/?.so;"
lua_cpath = root .. "skynet/luaclib/?.so;"
說明:
- start 示意啟動的第一個服務(wù)的文件名叫 main.lua
- luaservice 示意服務(wù)的文件位置,配置中skynet下的是skynet自帶的服務(wù)存放位置,
service/?.lua是我們自己寫的服務(wù)位置。此時只有一個 main.lua 服務(wù)。 - 需要注意的是配置要求在 game_s 目錄下執(zhí)行啟動命令,才能正確找到相對路徑的位置。如果skynet 目錄在其他位置,那么配置中的路徑也應(yīng)該是可以正確指向 skynet 信息的路徑。
第一個服務(wù)
service/main.lua 文件
local skynet = require"skynet"
skynet.start(function ()
skynet.error("first skynet service !!")
end)
功能是打印一行文字外啥也沒干。
執(zhí)行
skynet/skynet etc/config
輸出
[:00000001] LAUNCH logger
[:00000002] LAUNCH snlua bootstrap
[:00000003] LAUNCH snlua launcher
[:00000004] LAUNCH snlua cdummy
[:00000005] LAUNCH harbor 0 4
[:00000006] LAUNCH snlua datacenterd
[:00000007] LAUNCH snlua service_mgr
[:00000008] LAUNCH snlua main
[:00000008] first service start!
[:00000002] KILL self
看到輸出的自定義文字即算是小功告成了。