什么是 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](...)
    end

    skynet 内部的消息分两种:

    • 单向推送 skynet.send
    • 发起请求,等待回应 skynet.call

    对于请求的回应操作,使用 skynet.ret 接口来实现,但此 API 并不负责数据打包。所以,如果使用 lua 协议,通常写成 skynet.ret(skynet.pack(...)) 的形式,以完成 数据打包回应请求 这两个步骤。

  • 为了兼容 skynet.sendskynet.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 服务中的 response
  • pub:对应于 snax 服务中的 subscribe
  • snax.exit:结束一个 snax 服务的接口

snax.newservice 会在 config 文件中配置的 snax 路径上找到 "foobar" 模块并加载。由于 skynet 的核心是 C 编写的,所以服务的启动参数只能是一个 字符串。为了更加灵活,snax 在实现时规定了启动服务的消息,newserice 的启动参数是用 lua 协议打包,通过启动消息传递的,也就不受限制了。


其他:

snax 不仅提供了更为简便的创建服务的 API,而且还提供了热更新的接口,随后的内容会做详细的展开和应用举例。


参考:

Skynet服务器框架(九) snax框架的更多相关文章

  1. Skynet服务器框架(八) 任务和消息调度机制

    引言: 在我看来,消息和任务调度应该是skynet的核心,整个skynet框架的核心其实就是一个消息管理系统.在skynet中可以把每个功能都当做一个服务,整个skynet工程在执行过程中会创建很多个 ...

  2. Skynet服务器框架(十) CentOS 防火墙设置

    引言: 今天修改了 skynet 服务器的 IP 地址(即 config 文件中的 address 和 master 两项参数,IP 与当前及其的保持一致,端口号为 2017),然后使用一个简单的客户 ...

  3. [Python之路] 实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦)

    本文描述如果简单实现自定义Web服务器与自定义简易框架,并且不断进行版本迭代,从而清晰的展现服务器与Web框架之间是如何结合.如何配合工作的.以及WSGI是什么. 本文帖的代码有点多,但基本每次迭代修 ...

  4. 【2022-09-09】Django框架(九)

    Django框架(九) cookie与session简介 网址的发展史: 1.起初网站都没有保存用户功能的需求,所有用户访问返回的结果都是一样的. 比如:新闻网页,博客网页,小说... (这些网页是不 ...

  5. 关于vue 框架与后台框架的混合使用的尝试

    这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...

  6. 关于vue 框架与后台框架的混合使用的尝试------转载

    这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...

  7. 分布式定时任务框架——python定时任务框架APScheduler扩展

    http://bbs.7boo.org/forum.php?mod=viewthread&tid=14546 如果将定时任务部署在一台服务器上,那么这个定时任务就是整个系统的单点,这台服务器出 ...

  8. SSM框架和SSH框架的区别

    SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...

  9. 整合Spring框架和Hibernate框架

    -------------------siwuxie095                                 整合 Spring 框架和 Hibernate 框架         1.导 ...

随机推荐

  1. Phred-scale quality scores的相关内容

    phred-scale quality score起源于人类基因组计划,最初是用来评估碱基质量分数,后来,被广泛的推广到基因领域的其他内容. phred-scalequality score表示这件事 ...

  2. 20145307第四次JAVA学习实验报告

    20145307实验四 Android开发基础 实验内容 基于Android Studio开发简单的 Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事 ...

  3. #ifndef用法

    用于避免重复包含头文件 #ifndef _STDIO_H_ #define _STDIO_H_ ...... #endif

  4. cogs 1487. 麻球繁衍

    ★   输入文件:tribbles.in   输出文件:tribbles.out   评测插件 时间限制:3 s   内存限制:256 MB [题目描述] 万有引力定律: “使物体相互靠近的力的大小与 ...

  5. 线程实现Runnable接口比继承Thread的优势

    1.适合多个相同程序代码的线程去处理同一资源,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想.2.可以避免由于java单继承特性带来的局限.3.增强了程序的健壮性,代码 ...

  6. 【网络结构】GoogLeNet inception-v1:Going deeper with convolutions论文笔记

    目录 0. 论文链接 1. 概述 2. inception 3. GoogleNet 参考链接 @ 0. 论文链接 1. 概述   GoogLeNet是谷歌团队提出的一种大体保持计算资源不变的前提下, ...

  7. LA 5846 霓虹灯广告牌(单色三角形问题)

    https://vjudge.net/problem/UVALive-5846 题意: 圆周上有n个点,两两相连,只能涂红色或蓝色.求单色三角形的个数. 思路: 这个问题在训练指南105页有详细讲解. ...

  8. 字体渲染技术(字体抗锯齿技术) -webkit-font-smoothing: antialiased;

    1.-webkit-font-smoothing控制的字体渲染只对MacOS的webkit有效.所以,你在MacOS测试环境下面设置-webkit-font-smoothing时,只要你不把它设置为n ...

  9. PHP函数前面添加@的作用

    @是PHP提供的错误信息屏蔽的专用符号. 比如在一个函数前使用@ @mysql_query 不会出现Warning, 而原来mysql_query 在遇到错误时会在页面上访提示Warning. @是可 ...

  10. 基础系列(1)之干掉JavaScript变量作用域

     今天去某顺公司面试,发现一些基础知识都不记得了,于是乎决定把js基础系列的全部梳理一遍,今天就整理下js变量作用域的相关基础知识点,配合最常遇到的笔试题阐述. 题一: var g = "a ...