egg-seneca-subserver
v1.0.38
Published
基于 Egg.js + Seneca 的微服务模型,子服务插件
Downloads
6
Readme
egg-seneca-subserver
使用说明
插件以Egg.js
为应用框架,以Seneca
为服务交互支持,提供微服务方案。
整体结构分为两部分:
- 网关部分:安装插件
egg-seneca-gateway
,用以接收外部请求、被动接受子服务嵌入(发现)、提供子服务间交互; - 子服务部分: 安装插件
egg-seneca-subserver
,子服务开发与普通的Egg
应用开发无差异,仅配置和启动时机、其他服务交互方式不同。
启动顺序
- 先启动
网关
应用,被动等待子服务接入; - 启动
子服务
部分,网关
会生成相应的对外接口、对其他子服务的交互方式;
使用场景
- 基于 Egg.js + Seneca 的微服务模型, 子服务部分。
- 暂不支持
REST
和GraphQL
风格
安装
$ npm i egg-seneca-subserver --save
开启插件
// {app_root}/config/plugin.js
exports.senecaSubserver = {
enable: true,
package: 'egg-seneca-subserver',
};
详细配置
// {app_root}/config/config.default.js
/**
* 配置服务器启动项
*/
// 你的服务器定位(必要)
exports.cluster = {
listen: {
port: 20980,
hostname: '127.0.0.1',
// path: '/var/run/egg.sock',
},
};
// seneca subserver 配置
exports.senecaSubserver = {
appid: 'your appid',
appsecret: 'your appsecret',
devLog: true, // 是否显示控制台交互日志, 默认为 false
server: { // 本服务的服务器描述
name: 'users', // service name
port: 39091,
title: '用户服务', // 当前服务的标题文本
describe: '这个服务用于负责用户相关业务', // 当前服务的描述
},
gateway: { // 网关配置
host: '127.0.0.1',
port: 50005,
type: 'tcp',
version: 1.7, // 注入网关的服务版本号
},
};
服务注册
egg-seneca-subserver
会解析Egg应用中的Router
集合, 并发布于你的网关(安装了egg-seneca-gateway
的应用)。- 在网关,会生成相应的
web API
以便客户端调用。 - 例如你的路由地址是
/findAll
,而senecaSubserver
中配置的server.name=user
- 则网关会生成:
/user/findAll
作为统一调用接口
微服务集视图一览
- 为方便展示网关可调用服务集合,网关启动后在浏览器输入
http://网关主机+端口号/
则可以访问微服务集图形界面视图。 - 注意:集成视图一览的网关需通过
git clone https://github.com/Alalabu/sheu-gateway.git your-gateway
进行获取, 项目包含了egg-seneca-gateway
插件引用以及React + Ant design
视图模块, 便于二次修改. - 为了配合更好的视图一览效果,您的
Egg Router
应该定义路由名称,例如:
// {app_root}/app/router.js
module.exports = app => {
const { router, controller } = app;
router.get('主页', '/', controller.home.index);
router.get('查询', '/query', controller.home.query);
router.post('检查Token', '/checkToken', controller.home.checkToken);
router.post('登录', '/login', controller.user.login);
router.post('注册', '/register', controller.user.register);
};
其他服务调用
- 当您的应用需要调用其他微服务应用时,您应该使用
seneca
进行tcp模式调用:
// {app_root}/app/service/foo.js
async bar() {
const { ctx } = this;
// ctx.app.seneca(服务名, 命令, 参数对象);
const res = await ctx.app.seneca('users', 'register', { account: 'abc1004' });
return res;
}
更新日记
1.0.37
:
- 增加对
content-type: text/xml
网关数据发放的支持,在网关部分会将xml
解析成js
对象,并将子服务请求体改为content-type: application/json
,将xml
数据作为请求参数封装于POST请求的ctx.request.body.$options.xml
中,子服务可以判断该值是否存在并直接进行操作。1.0.36
:- 修复了一个由于响应数据中带有长数字的字符串,在
JSON.parse
时发生的数字截断,之后的响应数据将不在自动解析,由调用者自行处理;1.0.35
:- 配置添加
senecaSubserver.devLog = true | false
, 用以开启或关闭控制台日志, 默认关闭