## 多租户 多租户的概念、模式特别多,想要狠狠的把玩好多租户,在使用多租户之前,务必了解清楚,什么是多租户?什么才是适合你的多租户选型?希望以下的内容能帮助你对多租户的理解更深入 ## 什么是多租户? 不同人有很多说法,有的人说 - 能够连接多个数据库操作的就是多租户 - 通过表的一个字段进行数据过滤的就是多租户 - 能够将不同的数据存放在多个库的就是多租户 - 多租户需要主库、业务库、默认库等等要求 他们说的对吗?不能说错,但也不全对,正是因为多租户的模式比较多,实际用到的是哪种,要由业务来决定。 我们站在各各角度,给大家举个例子,自然就很好的分清楚,你当前的方式: #### 业务方面: - 如果你是开发的类似淘宝的软件,每个店铺是多租户的,但是里面的用户又是一起,而不需要每次进入一个店铺就要注册一个店铺淘宝账号(需要主库共享,业务库多租户) - 如果是你开发一个类似餐饮的软件,每个线下餐馆都是一个新的客户,而一个用户的数据不需要共享在两个店铺中(业务库多租户) - 如果你开发的是一个类似Mes工厂系统的软件,你的很多设备数据甲方要求从他们的数据库中直接搂,意味着你的软件需要处理自己的数据库,还要连接客户的数据库(需要根据操作的实体进行切换数据库) #### 安全方面: - 通过表字段进行隔离,既加一个租户id字段,查询表的时候进行数据过滤(操作简单,成本低,但是隔离程度低,一个租户出问题,其他都影响) - 通过数据库进行隔离,既通过租户id进行切换数据库,一个租户一个数据库(操作复杂,成本高,但是隔离程度高,一个租户出问题,不会影响到其他租户) - 通过数据库和表字段混合进行隔离,既可以选择是表隔离还是数据库隔离(结合上面的优缺点,对软件设计要求程度高) > 如果是多数据库,还可以兼容考虑不同数据库类型,A用mysql,B用sqlserver,这种更加复杂。 #### 配置方式: - 事先知道要连几个数据库,代码里先new几个db,根据传入的租户条件进行选择使用哪个db(需改代码,成本低,切换租户方便) - 通过配置文件进行配置租户数量,变更租户数量代码无须更改,但是会根据传入的租户条件进行选择哪个配置的db(需重启,成本较高,切换租户较困难) - 通过界面上进行动态管理租户,变更租户数量代码无须更改,会根据传入的租户条件进行选择哪个db(无需重启,成本高,切换租户较困难) > 等等,什么千奇百怪的方式都有,不同的方式适合不同的需求 ## YI框架支持的多租户 - [x] 表字段进行隔离 - [x] 数据库进行隔离,且支持不同租户多数据库类型 - [x] 支持配置文件租户 - [x] 支持界面配置租户(界面配置其实也是能通过接口配置,一个道理) - [x] 支持不同实体访问不同数据库(需使用sqlsugar功能) ## 接入多租户教程 yi框架基本大部分多租户方式都支持,以下教程是基于较困难的数据库分库的多租户模式 #### 开启 默认是不开启多租户的,需要在配置文件中开启后才生效 ![alt text](image.png) > 多租户是有默认库的概念存在,即,当接口传入的信息中,不带有任何租户信息,你也不能报错,框架会自动选择Url为默认租户库,另外,租户表,也会存储在默认库中 启动后,我们切换swagger到租户模块(默认模板中,已接入租户模块,但配置文件是关闭的) ![alt text](image-1.png) ![alt text](image-2.png) 这里需要注意一下 > 由于sqlsugar简化了efcore,dbcontext上下文的概念,所以无法从dbcontext获取当前使用的是什么db类型,另外,又为了兼容`abp连接字符串`模块,只能通过`连接key`,和`连接url`中存放db类型,所以db类型有个规定,以租户name的尾缀 "_xxx" 来决定,如果没有,将保持和默认库的db类型一致 我们创建好一个db类型之后,通过返回的租户id,可以进行初始化(既框架实现了各各租户的db创建、表结构创建、种子初始化数据) ![alt text](image-4.png) 我们可以看到,数据已经初始化了 ![alt text](image-3.png) 接下来,我们如何使用该租户呢? 我们选择rbac模块下的config表,进行操作 根据前端head传入的租户id,框架将自动切换租户,我们给他刚刚创建的租户,新增一个config ![alt text](image-5.png) 然后再查询他的config,发现确实新增了 ![alt text](image-6.png) 如果我不传租户信息,使用默认库,就没有这条信息了 ![alt text](image-7.png) 当然,如果你的租户不想在数据库中配置,这套模式得力于abp连接字符串模块支持,可以通过配置文件新增(优先级更高) 我们在配置文件中新增一个租户: ![alt text](image-8.png) 重复以上部分,结果是一模一样的,如果你的多租户是固定的,或者数据库很少,直接放配置文件还方便些~