hello-skynet之四:hello-console
之前几节展示了skynet的一些基础用法,本节开始,会把skynet当成一个虚拟机使用,然后用手动敲命令的方式来使用skynet。
本节主要内容:
* snax服务 如何写snax服务 * console服务 敲命令启动snlua/snax服务 * debug_console服务 远程查看/调试服务,执行热更新 * 增加abort服务 从控制台退出skynet * 增加clearcache服务 清理skynet缓存的lua文件
从本节开始,示例项目都采用类似的配置文件/启动方式:
配置文件为config.lua,注意新增加的snax项,用来指定搜索snax服务文件的路径。
...
----------------------------------
-- snax用到的参数
----------------------------------
snax = _skynet.."service/?.lua;"..app_root.."?.lua"
为了简单,项目统一使用主入口服务main.lua,不用master/slave模式。main.lua内容如下:
local skynet = require "skynet"
local skymgr = require "skynet.manager"
local snax = require "snax"
skynet.start(function()
--初始化随机数
math.randomseed( tonumber(tostring(os.time()):reverse():sub(1,6)) )
--启动console服务,并命名为 .console
skymgr.name(".console", skynet.newservice("console"))
--启动debug_console服务,并命名为 .dbgconsole,端口随机(7000-7799)
skymgr.name(".dbgconsole", skynet.newservice("debug_console", 7000 + math.random(800)))
--启动好了,没事做就退出
skynet.exit()
end)
入口服务也很简单,就是分别启动 console 和 debug_console 两个服务,其中debug_console的端口为7000-7999之间的随机端口,具体的端口号可以看skynet的输出信息。
现在,开始步入正题:
1、测试main服务
进入hello-skynet目录,在控制台输入_skynet/skynet hello-console/config.lua_启动skynet
simple$ skynet/skynet hello-console/config.lua
[: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
[:00000009] LAUNCH snlua console
[:0000000a] LAUNCH snlua debug_console 7616
[:0000000a] Start debug console at 127.0.0.1 7616
[:00000008] KILL self
[:00000002] KILL self
看到类似上面的输出,那么恭喜你,hello-console服务启动了,注意下_Start debug console at 127.0.0.1 7616_这一句,表示debug_console的端口为7616(端口随机)
2、启动snlua服务
随便写一个snlua服务s1.lua,然后在控制台直接敲服务名启动
...
s1
[:0000000b] LAUNCH snlua s1
如果没有错误信息,并且有_LAUNCH snlua s1_的日志输出,表示s1服务已经启动成功。
3、启动telnet连接debug_console
新开控制台中断,根据skynet打印出的debug_console端口,进行telnet连接
simple$ telnet 127.0.0.1 7616
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to skynet console
看到这样的提示,表示连接成功,下面敲help看看debug_console都支持的命令
help clearcache clear lua code cache debug debug address : debug a lua service exit exit address : kill a lua service gc gc : force every lua service do garbage collect help This help message info Info address : get service infomation inject inject address luascript.lua kill kill address : kill service list List all the service log launch a new lua service with log logoff logoff address logon logon address mem mem : show memory status service List unique service signal signal address sig snax lanuch a new snax service start lanuch a new lua service stat Dump all stats task task address : show service task detail
具体命令可以自己试试,具体参考debug_console说明。下面是list的结果
list
:00000004 snlua cdummy
:00000006 snlua datacenterd
:00000007 snlua service_mgr
:00000009 snlua console
:0000000a snlua debug_console 7616
:0000000b snlua s1
OK
4、启动snax服务
参考s2.lua,写一个snax服务,然后在控制台启动
snax s2
[:0000000c] LAUNCH snlua snaxd s2
snax服务主要由以下几个部分构成:
init函数 服务启动时调用 exit函数 函数退出时调用 hotfix函数 热更新时调用 accept.xxx 收到send操作xxx时调用 response.xxx 收到call操作xxx时调用,函数返回值即call返回值
切换到debug_console,输入list看看结果:
list
:00000004 snlua cdummy
:00000006 snlua datacenterd
:00000007 snlua service_mgr
:00000009 snlua console
:0000000a snlua debug_console 7616
:0000000b snlua s1
:0000000c snlua snaxd s2
OK
确实多了_:0000000c snlua snaxd s2_这个服务
5、注入snax代码
参考s2-call.lua,该脚本用来执行s2服务的调用,在debug_console注入该脚本
inject c hello-console/s2-call.lua
第二个参数c是s2的服务地址,即上面的list里看到的 :0000000c ,简写为c.
切换到skynet终端,可以看到对应的输出:
[:0000000c] <unnamed> send -> begin call
[:0000000c] hello, console!
[:0000000c] <unnamed> send -> after call
注入成功。
6、snax热更新
参考s2-hotfix.lua,该脚本用来对s2执行热更新,将response.echo的输出增加个前缀。在debug_console重新注入该脚本
inject c hello-console/s2-hotfix.lua
可以看到skynet有_[:0000000c] perform hotfix …_的输出字样,下面我们重新注入s2-call.lua,看看skynet终端的输出:
[:0000000c] <unnamed> send -> begin call
[:0000000c] unnamed->hello, console!
[:0000000c] <unnamed> send -> after call
热更新确实成功了。
7、退出skynet
还需要退出?是的,命令控嘛!
为了方便console调用(其实我是在atom里使用term),写了两个特殊的snlua服务,都放在根目录下:
abort.lua 退出skynet cleancache.lua 清理skynet代码缓存,方便开发调试,功能同debug_console的cleancache命令
下面知道该怎么做了吧? 在skynet终端输入_../abort_(注意前面的../)。。。