Skynet啟動(dòng)examples/config腳本,通過start=”main”開啟了第一個(gè)Skynet的服務(wù)main.lua,這個(gè)文件也在examples中,我們看看這個(gè)文件寫的什么:
第一行先引用skynet這個(gè)庫,這個(gè)是用lua寫的,即lualib/skynet.lua蛔琅。里面定義了這些接口:
skynet.start(): 用于"服務(wù)(service)"的入口函數(shù),加載lua的service服務(wù)時(shí)會(huì)先運(yùn)行這里的代碼,它調(diào)用了luaclib-src/lua_skynet.c里面的callback(),最終調(diào)用Skynet的框架skynet_callback()來設(shè)置回調(diào)函數(shù)。
skynet.newservice(): 用于啟動(dòng)一個(gè)lua寫的"服務(wù)(service)",省略掉.lua后綴名铜犬。它調(diào)用了skynet.call(), 然后skynet.call()調(diào)用luaclib-src/lua_skynet.c里面的send(), 最終調(diào)用Skynet的框架的skynet_send()壓入隊(duì)列耳贬。skynet.call()用于發(fā)送一條消息給Skynet的框架肮疗。消息會(huì)壓入隊(duì)列,等待Skynet框架的調(diào)度践险。
skynet.exit(): 移除"服務(wù)(service)",通過skynet.send()發(fā)送一條消息給Skynet框架來移除lua的這個(gè)"服務(wù)(service)"稀颁。
skynet.monitor(): 用于監(jiān)視"服務(wù)(service)",看它是否關(guān)閉馏谨。
main.lua一共打開了四個(gè)服務(wù):
1别渔、service_mgr這個(gè)是系統(tǒng)的模塊,用于管理服務(wù)。
2惧互、console這個(gè)是系統(tǒng)的模塊,用于輸出哎媚。
3、simpledb這個(gè)是例子的模塊,用于管理Key–Value數(shù)據(jù)喊儡。
4拨与、watchdog這個(gè)是例子的模塊,用于監(jiān)視socket端口,等待數(shù)據(jù)。
main.lua沒有調(diào)用其它函數(shù), 加載完服務(wù), 它也就完成了任務(wù), 所以它最后調(diào)用了skynet.exit()把自己殺掉了艾猜。
現(xiàn)在Skynet已經(jīng)啟動(dòng)了watchdog服務(wù),監(jiān)聽著8888端口,等待客戶端的鏈接买喧。
下面是watchdog服務(wù)的skynet_start()開始函數(shù):
skynet.dispatch()這個(gè)服務(wù)的回調(diào)函數(shù),通過SOCKET[]來調(diào)用函數(shù),這些函數(shù)有:
SOCKET.open()打開agent服務(wù)并啟動(dòng),使用gate來管理socket。SOCKET.close()關(guān)閉agent服務(wù)匆赃。
SOCKET.error()打印錯(cuò)誤信息淤毛。
SOCKET.data()有數(shù)據(jù)到來。
下面就來看看agent服務(wù)的代碼:
前面watchdog調(diào)用SOCKET.open()的時(shí)候就調(diào)用了這里的CMD.start(),在客戶端輸出了”Welcome to skynet”炸庞。
Agent服務(wù)的核心就是注冊了協(xié)議,并根據(jù)協(xié)議把數(shù)據(jù)發(fā)送給simpledb服務(wù)去處理:
協(xié)議的詳細(xì)部分看lualib/skynet.lua钱床。
最后我們看看simpledb服務(wù):
simpledb服務(wù)只是很簡單的處理了SET和GET。
以上只是大概瀏覽了一遍Skynet附帶的例子,了解了一些Skynet提供給lua使用的接口,其他接口可以查看skynet.lua代碼埠居。