JeeSite 4.x SAAS 多租户技术设计方案
SaaS 是 Software-as-a-Service(软件即服务)的简称,从技术角度上可称之为 “多租户技术或称多重租赁技术”。它与 “按需软件、应用服务提供商、托管软件” 所具有相似的含义。它是一种通过互联网提供软件的模式,厂商将应用软件统一部署在自己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,软件厂商在向客户提供互联网应用的同时,也提供软件的离线操作和本地数据存储,让用户随时随地都可以使用其定购的软件和服务。对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要。
“多租户技术或称多重租赁技术” 是一种软件架构技术,是实现如何在多组织环境下共用相同的系统或程序组件,并且可确保各租户间数据的隔离性。在当下云计算时代,多租户技术在共用的数据中心以单一系统架构与服务提供多数客户端相同甚至可定制化的服务,并且仍可以保障客户的数据隔离。目前各种各样的云计算服务就是这类技术范畴。
实现方案及原理
多租户的数据隔离方案,不外乎以下三种方案(来自网络转载)分别是:
1)独立数据库
这是第一种方案,即一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本较高。
优点: 为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复数据比较简单。
缺点: 增多了数据库的安装数量,随之带来维护成本和购置成本的增加。这种方案与传统的一个客户、一套数据、一套部署类似,差别只在于软件统一部署在运营商那里。如果面对的是银行、医院等需要非常高数据隔离级别的租户,可以选择这种模式,提高租用的定价。如果定价较低,产品走低价路线,这种方案一般对运营商来说是无法承受的。
2)共享数据库,隔离数据架构
这是第二种方案,即多个或所有租户共享 DataBase,但是每个租户一个 Schema(也可叫做一个user)。
优点: 为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;
缺点: 如果出现故障,数据恢复比较困难,因为恢复数据库将牵涉到其他租户的数据;如果需要跨租户统计数据,存在一定困难。
3)共享数据库,共享数据架构
这是第三种方案,即租户共享同一个 DataBase、同一个 Schema,但在表中增加 corp_code 多租户的数据字段。这是共享程度最高、隔离级别最低、维护成本和购置最低的模式。
优点: 三种方案比较,第三种方案的维护和购置成本最低,跨租户统计方便,允许每个数据库支持的租户数量多。
缺点: 隔离级别最低,需要在设计开发时加大对安全的开发量;对单个租户的数据备份和恢复困难。
如果希望以最少的服务器为最多的租户提供服务,并且租户接受牺牲隔离级别换取降低成本,这种方案最适合。
JeeSite 是如何选择的?
通过上述三种方案分析,JeeSite 更倾向于共享数据库共享表方式,因为他最易用,租户之间数据共享更方便,维护运营成本最低。
若考虑租户数据非常大时,可考虑分区分表,以及可使用数据库中间件(TiDB、MyCat、Sharding-JDBC)来处理大数据量的分布式存储。
JeeSite 中如何使用多租户?
开启多租户,打开 application.yml 文件,设置如下:
# 用户相关
user:
# 多租户模式(SAAS模式)(专业版)
useCorpModel: true
通过上述的介绍,我们已了解 JeeSite 对多租户的实现方式是表结构数据共享方式,对于租户数据个性化的每张表,都需要有 corp_code 和 corp_name 租户字段,进行数据分离。
这两个字段不需要开发人员手动维护,在 java 代码中,只需要在实体类的 @Table 中增加 @Column(includeEntity=BaseEntity.class) 即可,有平台自动维护,不需要开发人员编写相应代码。
每个实体类都继承了 BaseEntity 基类,所以每个实体类都已经包含如下的两个 get 方法,用来自动获取当前租户的编码和名称,这两个方法会在将来的 insert 和 select 语句中自动体现:
public String getCorpCode() {
if (StringUtils.isBlank(www.dasheng178.com corpCode)){
corpCode = CorpUtils.getCurrentCorpCode();
}
return corpCode;
}
public String getCorpName() {
if (StringUtils.isBlank(corpName)){
corpName = CorpUtils.getCurrentCorpName();
}
return corpName;
}
以 Office 举例,引入 includeEntity=BaseEntity.class 列,如下:
@Table(name="${_prefix}sys_office", alias="a", columns={
@Column(includeEntity=BaseEntity.class),
})
public class Office extends TreeEntity<www.fengshen157.com/ Office> {
}
再来看下 include 的 BaseEntity 实体,系统已经定义了 corp_code 和 corp_name 字段:
@Table(columns={
@Column(name="corp_code", attrName="corpCode", label="租户代码", isUpdate=false),
@Column(name="corp_name", attrName="corpName", label="租户名称", isUpdate=false, isQuery=false),
})
public abstract class BaseEntity<T> implements Serializable {
}
所以在 Office 中也自动的包含了 corp_code 和 corp_name 这两个字段。
有了这些配置:
当执行 officeService.save() 或 insert() 保存时,系统会自动将 corp_code 和 corp_name 租户字段及当前租户信息,添加到 insert 语句里,不需要你再去通过 set 方式去维护它。
当执行 officeService.findList() 等相关查询方法时,系统会自动将 corp_code 租户字段添加到 where 子句里,自动去过滤当前租户信息,不需要你再去通过 set 方式去设置当前租户。
若查询时,想不想包含 corp_code 字段,你想进行查询全部租户的信息,你只需调用 entity.getSqlMap().getWhere().disableAutoAddCorpCodeWhere() 即可禁用 corp_code 条件的自动添加。
那如何新增一个租户?
用超级管理员(system)登录,进入菜单 “系统管理 -> 权限管理 -> 系统管理员” 可进行新增租户管理员,新增的租户管理员只可管理自己领域内的数据(如:部门、公司、用户、自定义的字典数据等)。
如何获取租户名称列表?
User where = new User(www.michenggw.com);
List<User> corpUserList = userService.findCorpList(where);
System.out.println(corpUserList);
© 著作权归作者所有
JeeSite 4.x SAAS 多租户技术设计方案的更多相关文章
- 在IT在系统中使用多租户技术的跨部门和虚拟团队的解决方案为员工提供(草案)
1 前言 经过多年的企业信息化建设,Office系统逐步形成有9营业场所的分部门.9专业应用子系统.20独立的信息模块.330一种方法.这些系统或模块内置于Microsoft IIS.Apache T ...
- SaaS加速器 III 技术中心:提供SaaS Launchkit,快速定制,一云多端等能力,一云多端将通过小程序云实现
https://yq.aliyun.com/articles/695746 演讲主题:SaaS加速器 III技术中心:聚合开放 高效强大 技术中心定义:阿里云以聚合开放的姿势,提供一个高效强大的技术开 ...
- SAAS云平台搭建札记: (一) 浅论SAAS多租户自助云服务平台的产品、服务和订单
最近在做一个多租户的云SAAS软件自助服务平台,途中遇到很多问题,我会将一些心得.体会逐渐分享出来,和大家一起探讨.这是本系列的第一篇文章. 大家知道,要做一个全自助服务的SAAS云平台是比较复杂的, ...
- 微软SaaS多租户解决方案
微软SaaS多租户解决方案 docs.microsoft.com/en-us/azure/sql-database/saas-tenancy-app-design-patterns https://d ...
- 数据层的多租户浅谈(SAAS多租户数据库设计)
在上一篇“浅析多租户在 Java 平台和某些 PaaS 上的实现”中我们谈到了应用层面的多租户架构,涉及到 PaaS.JVM.OS 等,与之相应的是数据层也有多租户的支持. 数据层的多租户综述 多租户 ...
- [转载]数据层的多租户浅谈(SAAS多租户数据库设计)
原文:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html 在上一篇“浅析多租户在 Java 平台和某些 ...
- SaaS多租户模式数据存储方案
云计算多租户几乎用于所有软件即服务 (Software as a Service, SaaS) 应用程序,因为计算资源是可伸缩的,而且这些资源的分配由实际使用决定.话虽如此,用户可以通过 Intern ...
- saas 系统租户个性化域名&&租户绑定自己域名的解决方案
实际的需求就类似github 的自定义page 1. 个性化域名 github 实现原理就是用户个性化域名使用泛域名解析,这个比较简单,大部分域名提供商都可以解决 具体操作不用赘述 ...
- SaaS多租户模式数据存储方案比较
云计算多租户几乎用于所有软件即服务 (Software as a Service, SaaS) 应用程序,因为计算资源是可伸缩的,而且这些资源的分配由实际使用决定.话虽如此,用户可以通过 Intern ...
随机推荐
- Python之元类详解
一.引子 元类属于Python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也是自圆其说,点到为止,从队元类的控制上来看就破绽百出,逻辑混乱: 二.什么是元类 一切源自于一 ...
- oracle数据库更改字符集
在数据迁徙的时候需要使源和目标数据库的字符集.版本等信息统一…… 这里是对一个数据库的设置,需要在两边进行同样的操作. SYS@PROD1> select userenv('language') ...
- 关于几个与IO相关的重要概念
1.读/写IO 读IO就是发指令从磁盘读取某段序号连续的扇区内容.指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读还是写.磁盘收到这条指令就会按照指令 ...
- go vendor 安装失败的原因分析
安装之前的配置 export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 1 2 安装 通常,我们查到的安装方法一般是下面这种 go get -u gi ...
- Vue.js 相关知识(组件)
1. 组件介绍 组件(component),vue.js最强大的功能之一 作用:封装可重用的代码,通常一个组件就是一个功能体,便于在多个地方都能调用该功能体 根组件:我们实例化的Vue对象就是一个组件 ...
- 使用git-premit时的问题
package.json 相关配置如下 { "scripts": { "lint": "eslint pages/* component/* --fi ...
- linux命令系列 stat & touch
1. stat - display file or file system status stat命令主要用于显示文件或文件系统的状态,详细信息 事实上,stat命令显示的是文件的I节点信息.Linu ...
- Django_用户权限管理rbac
组成部分 1.初始化权限:login视图initial_permission,把权限信息放入session.initial_permission函数生成权限列表.菜单列表 2.中间件验证权限:在第一次 ...
- 增加ubuntu的内存——设置Swap增加内存
1.查看一下当前Swap分区的状态: $cat /proc/meminfo SwapTotal: 0 kB SwapFree: 0 kB 如果上面二项目都为0,说明没有Swap分区:如果不为0,则说明 ...
- Codeforces Round #106 (Div. 2) D. Coloring Brackets 区间dp
题目链接: http://codeforces.com/problemset/problem/149/D D. Coloring Brackets time limit per test2 secon ...