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);
  
  ? 著作权归作者所有

原文地址:https://www.cnblogs.com/qwangxiao/p/10386383.html

时间: 2024-11-19 23:02:32

JeeSite 4.x SAAS 多租户技术设计方案的相关文章

论-多租户技术

多租户技术(multi-tenancy technology)实际是一种软件架构技术,它是在探讨与实现怎样在多用户的环境下共用同样的系统或程序组件.而且仍能够确保各用户的业务不互相影响. "我在南方的艳阳里大雪纷飞,你在北方的寒夜里四季如春."又是一个供暖季.我这个来自北方的狼在杭州的深夜里被冻成了狗.仅仅能靠抖动身体来缓解身体的冰冷.冬夜的深冷让我怀念起北方城市里的集中供暖. 集中供暖在经济学上可归为一种共享经济.大家统一向供暖公司採购暖气服务,由于规模经济的效益.显著减少了个体取暖

在IT在系统中使用多租户技术的跨部门和虚拟团队的解决方案为员工提供(草案)

1 前言 经过多年的企业信息化建设,Office系统逐步形成有9营业场所的分部门.9专业应用子系统.20独立的信息模块.330一种方法.这些系统或模块内置于Microsoft IIS.Apache Tomcat.Weblogic.Cordys BOP上,相互彼此独立.互不影响. 在不考虑反复投资.资源共享.便于运维的情况下,仍存在一些长期非常难解决的问题: (1).各个系统的组织.账号不统一.维护困难. (2).在一些系统或模块中.对于人员跨部门的情况.仍以两个及以上账号的方式处理,不仅业务不直

在IT系统中使用多租户技术提供人员跨部门及虚拟团队的解决方案(草稿)

1 前言 经过多年企业信息化建设,逐步形成的办公系统中还有9个部门业务网站子系统.9个专业应用子系统.20个独立信息模块.330个流程.这些系统或模块分别搭建在Microsoft IIS.Apache Tomcat.Weblogic.Cordys BOP上,相互彼此独立.互不影响. 在不考虑重复投资.资源共享.便于运维的情况下,仍存在一些长期很难解决的问题: (1).各个系统的组织.账号不统一,维护困难: (2).在一些系统或模块中,对于人员跨部门的情况,仍以两个及以上账号的方式处理,不仅业务不

SaaS加速器 III 技术中心:提供SaaS Launchkit,快速定制,一云多端等能力,一云多端将通过小程序云实现

https://yq.aliyun.com/articles/695746 演讲主题:SaaS加速器 III技术中心:聚合开放 高效强大 技术中心定义:阿里云以聚合开放的姿势,提供一个高效强大的技术开发平台 技术中心中提到的企业应用典型开发场景,最主要的受众是开发者.今天我们将会重磅发布两款产品系列:SaaS launch Kit和APaaS.第一,企业应用需要快速接入阿里云基础设施和售卖服务体系不论是合作伙伴还是企业客户的应用,都会面临一个怎样快速上云的问题:上云后的不同应用,如何带给企业客户

微软SaaS多租户解决方案

微软SaaS多租户解决方案 docs.microsoft.com/en-us/azure/sql-database/saas-tenancy-app-design-patterns https://docs.microsoft.com/en-us/azure/sql-database/saas-tenancy-app-design-patterns https://github.com/TarsNET https://github.com/ElderJames https://github.co

SaaS多租户模式数据存储方案比较

云计算多租户几乎用于所有软件即服务 (Software as a Service, SaaS) 应用程序,因为计算资源是可伸缩的,而且这些资源的分配由实际使用决定.话虽如此,用户可以通过 Internet 访问多种类型的 SaaS 应用程序,从小的基于 Internet 的小部件到大型企业软件应用程序.根据存储在企业网络之外的软件供应商的基础架构上的数据不同,安全需求也在不断增长.应用程序需要多租户是有许多原因的,其中最明显的原因就是成本:在大多数情况下,为每个客户增加几个服务器和一个数据库是远

saas 系统租户个性化域名&amp;&amp;租户绑定自己域名的解决方案

实际的需求就类似github 的自定义page 1. 个性化域名 github 实现原理就是用户个性化域名使用泛域名解析,这个比较简单,大部分域名提供商都可以解决 具体操作不用赘述 使用nginx 的配置比较简单 配置如下: server { listen 8080default; index index.html index.htm index.php; root html; location /{ root html; } location /app { root html; } locat

SaaS多租户模式数据存储方案

  云计算多租户几乎用于所有软件即服务 (Software as a Service, SaaS) 应用程序,因为计算资源是可伸缩的,而且这些资源的分配由实际使用决定.话虽如此,用户可以通过 Internet 访问多种类型的 SaaS 应用程序,从小的基于 Internet 的小部件到大型企业软件应用程序.根据存储在企业网络之外的软件供应商的基础架构上的数据不同,安全需求也在不断增长.应用程序需要多租户是有许多原因的,其中最明显的原因就是成本:在大多数情况下,为每个客户增加几个服务器和一个数据库

SAAS多租户数据逻辑隔离

基于Mybatis 的SAAS应用多租户数据逻辑隔离 package com.opencloud.common.interceptor;import org.apache.commons.lang3.StringUtils;import org.apache.ibatis.executor.statement.StatementHandler;import org.apache.ibatis.mapping.BoundSql;import org.apache.ibatis.mapping.Ma