Node微服务之Seneca的使用

Seneca在Node微服务中的运用

1.seneca基本用法介绍

准备工作:

npm i -S seneca
npm i -S seneca-basic

#匹配模式

/** demo.js **/
const seneca = require('seneca')()
// 将下列函数cal作为插件使用
seneca.use(cal).act({
    
     cmd: 'add' }, (err,data) => {
    
    
		// 匹配成功返回后执行
		console.log(data) // { data: '123' }
	})


function cal(){
    
    
	this.add({
    
     cmd: 'add' },(msg,respond) => {
    
    
		// 匹配成功执行
		console('add successful')
		
		respond(null,{
    
     data: '123' }
	})
}

上述代码中, add() 方法相当于是添加了一个匹配规则, act() 方法相当于是匹配规则,获得对应数据后执行业务操作。
该部分演示代码只是为了想让大家知道,在函数操作(同步/异步取决于业务)可以被当成插件注册到seneca中使用,并且可以写成插件文件的形式,便于管理维护。

2.seneca与Web应用集成,并实现服务间互相调用

由于在工作中使用的web框架是koa,在这里我们就使用koa进行演示。现在开始准备工作:

npm i -S koa
npm i -S koa-router
npm i -S seneca
npm i -S seneca-basic
npm i -S seneca-web
npm i -S seneca-web-adapter-koa2
npm i -S bluebird

seneca-web与seneca-web-adapter-koa2 主要是用于web应用以及koa2的集成;bluebird用于在服务间通信的调用,它提供了promise调用机制。

核心代码:

/** app.ts **/
import * as koa from 'koa'
import * as koaRouter from 'koa-router';

const app = new koa()
const seneca = require('seneca')()
const senecaWeb = require('seneca-web')
const senecaModule = require('./plugin')
const router = new koaRouter();

seneca
    .use(senecaModule.init)
    .use(senecaWeb, {
    
    
      context: router,
      adapter: require('seneca-web-adapter-koa2')
    }).listen(8082)
  seneca.ready(() => {
    
    
    app.use(seneca.export('web/context')().routes())
  })
require('http').createServer(app.callback()).listen(8081)
/** plugin.ts **/
function init(opts: any) {
    
    
  this.add('$target$:demo', (msg: any, done: any) => {
    
    
    console.log(msg)
    done(null, {
    
     message: 'Successful!' })
  })
}

module.exports = {
    
    
  init
}
/** 业务层面调用 **/
const seneca = require('seneca')()
const bluebird = require('bluebird')
const act = bluebird.promisify(seneca.act, {
    
     context: seneca })

seneca.client({
    
    
    port: '8088',
    // host: '127.0.0.1'
  })
act('$$target:demo', {
    
     a: 1, b: 2 })
    .then((res: any) => {
    
    
      console.log(res)
}).catch((err: any) => {
    
    
      console.log(err)
    })

该部分代码的核心在于插件模块的初始化以及通过 act() 方法进行模式匹配,从而实现参数的传递。seneca.client()声明了act要匹配的服务的位置,并且值得一提的是:seneca在微服务间调用的时候是不与koa共用端口的,除非将seneca的路由与koa路由结合使用。

猜你喜欢

转载自blog.csdn.net/weixin_42371354/article/details/123747733