多实例的意义

EggBornJS通过多实例的概念来支持多域名站点的开发。启动一个服务,可以支持多个实例运行。实例共享数据表架构,但运行中产生的数据是相互隔离的

多实例的应用场景

比如,我们开发了一套企业业务系统,面向众多企业用户开展服务

再比如,我们开发了一套微信公众号系统,面向众多商家用户开展服务

实例与域名

实例与网站子域名一一对应,比如instance1.cabloy.cominstance2.cabloy.com

测试环境开发环境,EggBornJS启用了一个缺省实例;但在生产环境,需要自行规划实例与子域名的对应关系

实例配置

由于测试环境开发环境均使用EggBornJS提供的缺省实例,因此,只需要针对生产环境配置实例参数

比如,CabloyJS官方后台承载了两个实例,分别是https://admin.cabloy.comhttps://zhennann.cabloy.com,其生产环境的配置如下:

/{project}/src/backend/config/config.prod.js

// instances
config.instances = [
  { subdomain: 'admin', password: '', title: 'CabloyJS', config: {} },
  { subdomain: 'zhennann', password: '', title: '风南集', config: {} },
  ];
名称 说明
subdomain 子域名。如果网址是https://cabloy.com,其对应的subdomain就是空字符串
password 实例中用户root的初始访问密码,默认是123456
title 网站标题
config 实例级别的配置信息,会自动覆盖模块级别config配置

如何使用多实例

引用当前实例id

因为多实例之间的数据是相互隔离的,所以在进行增删改查等操作时,都要带上条件:当前实例id,如

// 当前实例id
const iid = this.ctx.instance.id;
// insert
await this.ctx.db.insert('testParty', {
  iid,
  deleted: 0,
  personCount: 3,
});
名称 说明
ctx.instance 当前实例对象
ctx.instance.id 当前实例id

使用model对象

model对象对ctx.db进行了进一步封装,可以便利的支持多实例软删除

// insert
await this.ctx.model.party.insert({
  personCount: 3,
});