Skynet服务器框架(九) snax框架
什么是 snax
由于 skynet 的 API 还是比较偏底层,为简化服务的编写提供一套简单的 API ,便有了这套 snax 框架,解决的问题:
“编写一个
skynet内部服务,处理发送给它的消息。snax并不会取代skynet原有的 api ,只是方便实现这类简单需求而已。”—— 云风
换句话说,snax 就是对 skynet API 的部分封装而产生的一个框架
编写 skynet 服务:
在了解如何使用 snax 来编写一个服务之前,先大致了解一下直接使用 skynet 的 API 是如何创建一个服务的,这里服务仅实现消息响应部分的功能:
通常是在
skynet.start中会调用skynet.dispatch接口:skynet.start(function() skynet.dispatch("lua", function(session, address, ...) dispatch(...) end)首先,用
skynet.start来注册 skynet 服务的启动函数,并确定这个服务用什么协议来解析消息(一般选择“lua”协议,因为这种协议是为 lua 设计的,可以最高效地把 lua 原生数据序列化);然后,规定消息的第一个传入数据为字符串,表示消息类型,利用此类型区分不同消息的响应:
local command = {} function command.foobar(...) end local function dispatch(cmd, ...) command[cmd](...) endskynet 内部的消息分两种:
- 单向推送
skynet.send - 发起请求,等待回应
skynet.call
对于请求的回应操作,使用
skynet.ret接口来实现,但此 API 并不负责数据打包。所以,如果使用 lua 协议,通常写成skynet.ret(skynet.pack(...))的形式,以完成数据打包和回应请求这两个步骤。- 单向推送
为了兼容
skynet.send和skynet.call的调用需求,需要对dispatch做一下优化:local function dispatch(cmd, ...) --先判断command函数集中包不包含当前传入 cmd 的处理函数,假如未定义则不再往下执行 local f = assert(command[cmd]) --执行 cmd 对应的处理函数 local r = f(...) --判断是否有返回结果 if r ~= NORET then --打包数据并回传给消息发送方 skynet.ret(skynet.pack(r)) end end启动 skynet 服务的接口:
skynet.newservice(name,...)这里
name是服务对应的.lua文件的名称。
编写 snax 服务:
1.配置:
要使用 snax 框架来编写我们的服务,首先需要在 Config 中配置 snax 参数项,配置内容是查找使用 snax 框架格式编写的服务文件的目录。
2.格式要求:
每个 snax 服务都有一个用于启动服务的名字,推荐按 lua 的模块命名规则,但目前不推荐服务名中包含”点”(在路径搜索上尚未支持 . 与 / 的替换)。在启动服务时会按查找路径搜索对应的文件。
snax 服务用 lua 编写,但并不是一个独立的 lua 程序。它里面包含了一组 lua 函数,会被 snax 框架分析加载。
3.使用 snax 框架:
snax 框架是把一些通用代码放到一个简单的框架中而得到的一个更易于使用的 API 。看完了 skynet API 的实现过程之后,我们再用 snax 来编写一个功能完全相同的服务,然后进行对比讲解:
-- foobar服务
local i = 0
local hello = "hello"
function response.echo(data)
return data, i
end
function subscribe.touch()
i = i + 1
end
function init( ... )
print ("service start:", ...)
end
function exit(...)
print ("service exit:", ...)
end
init():启动此服务时会调用此函数,并把启动参数传给它,这是每个 snax 服务都必须定义的;exit():这是此 snax 服务退出要执行的代码,通常用于响应服务退出时间,同样也可以传入一些参数;response.:以response.开头的函数表示返回值会通过调用skynet.ret返回;subscribe.:以subscribe.开头的函数表示返回值会被扔掉不会返回。
关于 snax 的传入参数,并没有对类型设置项目,可以传入 lua 的复杂数据类型,而 skynet 服务则受限于底层C源码限制,只接受传入字符串类型的启动参数。
4.snax 服务API:
这里以上面写的 snax 服务为例,启动该服务并调用该服务的内部函数:
--启动服务
local p = snax.newservice ("foobar", "hello world")
--调用服务中的函数
print(p.req.echo("foobar"))
print(p.pub.touch())
--退出服务
snax.exit(p)
snax.newservice:这是 snax 框架启动一个 snax 服务的接口,第一个参数是 snax 服务实现脚本的名称,第二个参数才是传入服务中init方法的启动参数;req:对应于 snax 服务中的responsepub:对应于 snax 服务中的subscribesnax.exit:结束一个 snax 服务的接口
snax.newservice会在config文件中配置的snax路径上找到"foobar"模块并加载。由于 skynet 的核心是 C 编写的,所以服务的启动参数只能是一个 字符串。为了更加灵活,snax在实现时规定了启动服务的消息,newserice的启动参数是用 lua 协议打包,通过启动消息传递的,也就不受限制了。
其他:
snax 不仅提供了更为简便的创建服务的 API,而且还提供了热更新的接口,随后的内容会做详细的展开和应用举例。
参考:
Skynet服务器框架(九) snax框架的更多相关文章
- Skynet服务器框架(八) 任务和消息调度机制
引言: 在我看来,消息和任务调度应该是skynet的核心,整个skynet框架的核心其实就是一个消息管理系统.在skynet中可以把每个功能都当做一个服务,整个skynet工程在执行过程中会创建很多个 ...
- Skynet服务器框架(十) CentOS 防火墙设置
引言: 今天修改了 skynet 服务器的 IP 地址(即 config 文件中的 address 和 master 两项参数,IP 与当前及其的保持一致,端口号为 2017),然后使用一个简单的客户 ...
- [Python之路] 实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦)
本文描述如果简单实现自定义Web服务器与自定义简易框架,并且不断进行版本迭代,从而清晰的展现服务器与Web框架之间是如何结合.如何配合工作的.以及WSGI是什么. 本文帖的代码有点多,但基本每次迭代修 ...
- 【2022-09-09】Django框架(九)
Django框架(九) cookie与session简介 网址的发展史: 1.起初网站都没有保存用户功能的需求,所有用户访问返回的结果都是一样的. 比如:新闻网页,博客网页,小说... (这些网页是不 ...
- 关于vue 框架与后台框架的混合使用的尝试
这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...
- 关于vue 框架与后台框架的混合使用的尝试------转载
这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...
- 分布式定时任务框架——python定时任务框架APScheduler扩展
http://bbs.7boo.org/forum.php?mod=viewthread&tid=14546 如果将定时任务部署在一台服务器上,那么这个定时任务就是整个系统的单点,这台服务器出 ...
- SSM框架和SSH框架的区别
SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...
- 整合Spring框架和Hibernate框架
-------------------siwuxie095 整合 Spring 框架和 Hibernate 框架 1.导 ...
随机推荐
- 20145314郑凯杰 《Java程序设计》第4周学习总结
20145314郑凯杰 <Java程序设计>第4周学习总结 所有代码已上传: 教材学习内容总结 ①继承 设计程序中,因们需要设计多个模块,我想到了李晓东以前教我们的三个字"模块化 ...
- 20145324 《Java程序设计》第10周学习总结
20145324 <Java程序设计>第10周学习总结 教材学习内容总结 1.网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输 2.在实际传输数据以前需要将域名转换为IP地 ...
- centos配置yum源为中国镜像源
有时候CentOS默认的yum源不一定是国内镜像,导致yum在线安装及更新速度不是很理想.这时候需要将yum源设置为国内镜像站点.国内主要开源的开源镜像站点应该是网易和阿里云了. 修改CentOS默认 ...
- System.IO命名空间下常用的类
System.IO System.IO.Directory 目录 System.IO.Path 文件路径(包含目录和文件名) System.IO.FileInfo 提供创建.复制.删除.移动和打开文件 ...
- spark(四)yarn上的运行模式
架构图 yarn-cluster yarn-client 区别 Yarn-cluster spark的driver运行在applicationMaster内,启动流程为: 这张图可能比较直观 Yarn ...
- 2017 ACM/ICPC 南宁区 网络赛 Overlapping Rectangles
2017-09-24 20:11:21 writer:pprp 找到的大神的代码,直接过了 采用了扫描线+线段树的算法,先码了,作为模板也不错啊 题目链接:https://nanti.jisuanke ...
- .net 获取浏览器Cookie(包括HttpOnly)
网上好不容易找到的,分享+收藏 一.接口文件 using System; using System.ComponentModel; using System.Net; using System.Run ...
- C5 标准IO库:APUE 笔记
C5 :标准IO库 在第三章中,所有IO函数都是围绕文件描述符展开,文件描述符用于后续IO操作.由于文件描述符相关的操作是不带缓冲的IO,需要操作者本人指定缓冲区分配.IO长度等,对设备环境要求一定的 ...
- 运行UART的程序
1 捎程序的时候,注意,捎入的是norflash,此时的按钮应该在norFlash.2 当捎入成功的时候,开始运行程序时,应该把按钮按回nandflash,因为程序的启动就是在nandflash,他把 ...
- OSI7层网络模型协议精析
OSI7层网络模型协议精析 一.总结 一句话总结:在7层模型中,每一层都提供一个特殊的网络功能.从网络功能的角度观察:下面4层(物理层.数据链路层.网络层和传输层)主要提供数据传输和交换功能,即以节点 ...