【摩码】JFinal SAAS 多租户模式系统

JFinal SAAS 多租户模式官网Demo改造的代码示例

杜福忠 作品 授权方式 获取授权

开发各种 JFinal SAAS 多租户系统有近十年了。期间也有陆续分享多租户用到的技术方案文章,上上周社区几个好友想要一套整理好的源码 demo。本来约好上周末分享的,上周中诺如病毒了全家突突。。。
这一拖到本周末搞了两天终于出 V1.0了。。。

本项目依然使用 官网jfinal-demo 做演示,易于学习改造。
增加了几个java文件,用到的技术点(基本都做过分享):
1、Db多数据源;
2、修改_JFinalDemoGenerator添加了一个
_MappingKit 模板,使其支持免启动JF时映射ColumnType方案;
3、Db 自定义的 MyCache 使用 Caffeine 缓存实现租户缓存隔离;
4、自定义全局公共数据共享处理器;
5、租户数据库启动时自动升级执行sql文件;
6、后续继续更新文档。

租户数据库管理.jpg

租户数据存储一般就三种方案:

  1. 独立数据库方案

    • 方案描述:一个租户对应一个独立的数据库,即每个 Tenant 拥有自己独立的 Database。

    • 优点:用户数据隔离级别最高,安全性最好;有助于简化数据模型的扩展设计,满足不同租户的独特需求;数据恢复比较简单,若出现故障,仅需恢复对应租户的数据库。

    • 缺点:数据库安装数量增多,导致维护成本和购置成本增加。

    • 适用场景:适用于对数据安全性和隔离性要求极高的租户,如银行、医院等。

  2. 共享数据库,隔离数据架构方案

    • 方案描述:多个或所有租户共享同一个 Database,但每个 Tenant 拥有独立的 Schema。

    • 优点:在一定程度上提供了逻辑数据隔离,安全性较高;每个数据库可支持更多租户数量,相对独立数据库方案,成本有所降低。

    • 缺点:若出现故障,数据恢复较困难,因为恢复数据库将牵扯到其他租户的数据;跨租户统计数据存在一定困难。

    • 适用场景:对安全性有较高要求,同时租户数量较多且对成本较为敏感的场景。

  3. 共享数据库,共享数据架构方案

    • 方案描述:租户共享同一个 Database 和同一个 Schema,通过 TenantID 区分租户的数据,在表中增加 TenantID 字段。

    • 优点:维护和购置成本最低,允许每个数据库支持的租户数量最多;可实现最高程度的资源共享,降低成本。

    • 缺点:隔离级别最低,安全性最低,需要在设计开发时加大安全开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。

    • 适用场景:租户对成本敏感,且能接受较低的数据隔离级别,如一些对数据安全性要求不高的小型企业或个人用户场景。

我推荐使用 独立数据库 方案,一个数据库实例可以开 N 个仓库,使用云数据库还能自动扩容,非常方便。
也推荐搭配 共享数据库 方案使用,比如一般要实现 登录用户只查看自己的数据,或项目组内的数据。等业务就是共享数据库的方案。



好了,废话不多说了,上演示图:
image.png
image.png

访问租户地址后是熟悉的 blog 系统:
image.png
本地开发可简单修改 Hosts 文件 用虚拟域名映射到 127.0.0.1
image.png
(MAC 用户推荐 Helm 这个软件,修改方便。 WINDOWS 就是 C 盘了,这个大家都熟悉)

上线服务器使用 Nginx代理,可使用 泛域名 如:

server_name *.a.myedu.top;

项目包中有 nginx.conf 文件供参考。

识别租户的方式 有很多种,这里介绍3种常见的方案:

 1. 通过域名识别,不一样的租户使用不同的域名。request.getServerName();
      一般管理系统特别适合这个方案,域名隔离更安全,客户可使用自有域名解析到该服务器,彰显品牌。

2. 通过请求头识别,不一样的租户使用不同的请求头。request.getHeader(xxx);

      适合 app 以及小程序 等请求,Header中挂参即可区分租户。

 3. 通过url识别,不一样的租户使用不同的url 前缀。target.substring 截取

      适合内容分发平台,比如开源中国社区 https://my.oschina.net/dufuzhong,码云 https://gitee.com/bean80/projects

      CS DN 之类的 https://blog.csdn.net/qq_15851143?type=lately

以上三种方式也可以共存,不冲突,项目代码中有给出示例。

更多业务场景可加入JFinal_SAAS微信群沟通(微信:dufuzhong)
image.png