多实例的意义
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
评论: