mybatisPlus多租户:
关联知识点:
1.@configuration 注解的理解:
- 标有@Configuration注解类中方法标有@Bean注解方法的返回值就可以注入IoC容器,并且还是单例的,所以肯定是经过某种方式增强方法了,并且还是对类的增强,所以肯定是使用到Cglib动态代理技术。
- @Configuration注解类和那么的@Bean 注解的类都被注入到容器中了的!
- 定义配置类:通过在类上添加@Configuration注解,Spring容器会将该类视为一个配置源,其中包含Bean的定义和配置信息。
4.定义Bean:在配置类中,可以编写方法并使用@Bean注解来指示这些方法应当被Spring容器调用以生成和初始化Bean。这样,配置类中的@Bean注解的方法所返回的对象就会被注册到Spring IoC容器中,并可以在应用程序的其他地方通过依赖注入(DI)的方式进行使用。
5.不可缺少该注解!配置类只有单独的该@Bean 注解而没有@Configuration 注解!那么该配置类是无法注入到Spring容器中的!一般框架里面会有一个默认的配置类注入到容器中!
6.该注解类似于以前的xml配置bean,里面的bean就是以前的bean标签
7.该注解修饰的类可以理解为一个小容器!
概念:
多租户(Multi Tenancy/Tenant) 是一种软件架构,其定义是:在一台服务器上运行单个应用实例,它为多个租户提供服务,且保证用户间数据隔离
多租户架构的概念是针对数据存储的,假设我们是一个数据服务提供商,需要给所有的学校提供服务,对于我们来说,分组是按照学校为单位的,而且学校与学校之间互相没有任何关系,也就说学校与学校之间是隔离的,对于不同学校的数据我们需要将它们隔离开来。这种数据的分组就是多租户架构要研究的问题。
模式:
独立数据库:
共享数据库,独立Schema:
**共享数据库,独立 Schema **将每个租户关联到同一个数据库的不同 Schema,租户间数据彼此逻辑不可见,上层应用程序的实现和独立数据库一样简单。也可以这样理解:就是所有租户共用一个数据库系统,但是每个租户在数据库系统中拥有一个独立的表空间。
缺点:
1、由于是每个租户一个库可以在库表设计上做单独扩展,但这也引起了应用程序的兼容问题;
2、数据库维护成本和高。
共享数据库,共享数据架构:
这种方案是多租户方案中最简单的数据隔离方法,即在每张表中都添加一个用于区分租户的字段(如tenant_id或org_id啥的)来标识每条数据属于哪个租户,当进行查询的时候每条语句都要添加该字段作为过滤条件,其特点是所有租户的数据全都存放在同一个表中,数据的隔离性是最低的,完全是通过字段来区分的,很容易把数据搞串或者误操作。
隔离方案 | 成本 | 支持租户数量 | 优点 | 缺点 |
---|---|---|---|---|
独立数据库系统 | 高 | 少 | 数据隔离级别高,安全性,可以针对单个租户开发个性化需求 | 数据库独立安装,物理成本和维护成本都比较高 |
独立的表空间 | 中 | 较多 | 提供了一定程度的逻辑数据隔离,一个数据库系统可支持多个租户 | 数据库管理比较困难,表繁多,同时数据修复稍复杂 |
按租户id字段区分 | 低 | 多 | 维护和购置成本最低,每个数据库能够支持的租户数量最多 | 隔离级别最低,安全性也最低 |
MyBatis-Plus的基于字段的隔离方式:
- 多租户 != 权限过滤,不要乱用,租户之间是完全隔离的!!!
- 启用多租户后所有执行的method的sql都会进行处理.
- 自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)
MyBatis-Plus基于字段的多租户是通过插件机制拦截实现的,因为还有很多其它的拦截器,比如:
- 自动分页: PaginationInnerInterceptor
- 多租户: TenantLineInnerInterceptor
- 动态表名: DynamicTableNameInnerInterceptor
- 乐观锁: OptimisticLockerInnerInterceptor
- sql 性能规范: IllegalSQLInnerInterceptor
- 防止全表更新与删除: BlockAttackInnerInterceptor
所以需要注意顺序: 使用多个功能需要注意顺序关系,建议使用如下顺序
- 多租户,动态表名
- 分页,乐观锁
- sql 性能规范,防止全表更新与删除
总结: 对 sql 进行单次改造的优先放入,不对 sql 进行改造的最后放入
总结:
mybatisPlus实现多租户实际上是通过在表中放入一个特定的tenantId来区分不同的用户!然后在mybatisPlus添加拦截器拦截我们写的sql语句添加对应的tenantId进行优化来实现对不同的租户的信息进行操作的!
mybatisPlus多租户