skynet服务的本质与缺陷

skynet是为多人在线游戏打造的轻量级服务端框架,使用c+lua实现。使用这套框架的一个好处就是,基本只需要lua,很少用到c做开发,一定程度上提高了开发效率。但skynet文档也相对较少,所以这里利用一点时间学习和总结skynet相关内容,文章这里就讲解下skynet服务的本质与缺陷,希望能有所帮助。

skynet服务的本质

或许我们对skynet服务有着太多的疑问:

skynet服务究竟是什么,为什么有人说服务是一个lua虚拟机,服务与服务之间的通讯是怎样的,为什么服务的内存高居不下, 为什么拿skynet服务和erlang进程做比较?等等。。。而这一切的答案都在代码里面,让我们一步一步解开她的面纱。

服务创建API

先从skynet服务创建的接口说起,方式如下:

[plain]  view plain copy
  1. skynet.newservice(name, ...)  

看下这个函数的实现:

[plain]  view plain copy
  1. -- skynet.lua  
  2.   
  3. function skynet.newservice(name, ...)  
  4.     return skynet.call(".launcher", "lua" , "LAUNCH", "snlua", name, ...)  
  5. end  

实际上是调用另外一个服务(.launcher)完成skynet服务的创建。看下launcher服务的处理:

[plain]  view plain copy
  1. -- launcher.lua  
  2.   
  3. -- 处理服务的创建  
  4. local function launch_service(service, ...)  
  5.     local param = table.concat({...}, " ")  
  6.     local inst = skynet.launch(service, param)  
  7.     local response = skynet.response()  
  8.     if inst then  
  9.         services[inst] = service .. " " .. param  
  10.         instance[inst] = response  
  11.     else  
  12.         response(false)  
  13.         return  
  14.     end  
  15.     return inst  
  16. end  
  17.   
  18. -- 处理 LAUNCH 类消息  
  19. function command.LAUNCH(_, service, ...)  
  20.     launch_service(service, ...)  
  21.     return NORET  
  22. end  
  23.   
  24.   
  25. -- 处理launcher服务接收到的消息  
  26. skynet.dispatch("lua", function(session, address, cmd , ...)  
  27.     cmd = string.upper(cmd)  
  28.     local f = command[cmd]  
  29.     if f then  
  30.         local ret = f(address, ...)  
  31.         if ret ~= NORET then  
  32.             skynet.ret(skynet.pack(ret))  
  33.         end  
  34.     else  
  35.         skynet.ret(skynet.pack {"Unknown command"} )  
  36.     end  
  37. end)  

也就是调用 skynet.launch(service, param),实际上 .launcher 服务也是通过这函数实现的。

[plain]  view plain copy
  1. -- bootstrap.lua  
  2.   
  3. local launcher = assert(skynet.launch("snlua","launcher"))  
  4. skynet.name(".launcher", launcher)  

为什么要通过另外一个服务创建新的服务?主要目的是为了方便管理所有服务,比如统计,gc,杀掉服务等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值