💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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 】:让客户低代码实现功能,例如模板设计 * 可安装插件,扩展功能容易 * 可以分配账号:管理员,员工账号 * 新技术的尝新,减少障碍使用人工智能,大数据等新技术 * 资源隔离,数据安全,同时也方便客户把应用转变为私有应用。