skynet 筆記

..

瀏覽 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;"

說明:

  1. start 示意啟動的第一個服務(wù)的文件名叫 main.lua
  2. luaservice 示意服務(wù)的文件位置,配置中skynet下的是skynet自帶的服務(wù)存放位置,service/?.lua 是我們自己寫的服務(wù)位置。此時只有一個 main.lua 服務(wù)。
  3. 需要注意的是配置要求在 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

看到輸出的自定義文字即算是小功告成了。

參考wiki config build

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容