多实例的意义
CabloyJS通过多实例的概念来支持多域名/多租户SAAS系统的开发。只需启动一个后端服务,即可支持多个实例同时运行。实例共享数据表架构,但运行中产生的数据是相互隔离的
多实例的应用场景
比如,我们开发了一套企业业务系统,面向众多企业用户开展多租户SAAS服务
再比如,我们开发了一套微信公众号系统,面向众多商家用户开展多租户SAAS服务
实例与子域名的对应机制
CabloyJS通过判断子域名来区分当前在为哪个实例提供服务
比如,用户访问的网站域名是tenant1.my-saas.com,那么子域名就是tenant1,系统会自动为tenant1分配一个实例
- 系统会自动在
ctx中注入子域名和实例信息,那么如何访问呢?
- 1// 子域名
- 2const subdomain = ctx.subdomain;
- 3// 当前实例
- 4const instance = ctx.instance;
- 5// 当前实例id
- 6const iid = ctx.instance.id;
定制子域名
在默认情况下,基于二级域名来获取子域名。可以通过修改配置文件中的参数subdomainOffset来修改计算规则
/{project}/src/backend/config/config.prod.js
- 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.com和https://admin2.zhennann.com,其生产环境的配置如下:
/{project}/src/backend/config/config.prod.js
- 1// instances
- 2config.instances = [
- 3 { subdomain: 'portal', password: '', title: 'CabloyJS', config: {} },
- 4 { subdomain: 'admin2', password: '', title: '风南集', config: {} },
- 5 ];
| 名称 | 说明 |
|---|---|
| subdomain | 子域名。如果网址是https://cabloy.com,其对应的subdomain就是空字符串 |
| password | 实例中用户root的初始访问密码,默认是123456 |
| title | 网站标题 |
| config | 实例级别的配置信息,会自动覆盖模块级别的config配置 |
如何使用多实例
- 引用当前实例id
因为多实例之间的数据是相互隔离的,所以在进行增删改查等操作时,都要带上条件:当前实例id,如
- 1// 当前实例id
- 2const iid = this.ctx.instance.id;
- 3// insert
- 4await this.ctx.db.insert('testParty', {
- 5 iid,
- 6 deleted: 0,
- 7 personCount: 3,
- 8});
| 名称 | 说明 |
|---|---|
| ctx.instance | 当前实例对象 |
| ctx.instance.id | 当前实例id |
- 使用model对象
model对象对ctx.db进行了进一步封装,可以便利的支持多实例和软删除。也就是说,model对象封装了对多实例和软删除的自动化处理,从而使得代码更加干净、简洁
- 1// insert
- 2await this.ctx.model.party.insert({
- 3 personCount: 3,
- 4});
关于
model的更多信息和用法,请参见:Model
评论: