tamako tamako
首页
  • Mysql
  • Redis
  • JVM
  • 个人开源项目 (opens new window)
  • 开源官网 (opens new window)
  • B站主页 (opens new window)
  • 摄影
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

tamako | 玉子

胜人者有力,自胜者强
首页
  • Mysql
  • Redis
  • JVM
  • 个人开源项目 (opens new window)
  • 开源官网 (opens new window)
  • B站主页 (opens new window)
  • 摄影
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Mybatis-plus实现多租户

    • 什么是Saas系统
      • 多租户数据隔离架构设计
        • mybatis-plus优雅实现多租户数据隔离
        pruedream
        2024-03-11
        随笔
        目录

        Mybatis-plus实现多租户

        # Mybatis-plus 实现多租户

        # 什么是Saas系统

        SaaS强调软件即服务,传统的软件是需要我们购买然后下载到自己本地来使用,而SaaS不需要用户进行相关软硬件资源的准备,只需要购买该服务的使用权就可以通过互联网使用系统。 SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,租户(企业)无需购买软硬件、建设机房、招聘IT人员,即可通过互联网使用信息系统。

        # 多租户数据隔离架构设计

        目前saas多租户系统的数据隔离有三种架构设计,即为每个租户提供独立的数据库、独立的表空间、按字段区分租户,每种方案都有其各自的适用情况。

        一个租户独立一个数据库

        一个租户独立使用一个数据库,那就意味着我们的SaaS系统需要连接多个数据库,这种实现方案其实就和分库分表架构设计是一样的,好处就是数据隔离级别高、安全性好,毕竟一个租户单用一个数据库,但是物理硬件成本,维护成本也变高了。

        独立的表空间

        这种方案的实现方式,就是所有租户共用一个数据库系统,但是每个租户在数据库系统中拥有一个独立的表空间。

        按租户id字段隔离租户

        这种方案是多租户方案中最简单的数据隔离方法,即在每张表中都添加一个用于区分租户的字段(如tenant_id或org_id啥的)来标识每条数据属于哪个租户,当进行查询的时候每条语句都要添加该字段作为过滤条件,其特点是所有租户的数据全都存放在同一个表中,数据的隔离性是最低的,完全是通过字段来区分的,很容易把数据搞串或者误操作。

        隔离方案 成本 支持租户数量 优点 缺点
        独立数据库系统 高 少 数据隔离级别高,安全性,可以针对单个租户开发个性化需求 数据库独立安装,物理成本和维护成本都比较高
        独立的表空间 中 较多 提供了一定程度的逻辑数据隔离,一个数据库系统可支持多个租户 数据库管理比较困难,表繁多,同时数据修复稍复杂
        按租户id字段区分 低 多 维护和购置成本最低,每个数据库能够支持的租户数量最多 隔离级别最低,安全性也最低

        # mybatis-plus优雅实现多租户数据隔离

        public interface TenantLineHandler {
        
            /**
             * 获取租户 ID 值表达式,只支持单个 ID 值
             * <p>
             *
             * @return 租户 ID 值表达式
             */
            Expression getTenantId();
        
            /**
             * 获取租户字段名
             * <p>
             * 默认字段名叫: tenant_id
             *
             * @return 租户字段名
             */
            default String getTenantIdColumn() {
                // 如果该字段你不是固定的,请使用 SqlInjectionUtils.check 检查安全性
                return "tenant_id";
            }
        
            /**
             * 根据表名判断是否忽略拼接多租户条件
             * <p>
             * 默认都要进行解析并拼接多租户条件
             *
             * @param tableName 表名
             * @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
             */
            default boolean ignoreTable(String tableName) {
                return false;
            }
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34

        多租户插件其实就是通过解析SQL,然后进行拼接多租户id过滤条件来实现SQL增强从而做到数据隔离,

        上次更新: 2024/08/09, 16:07:34
        最近更新
        01
        骄惰怯
        08-10
        02
        谦虚谦虚谦虚
        08-09
        03
        长期主义
        07-17
        更多文章>
        Theme by Vdoing | Copyright © 2019-2024 tamako | MIT License
        • 跟随系统
        • 浅色模式
        • 深色模式
        • 阅读模式