开发各种 JFinal SAAS 多租户系统有近十年了。期间也有陆续分享多租户用到的技术方案文章,上上周社区几个好友想要一套整理好的源码 demo。本来约好上周末分享的,上周中诺如病毒了全家突突。。。
这一拖到本周末搞了两天终于出 V1.0了。。。
本项目依然使用 官网jfinal-demo 做演示,易于学习改造。
增加了几个java文件,用到的技术点(基本都做过分享):
1、Db多数据源;
2、修改_JFinalDemoGenerator添加了一个_MappingKit 模板,使其支持免启动JF时映射ColumnType方案;
3、Db 自定义的 MyCache 使用 Caffeine 缓存实现租户缓存隔离;
4、自定义全局公共数据共享处理器;
5、租户数据库启动时自动升级执行sql文件;
6、后续继续更新文档。
租户数据存储一般就三种方案:
我推荐使用 独立数据库 方案,一个数据库实例可以开 N 个仓库,使用云数据库还能自动扩容,非常方便。
也推荐搭配 共享数据库 方案使用,比如一般要实现 登录用户只查看自己的数据,或项目组内的数据。等业务就是共享数据库的方案。
好了,废话不多说了,上演示图:
访问租户地址后是熟悉的 blog 系统:
本地开发可简单修改 Hosts 文件 用虚拟域名映射到 127.0.0.1:
(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)