seneca介绍
# Seneca
# 简介
seneca 是一款nodejs的微服务工具包,旨在快速,规范开发微服务之间的通信接口,
本文档是在已经简单了解过seneca之后,一份进阶文档,将seneca开发中一些常用的功能和插件做一个使用说明
# 目录
# 如何编写Seneca插件
几乎所有的功能实现都是以插件形式编写的
除了自己编写插件,主要还有调用一些开源的插件
seneca官网上有部分seneca核心插件,在开发过程中根据不同需求需要调用的
比如:我们用到消息队列中间件来搭建我们的服务通道,使用rabbitMq做消息中间件
那么就需要调用seneca-amqp-transport插件
一个规范的seneca服务启动index.js结构应该是这样的
const Seneca = require('seneca')
Seneca({tag: 'my_microservice'})
.quiet()
.use('my_plugin')
.use('my_init_plugin')
.ready(function() {
console.log('service ready:', this.id)
console.log('plugins:', Object.keys(this.list_plugins()))
})
插件的编写这里就不多讲了
就记录下编写插件中几个注意点:
- 有部分插件可能需要初始化init操作
- 插件如果在初始化的时候出错了,整个seneca将直接崩溃,保证服务上的插件正确初始化。无法保证的情况下就要做服务出故障情况下自动重启
- 插件定义时候的函数名称将是他的插件名称(当然还有其他定义插件名称的方式,不过这个是简单常用的),所以,注意:每个插件定义的时候不要用相同的函数名,这会让你无法区分他们
- 插件开发中,匹配命令没有固定的模式要求,不过为了规范开发,一般都有role和cmd这两个属性来进行匹配
- 默认重复use同一个插件只加载最后的一个,如果你要同一个插件做不同的事,需要同一个插件的不同实例,那么在use的时候需要给每个插件定义不同的tag.这样就不会被覆盖掉
tag的两种添加方式:tag属性,或在字符串后加$tag
// tags.js
var seneca = require('seneca')()
seneca.use( {name:'./bar.js',tag:'AAA'}, {zed:1,color:'red'} )
seneca.use( './bar.js$BBB', {zed:2,color:'green'} )
seneca.act( {foo:'bar',zed:1}, console.log )
seneca.act( {foo:'bar',zed:2}, console.log )
- 在你的一个微服务中,有很多插件,需要很多插件初始化选项,规范的定义方式是将他们都统一放在一个seneca.options.js(默认,会自动加载)中去定义,如果你在开发模式和产品模式下有不同的选项参数,可以定义不同的dev.options.js和prod.options.js,不过这样需要手动加载选项
var seneca = require('seneca')()
seneca.options('./dev.options.js')
# seneca 匹配模式优先级
更多的匹配项为最终被匹配的action
client pin的匹配项很重要
# 基于amqp消息中间件的微服务注意事项
开发过程中发现很多情况会导致服务崩溃 记录几个崩溃的情况
- 如果没有找到匹配项,在amqp消息队列服务中会直接崩溃,所有需要一个通配匹配项来处理
- done无法处理非json结构的数据,amqp 中会直接导致服务崩溃,不能处理Error等,在回调的时候一定要将数据转换成json
# 新的笔记
web 微服务
- 多个微服务共用情况下pin做匹配是非常有必要的,不然act就不知道将消息发给哪个微服务
- 多个相同微服务是无法组成自动负载均衡的,seneca会将消息发送给最后声明的那个client连接
- listen和client也就是是服务端和客户端可以一起声明,但是本地声明的微服务函数(服务端)会优先被匹配
上次更新: 2022/06/02, 13:43:00