多实例的意义

CabloyJS通过多实例的概念来支持多域名/多租户SAAS系统的开发。只需启动一个后端服务,即可支持多个实例同时运行。实例共享数据表架构,但运行中产生的数据是相互隔离

多实例的应用场景

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

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

实例与子域名的对应机制

CabloyJS通过判断子域名来区分当前在为哪个实例提供服务

比如,用户访问的网站域名是tenant1.my-saas.com,那么子域名就是tenant1,系统会自动为tenant1分配一个实例

  • 系统会自动在ctx中注入子域名实例信息,那么如何访问呢?
  1. 1// 子域名
  2. 2const subdomain = ctx.subdomain;
  3. 3// 当前实例
  4. 4const instance = ctx.instance;
  5. 5// 当前实例id
  6. 6const iid = ctx.instance.id;

定制子域名

在默认情况下,基于二级域名来获取子域名。可以通过修改配置文件中的参数subdomainOffset来修改计算规则

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

  1. 1 config.subdomainOffset = 1;
  • 举例
域名 subdomainOffset subdomain
zhennann.cabloy.com 2(默认值) zhennann
zhennann.cabloy.com 1 cabloy.zhennann

实例配置

1. 测试环境、开发环境

测试环境开发环境,网站域名一般是127.0.0.1或者localhost。系统针对这样的本地场景默认分配了一个缺省实例,因此,不需要做任何额外的配置

2. 生产环境

生产环境,需要自行规划实例与子域名的对应关系

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

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

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

如何使用多实例

- 引用当前实例id

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

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

- 使用model对象

model对象对ctx.db进行了进一步封装,可以便利的支持多实例软删除。也就是说,model对象封装了对多实例软删除的自动化处理,从而使得代码更加干净、简洁

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

关于model的更多信息和用法,请参见:Model