README
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;
}