skynet框架應用 (三) 構建服務的基礎API

3 構建服務的基礎API

local skynet = require "skynet" 

--conf配置信息已經寫入到註冊表中,通過該函數獲取註冊表的變量值
skynet.getenv(varName) 。

--設置註冊表信息,varValue一般是number或string,但是不能設置已經存在的varname
skynet.setenv(varName, varValue) 

--打印函數
skynet.error(...)

--用 func 函數初始化服務,並將消息處理函數註冊到 C 層,讓該服務可以工作。
skynet.start(func) 

--若服務尚未初始化完成,則註冊一個函數等服務初始化階段再執行;若服務已經初始化完成,則立刻運行該函數。
skynet.init(func) 

--結束當前服務
skynet.exit() 

--獲取當前服務的句柄handler
skynet.self()

--將handle轉換成字符串
skynet.address(handler)

--退出skynet進程
require "skynet.manager"   --除了需要引入skynet包以外還要再引入skynet.manager包。
skynet.abort()

--強制殺死其他服務
skynet.kill(address) --可以用來強制關閉別的服務。但強烈不推薦這樣做。因爲對象會在任意一條消息處理完畢後,毫無徵兆的退出。所以推薦的做法是,發送一條消息,讓對方自己善後以及調用 skynet.exit 。注:skynet.kill(skynet.self()) 不完全等價於 skynet.exit() ,後者更安全。

3.1 編寫一個test服務

  1. 編寫一個最簡單的服務test.lua

    --引入或者說是創建一個skynet服務
    local skynet = require "skynet" 
    --調用skynet.start接口,並定義傳入回調函數
    skynet.start(function()
    skynet.error("Server First Test")
    end)
  2. 修改exmaple/config文件中的start的值爲test,表示啓動test.lua,修改之前請備份

    include "config.path"
    -- preload = "./examples/preload.lua"   -- run preload.lua before every lua service run
    thread = 2
    logger = nil
    logpath = "."
    harbor = 1
    address = "127.0.0.1:2526"
    master = "127.0.0.1:2013"
    start = "test"  -- main script  --將start的值修改爲test
    bootstrap = "snlua bootstrap"   -- The service for bootstrap
    standalone = "0.0.0.0:2013"
    -- snax_interface_g = "snax_g"
    cpath = root.."cservice/?.so"
    -- daemon = "./skynet.pid"
  3. 通過skynet來運行test.lua

    $ ./skynet examples/config

    運行結果

    $ ./skynet examples/config
    [:01000001] LAUNCH logger 
    [:01000002] LAUNCH snlua bootstrap
    [:01000003] LAUNCH snlua launcher
    [:01000004] LAUNCH snlua cmaster
    [:01000004] master listen socket 0.0.0.0:2013
    [:01000005] LAUNCH snlua cslave
    [:01000005] slave connect to master 127.0.0.1:2013
    [:01000004] connect from 127.0.0.1:52132 4
    [:01000006] LAUNCH harbor 1 16777221
    [:01000004] Harbor 1 (fd=4) report 127.0.0.1:2526
    [:01000005] Waiting for 0 harbors
    [:01000005] Shakehand ready
    [:01000007] LAUNCH snlua datacenterd
    [:01000008] LAUNCH snlua service_mgr
    [:01000009] LAUNCH snlua test
    [:01000009] Server First Test
    [:01000002] KILL self

    注意:千萬不要在skynet根目錄以外的地方執行skynet,例如:

    $ cd examples
    $ ../skynet config
    try open logger failed : ./cservice/logger.so: cannot open shared object file: No such file or directory
    Can't launch logger service
    $ 

​ 以上出現找不到logger.so的情況,其實不僅僅是這個模塊找不到,所有的模塊都找不到了,因爲在config包含的路勁conf.path中,所有的模塊路勁的引入全部依靠着相對路勁。一旦執行skynet程序的位置不一樣了,相對路勁也會不一樣。

  1. 添加自己的LUA腳本路勁

    例如:添加my_workspace目錄,則只需在luaservice值的基礎上再添加一個root.."my_workspace/?.lua;",注意:各個路勁通過一個; 隔開。

    把我們的剛纔寫的test.lua丟到my_workspace中

    $ mv examples/test.lua my_workspace/

    順便將example下的conf以及conf.path也拷貝一份到my_workspace

    $ cp examples/config my_workspace/
    $ cp examples/config.path my_workspace/

    這次運行的時候就可以這樣了:

    $ ./skynet my_workspace/conf

3.2 另外一個種啓動服務的方式

另一種方式啓動想要的服務,可以在main.lua運行後,在console直接輸入需要啓動的服務名稱.

  1. 先啓動main.lua服務,注意還原examples/conf默認配置,並且在example/conf.path添加自己的服務目錄

   $ ./skynet examples/conf  #conf中start配置爲啓動main.lua
   [:01000001] LAUNCH logger 
   [:01000002] LAUNCH snlua bootstrap
   [:01000003] LAUNCH snlua launcher
   [:01000004] LAUNCH snlua cmaster
   [:01000004] master listen socket 0.0.0.0:2013
   [:01000005] LAUNCH snlua cslave
   [:01000005] slave connect to master 127.0.0.1:2013
   [:01000004] connect from 127.0.0.1:52698 4
   [:01000006] LAUNCH harbor 1 16777221
   [:01000004] Harbor 1 (fd=4) report 127.0.0.1:2526
   [:01000005] Waiting for 0 harbors
   [:01000005] Shakehand ready
   [:01000007] LAUNCH snlua datacenterd
   [:01000008] LAUNCH snlua service_mgr
   [:01000009] LAUNCH snlua main
   [:01000009] Server start
   [:0100000a] LAUNCH snlua protoloader
   [:0100000b] LAUNCH snlua console
   [:0100000c] LAUNCH snlua debug_console 8000
   [:0100000c] Start debug console at 127.0.0.1:8000
   [:0100000d] LAUNCH snlua simpledb
   [:0100000e] LAUNCH snlua watchdog
   [:0100000f] LAUNCH snlua gate
   [:0100000f] Listen on 0.0.0.0:8888
   [:01000009] Watchdog listen on 8888
   [:01000009] KILL self
   [:01000002] KILL self

​ 2. 在啓動的main服務中,直接輸入test,回車

   $ ./skynet examples/config
   [:01000001] LAUNCH logger 
   [:01000002] LAUNCH snlua bootstrap
   [:01000003] LAUNCH snlua launcher
   [:01000004] LAUNCH snlua cmaster
   [:01000004] master listen socket 0.0.0.0:2013
   [:01000005] LAUNCH snlua cslave
   [:01000005] slave connect to master 127.0.0.1:2013
   [:01000004] connect from 127.0.0.1:52698 4
   [:01000006] LAUNCH harbor 1 16777221
   [:01000004] Harbor 1 (fd=4) report 127.0.0.1:2526
   [:01000005] Waiting for 0 harbors
   [:01000005] Shakehand ready
   [:01000007] LAUNCH snlua datacenterd
   [:01000008] LAUNCH snlua service_mgr
   [:01000009] LAUNCH snlua main
   [:01000009] Server start
   [:0100000a] LAUNCH snlua protoloader
   [:0100000b] LAUNCH snlua console
   [:0100000c] LAUNCH snlua debug_console 8000
   [:0100000c] Start debug console at 127.0.0.1:8000
   [:0100000d] LAUNCH snlua simpledb
   [:0100000e] LAUNCH snlua watchdog
   [:0100000f] LAUNCH snlua gate
   [:0100000f] Listen on 0.0.0.0:8888
   [:01000009] Watchdog listen on 8888
   [:01000009] KILL self
   [:01000002] KILL self
   test    #終端輸入
   [:01000010] LAUNCH snlua test 
   [:01000010] Server First Test   #服務已經啓動

3.3 環境變量

​ 1、預先加載的環境變量是在conf中配置的,加載完成後,所有的service都能去獲取這些變量。

​ 2、也可以去設置環境變量,但是不能修改已經存在的環境變量。

​ 3、環境變量設置完成後,當前節點上的所有服務都能訪問的到。

​ 4、環境變量設置完成後,及時服務退出了,環境變量依然存在,所以不要濫用環境變量。

例如在conf中添加:

myname = "Dmaker"
myage = 20

示例代碼:testenv.lua

local skynet = require "skynet" 

skynet.start(function()
    --獲取環境變量myname和myage的值,成功返回其值,如果該環境變量不存在返回nil
    local name = skynet.getenv("myname")    
    local age = skynet.getenv("myage")  
    skynet.error("My name is", name, ",", age, "years old.")
    
    --skynet.setenv("myname", "coder")  --不要嘗試設置已經存在的變量值,會報錯
    --skynet.setenv("myage", 21)

    skynet.setenv("mynewname", "coder") --設置一個新的變量
    skynet.setenv("mynewage", 21)

    name = skynet.getenv("mynewname")   
    age = skynet.getenv("mynewage") 
    skynet.error("My new name is", name, ",", age, "years old soon.")
    skynet.exit()
end)

3.4 skynet.init的使用

​ skynet.init用來註冊服務初始化之前,需要執行的函數。也就是在skynet.start之前運行。

示例代碼:testinit.lua

local skynet = require "skynet" 

skynet.init(function()
        skynet.error("service init")
end)

skynet.start(function()
    skynet.error("service start")
end)

運行結果:

[:01000009] service init    #先運行skynet.init
[:01000009] service start   #運行skynet.start函數

發佈了101 篇原創文章 · 獲贊 117 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章