1.0.2 • Published 4 years ago
egg-seneca v1.0.2
egg-seneca
详细说明
- 网关部分: https://www.npmjs.com/package/egg-seneca-gateway
- 子服务部分: https://www.npmjs.com/package/egg-seneca-subserver
使用说明
此为说明文档,请勿下载安装 This is a documentation, do not download the installation
插件以Egg.js
为应用框架,以Seneca
为服务交互支持,提供微服务方案。
整体结构分为两部分:
- 网关部分:安装插件
egg-seneca-gateway
,用以接收外部请求、被动接受子服务嵌入(发现)、提供子服务间交互; - 子服务部分: 安装插件
egg-seneca-subserver
,子服务开发与普通的Egg
应用开发无差异,仅配置和启动时机、其他服务交互方式不同。
暂不支持
REST
和GraphQL
风格
启动顺序
- 先启动
网关
应用,被动等待子服务接入; - 启动
子服务
部分,网关
会生成相应的对外接口、对其他子服务的交互方式;
侵入性
egg-seneca
在设计的过程中尽力避免对原有开发模式的侵入性,熟悉 Egg.js
的同学保持原有的开发方式即可。
与原 Egg.js
开发不同之处有以下几点,敬请阅读:
- 由网关提供主要对外接口,子服务通过配置于启动时接入网关;
- 子服务启动时会开启一个
Seneca Server
以便接收/响应网关数据; - 为Application提供
app.seneca('其他服务名', '操作命令', { 参数对象 })
方式,用于调用其他子服务; - 子服务在启动注册网关过程中,会解析原应用的
EggRouter
,用于生成Seneca Patterns Action
(接收/响应的匹配模式),并将路由表发送至网关,用于由网关生成对外接口。 - 网关维护一个
ClientMap
,用于描述当前子服务的映射表。获取方式为:await app.registryClient.getConfig('SenecaRoutersCache');
- 网关插件不提供服务映射的图形界面,但由网关骨架模拟提供了一个子服务表视图网页展示。网关骨架的获取方式为:
git clone https://github.com/Alalabu/sheu-gateway.git your-gateway
,启动网关骨架后访问地址为:http://网关主机+端口号/
; - 每隔 30s 网关会监测子服务是否依然保持活跃, 若不活跃则删除子服务的外部访问
服务注册
- 子服务通过
egg-seneca-subserver
会解析Egg应用中的Router
集合, 并发布于你的网关(安装了egg-seneca-gateway
的应用)。 - 在网关,会生成相应的
web API
以便客户端调用。 - 例如你的路由地址是
/findAll
,而senecaSubserver
中配置的server.name=user
- 则网关会生成:
/user/findAll
作为统一调用接口
服务之间调用
- 当您的应用需要调用其他微服务应用时,您应该使用
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;
}
- 涉及鉴权的服务间调用时,鉴权内容通常封装于
header
之中。在调用其他子服务时,携带header
作为参数即可(可能会与参数对象中的header冲突):
// {app_root}/app/service/foo.js
async bar() {
const { ctx } = this;
// ctx.app.seneca(服务名, 命令, 参数对象);
const { header } = ctx.request;
const res = await ctx.app.seneca('users', 'register', { header, account: 'abc1004' });
return res;
}