# SaaS介绍和原理
*****
SaaS就是多租户,一个应用可以分给很多用户使用,而应用只需要维护一个。那么应用就需要做好各种资源的隔离(数据库,文件,缓存,队列,后台,命令行等等)。
有两种类型的多租户SaaS形式:
### 1,单数据库SaaS:
租户共享一个数据库,其数据使用 where tenant_id=1 子句分隔。
![](https://img.kancloud.cn/ae/1b/ae1bfd5d0d1132a04a0bc5eb4e67eedb_733x89.png)
![](https://img.kancloud.cn/5a/dc/5adcb78fa7e087c95c0f1d82377f156e_503x429.png)
代码原理,利用scoping插入租户过滤:
![](https://img.kancloud.cn/91/ae/91aec1ae0afd01c64a14429937a2d837_1082x568.png)
**缺点**: 所有语句都需要租户过滤,所有数据库都需要租户识别(+tenant_id),不兼容第三方组件,开发繁琐困难,同时不好维护。
*****
### 2,多数据库SaaS:
每个租户都有自己的数据库。
![](https://img.kancloud.cn/a4/40/a440992835530f98552bdda22e824e50_1208x364.png)
代码原理,识别租户后,切换数据库和相关租户资源:
![](https://img.kancloud.cn/cd/bc/cdbc35a5d5167542210c93acd90702c6_1201x493.png)
优点:基本上相当便捷的把原来的单租户程序变成多租户,同时多租户也容易转为单租户。很容易的利用原有技术开发,利用生态的第三方插件/包,技术上是高效便利,商业上成本低廉,就是我们需要的方案。
*****
更多详细,可以参考PPT:[SaaS多租户技术是什么 – 湾区梁工 (liangdabiao.com)](https://liangdabiao.com/index.php/2021/12/17/saas%e6%98%af%e4%bb%80%e4%b9%88/)
*****
*****
*****
### 多数据库SaaS开发要注意:
### 注意0:租户识别
【**多数据库租赁**】模式,是我们要探讨的,关键在于租户识别(Tenant identification),整个流程大概如下:
1,租户域名--》识别租户--》切换租户数据库--》切换各种资源--》运行应用--》运行相应任务命令
2,主域名--》识别管理员--》切换主数据库--》运行管理后台--》管理租户
### 注意1:队列Queue要标识
![](https://img.kancloud.cn/b9/07/b907b1a77e02d08ed150c10e769d011a_1114x386.png)
### 注意2:命令行要标识
![](https://img.kancloud.cn/25/af/25afa7130b7c2268e5661a56aba29c1d_1158x239.png)
不指定租户的情况,就是轮询全部租户,执行命令:
![](https://img.kancloud.cn/ab/e5/abe5c94a1cd8c0a2926b701eed1bd5ca_763x468.png)
### 注意3:上传图片/文件要识别和隔离
![](https://img.kancloud.cn/b9/a7/b9a7b1fcdd741cee5aee555f3fac1819_518x592.png)
### 注意4:缓存要识别
例如redis,主要是通过加上前缀[prefix_XX]来识别和隔离缓存资源。
### 注意5:调用外部资源要识别
例如在webhook 的url 加上 租户的识别 tenant_id
*****
*****
## 介绍Laravel SaaS 多租户包 :archtechx/tenancy
[GitHub - archtechx/tenancy: Automatic multi-tenancy for Laravel. No code changes needed.](https://github.com/archtechx/tenancy)
文档:https://tenancyforlaravel.com/docs/v3/introduction
简单DEMO:https://github.com/Abbotton/saas-skeleton
github有几个类似的SaaS包,不过这个是最简单高效,能够实现以上所说的saas功能,所以就推荐这个,接下来都是以这个saas包来讲解。
### archtechx/tenancy 包原理:
1,租户域名触发多租户事件,进入多租户的路由和执行相关中间件middleware
2,多租户中间件middleware 选择合适的租户,并且执行相关切换和任务。具体流程如下:
~~~php
$this->tenancy->initialize($tenant); //初始化租户
~~~
* 租户触发事件:The`Stancl\Tenancy\Tenancy`class sets the`$tenant`as the current tenant and fires a`Tenancy Initialized`event
* 事件触发启动任务:The`Bootstrap Tenancy`class catches the event and executes classes known as [tenancy bootstrappers](https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers).
* 任务启动租户资源隔离:The tenancy bootstrappers make changes to the application to make it "scoped" to the current tenant. This by default includes:
* Switching the database connection
* Replacing`CacheManager`with a scoped cache manager
* Suffixing filesystem paths
* Making queues store the tenant id & initialize tenancy when being processed
* 最后结束,恢复主库:
Conversely, when the`Tenancy Ended`event fires, the`Revert To Central Context`event transitions the app back into the central context.
*****
*****
## 开发SaaS的好处:
* 节省成本,付费灵活
* 开发容易,把原有系统改造成saas
* 维护容易,只需要维护一个程序
* 【自定义样式 + 自定义 form 】:让客户低代码实现功能,例如模板设计
* 可安装插件,扩展功能容易
* 可以分配账号:管理员,员工账号
* 新技术的尝新,减少障碍使用人工智能,大数据等新技术
* 资源隔离,数据安全,同时也方便客户把应用转变为私有应用。