SenecaJS入门
node微服务化
1.1 新建项目
1.2 安装SenecaJS
npm install seneca --save -dev
1.2 安装SenecaJS
初始化并使用 test.js
var seneca = require('seneca')();// create greeting servicevar pattern = { module: 'demo', action: 'greeting' };var action = function (msg, done) {done(null, { answer: 'hello, ' + msg.name });}seneca.add(pattern, action);// clientvar req = {module: 'demo', action: 'greeting', name:'Marlin'}seneca.act( req, function (error, result){if ( error )console.log(error);elseconsole.log(result.answer);
});
运行 node test.js
hello, Marlin
{"kind":"notice","notice":"hello seneca ab51h4akkxqi/1495729709903/61561/3.3.0/-","level":"info","when":1495729710090}
1.3 到底发生什么了?
当 seneca.act() 执行时, SenecaJS 会使用 req 去比对服务注册的 pattern,如果 req 中含有 pattern 的全部属性名和值就匹配上了,如果有多个候选按以下顺序挑选:
属性更多的 pattern 胜出
-
req{a:1,b:2} 会从 {a:1}, {a:1, b:2} 中挑中 {a:1, b:2} 注意,{a:1} 也算匹配,如果只有
{a:1},它就会挑中 -
相同个数的话按字母序排: req{a:1,b:2,c:3} 会从 {a:1,b:2}, {a:1,c:3}中挑中{a:1,b:3}
-
相同字母序的话,较晚注册的胜出 seneca.add({a:1,b:2}, f1).add({a:1,b:2}, f2) 的话,总是 f2
起作用
这样就会找到之前通过 seneca.add() 注册了服务,然后 Seneca 会用收到的消息做为参数去调用 pattern 对应的函数。
2.1 编写服务器
单开一个项目,server.js 内容如下:
var seneca = require('seneca')();// greeting service
var pattern = { module: 'demo', action: 'greeting' };
var action = function (msg, done) {done(null, { answer: 'hello, ' + msg.name });
}
seneca.add(pattern, action);
seneca.listen(7788);
比之前 Hello 那个单进程的例子,就多了最后一行。
2.2 启动服务器
{"kind":"notice","notice":"hello seneca 0mgfudkot8re/1495737576275/64494/3.3.0/-","level":"info","when":1495737576450}
2.3 编写客户端
单开一个项目,client.js 内容如下:
var seneca = require('seneca')();// client
seneca.client(7788);var req = { module: 'demo', action: 'greeting', name:'Marlin' }
seneca.act( req, function (error, result){if ( error ) console.log(error);else console.log(result.answer);
});
比 Hello 例子就多了 seneca.client(7788) 这一行。
2.4 运行客户端
hello, Marlin
{"kind":"notice","notice":"hello seneca wzv6r4jyjiua/1495737582831/64509/3.3.0/-","level":"info","when":1495737583012}
2.5 发生了什么?
seneca.listen(7788) 会在默认主机上用默认协议启动收听请求。服务器启动后,可以用 cURL 命令确认是否工作:
10:02server $ curl -d '{"module":"demo","action":"greeting","name":"Marlin"}' http://localhost:7788/act
{"answer":"hello, Marlin"}
seneca.client(7788) 则告诉 Seneca 服务在默认主机上需要用默认协议通信。
Seneca 自带了 tcp 和 http 传输协议,通过插件模块还能支持更多种。