首页 > 后端开发 > 正文

saas多租户开源框架php Spring Boot 构建多租户SaaS平台核心技术指南

2023-09-25 11:59:35 | 我爱编程网

很多关注后端开发的朋友很希望了解saas多租户开源框架php Spring Boot 构建多租户SaaS平台核心技术指南,今天我爱编程网为大家整理了相关文章,一起来看看吧!

saas多租户开源框架php Spring Boot 构建多租户SaaS平台核心技术指南

什么是多租户模式?

低代码平台多租户模式可为集团下属各个机构开通企业域提供多租户服务,每个租户之间可以设定上下级关系,同时企业域可创建多级管理员,允许次级管理员独立维护子公司或子部门用户情况,对集团型企业大大缓解组织用户管理工作量压力。

saas多租户开源框架php Spring Boot 构建多租户SaaS平台核心技术指南

Spring Boot 构建多租户SaaS平台核心技术指南

1. 概述

笔者从2014年开始接触SaaS(Software as a Service),即多租户(或多承租)软件应用平台;并一直从事相关领域的架构设计及研发工作。机缘巧合,在笔者本科毕业设计时完成了一个基于SaaS的高效财务管理平台的课题研究,从中收获颇多。最早接触SaaS时,国内相关资源匮乏,唯一有的参照资料是《互联网时代的软件革命:SaaS架构设计》(叶伟等著)一书。最后课题的实现是基于OSGI(Open Service Gateway Initiative)Java动态模块化系统规范来实现的。

时至今日,五年的时间过去了,软件开发的技术发生了巨大的改变,笔者所实现SaaS平台的技术栈也更新了好几波,真是印证了那就话:“山重水尽疑无路,柳暗花明又一村”。基于之前走过的许多弯路和踩过的坑,以及近段时间有许多网友问我如何使用Spring Boot实现多租户系统,决定写一篇文章聊一聊关于SaaS的硬核技术。

说起SaaS,它只是一种软件架构,并没有多少神秘的东西,也不是什么很难的系统,我个人的感觉,SaaS平台的难度在于商业上的运营,而非技术上的实现。就技术上来说,SaaS是这样一种架构模式:它让多个不同环境的用户使用同一套应用程序,且保证用户之间的数据相互隔离。现在想想看,这也有点共享经济的味道在里面。

笔者在这里就不再深入聊SaaS软件成熟度模型和数据隔离方案对比的事情了。今天要聊的是使用Spring Boot快速构建独立数据库/共享数据库独立Schema的多租户系统。我将提供一个SaaS系统最核心的技术实现,而其他的部分有兴趣的朋友可以在此基础上自行扩展。

2. 尝试了解多租户的应用场景

假设我们需要开发一个应用程序,并且希望将同一个应用程序销售给N家客户使用。在常规情况下,我们需要为此创建N个Web服务器(Tomcat),N个数据库(DB),并为N个客户部署相同的应用程序N次。现在,如果我们的应用程序进行了升级或者做了其他任何的改动,那么我们就需要更新N个应用程序同时还需要维护N台服务器。接下来,如果业务开始增长,客户由原来的N个变成了现在的N+M个,我们将面临N个应用程序和M个应用程序版本维护,设备维护以及成本控制的问题。运维几乎要哭死在机房了…

为了解决上述的问题,我们可以开发多租户应用程序,我们可以根据当前用户是谁,从而选择对应的数据库。例如,当请求来自A公司的用户时,应用程序就连接A公司的数据库,当请求来自B公司的用户时,自动将数据库切换到B公司数据库,以此类推。从理论上将没有什么问题,但我们如果考虑将现有的应用程序改造成SaaS模式,我们将遇到第一个问题:如果识别请求来自哪一个租户?如何自动切换数据源?

3. 维护、识别和路由租户数据源

我们可以提供一个独立的库来存放租户信息,如数据库名称、链接地址、用户名、密码等,这可以统一的解决租户信息维护的问题。租户的识别和路由有很多种方法可以解决,下面列举几个常用的方式:

解决了上述问题后,我们再来看看如何获取客户端传入的租户信息,以及在我们的业务代码中如何使用租户信息(最关键的是DataSources的问题)。

我们都知道,在启动Spring Boot应用程序之前,就需要为其提供有关数据源的配置信息(有使用到数据库的情况下),按照一开始的需求,有N个客户需要使用我们的应用程序,我们就需要提前配置好N个数据源(多数据源),如果N<50,我认为我还能忍受,如果更多,这样显然是无法接受的。为了解决这一问题,我们需要借助Hibernate 5提供的动态数据源特性,让我们的应用程序具备动态配置客户端数据源的能力。简单来说,当用户请求系统资源时,我们将用户提供的租户信息(tenantId)存放在ThreadLoacal中,紧接着获取TheadLocal中的租户信息,并根据此信息查询单独的租户库,获取当前租户的数据配置信息,然后借助Hibernate动态配置数据源的能力,为当前请求设置数据源,最后之前用户的请求。这样我们就只需要在应用程序中维护一份数据源配置信息(租户数据库配置库),其余的数据源动态查询配置。接下来,我们将快速的演示这一功能。

4. 项目构建

我们将使用Spring Boot 2.1.5版本来实现这一演示项目,首先你需要在Maven配置文件中加入如下的一些配置:

然后提供一个可用的配置文件,并加入如下的内容:

接下来,我们需要关闭Spring Boot自动配置数据源的功能,在项目主类上添加如下的设置:

最后,让我们看看整个项目的结构:

5. 实现租户数据源查询模块

我们将定义一个实体类存放租户数据源信息,它包含了租户名,数据库连接地址,用户名和密码等信息,其代码如下: 我爱编程网

持久层我们将继承JpaRepository接口,快速实现对数据源的CURD操作,同时提供了一个通过租户名查找租户数据源的接口,其代码如下:

业务层提供通过租户名获取租户数据源信息的服务(其余的服务各位可自行添加):

接下来是配置自定义的数据源,其源码如下:

在改配置类中,我们主要提供包扫描路径,实体管理工程,事务管理器和数据源配置参数的配置。

6. 实现租户业务模块

在此小节中,租户业务模块我们仅提供一个用户登录的场景来演示SaaS的功能。其实体层、业务层和持久化层根普通的Spring Boot Web项目没有什么区别,你甚至感觉不到它是一个SaaS应用程序的代码。

首先,创建一个用户实体User,其源码如下:

业务层提供了一个根据用户名检索用户信息的服务,它将调用持久层的方法根据用户名对租户的用户表进行检索,如果找到满足条件的用户记录,则返回用户信息,如果没有找到,则返回null;持久层和业务层的源码分别如下:

7. 配置拦截器

我们需要提供一个租户信息的拦截器,用以获取租户标识符,其源代码和配置拦截器的源代码如下:

8. 维护租户标识信息

在这里,我们使用ThreadLocal来存放租户标识信息,为动态设置数据源提供数据支持,该类提供了设置租户标识、获取租户标识以及清除租户标识三个静态方法。其源码如下:

9. 动态数据源切换

要实现动态数据源切换,我们需要借助两个类来完成,CurrentTenantIdentifierResolver和AbstractDataSourceBasedMultiTenantConnectionProviderImpl。从它们的命名上就可以看出,一个负责解析租户标识,一个负责提供租户标识对应的租户数据源信息。

首先,我们需要实现CurrentTenantIdentifierResolver接口中的resolveCurrentTenantIdentifier()和validateExistingCurrentSessions()方法,完成租户标识的解析功能。实现类的源码如下:

有了租户标识符解析类之后,我们需要扩展租户数据源提供类,实现从数据库动态查询租户数据源信息,其源码如下:

最后,我们还需要提供租户业务模块数据源配置,这是整个项目核心的地方,其代码如下:

10. 应用测试

最后,我们通过一个简单的登录案例来测试本次课程中的SaaS应用程序,为此,需要提供一个Controller用于处理用户登录逻辑。在本案例中,没有严格的对用户密码进行加密,而是使用明文进行比对,也没有提供任何的权限认证框架,知识单纯的验证SaaS的基本特性是否具备。登录控制器代码如下:

在启动项目之前,我们需要为主数据源创建对应的数据库和数据表,用于存放租户数据源信息,同时还需要提供一个租户业务模块数据库和数据表,用来存放租户业务数据。一切准备就绪后,启动项目,在浏览器中输入:

在登录窗口中输入对应的租户名,用户名和密码,测试是否能够正常到达主页。可以多增加几个租户和用户,测试用户是否正常切换到对应的租户下。

总结

saas多租户开源框架php Spring Boot 构建多租户SaaS平台核心技术指南

SaaS多租户实现的思考

最近在做SaaS权限设计的时候,一直在权衡着租户和组织的关系,以追求系统的简洁性。我们在做PaaS平台的时候,租户是有子租户的概念,而且是按照运营管理、客户域进行组织层级定义的。1,2级是对应的运营管理域,3,4级是对应的客户域。由于租户间是资源隔离的,对于租户间的资源访问问题,处理起来相当痛苦。

多租户SaaS系统怎么设计,下面是我总结的几点原则,供大家参考:

1、租户间是资源隔离的。相互无法访问对方的数据。

我们目前做到逻辑隔离,通过表里面增加租户ID的方式来实现多租户的支持。当然我们自然想做到物理隔离,相应的成本也会多很多。这块大家必须有租户间资源是隔离的概念。为了能更好的理解整个SaaS系统的设计初衷,我们可以认为租户间资源是物理隔离的。

2、组织也是一种资源,各租户都有自己的组织。

每个租户是有各自的资源信息的,这些资源是租户私有的。比如:角色信息、用户信息、组织信息等。

3、租户可以通过组织进行资源划分。

租户和组织这块有很多相近的地方,这块需要深刻的理解下。我个人是这么理解的:租户是对全部资源物理层面的隔离,而组织是对租户私有资源逻辑上的隔离。

4、租户不支持多层级,租户有不同的类型。

为了降低系统的复杂性,我们建议租户不支持多层级,只能建一级,租户是有类型的,通过类型区分不同的业务场景,租户间是平等的。

比如:XXX运营方也是独立的租户,与其它用户无本质区别。

5、通过组织的层级结构,来实现用户的数据权限。

这块也是我们做的最大改动:轻租户,重组织。发挥组织的天然业务隔离的特性,通过组织树来实现资源数据权限。

6、运营侧只管理到租户级别,不应该涉及到租户的私有资源。

组织是租户的私有资源,运营管理侧自然不应该去管理他,也不方便管理。

来张图,方便大家的理解:

为了方便,可以默认将租户的信息映射到组织上,做为组织的L0级。也可不映射,查询的时候自动加上。租户新建的时候,租户的默认管理员是挂在本账户下的,此时还没有组织的信息。

以上就是我爱编程网为大家带来的saas多租户开源框架php Spring Boot 构建多租户SaaS平台核心技术指南,希望能帮助到大家,更多相关信息,敬请关注我爱编程网!
与“saas多租户开源框架php Spring Boot 构建多租户SaaS平台核心技术指南”相关推荐
多租户开源框架php 教你在几分钟内使Laravel应用拥有多租户功能
多租户开源框架php 教你在几分钟内使Laravel应用拥有多租户功能

PHP有哪些流行的框架PHP有哪些流行的框架?PHP有哪些流行的框架?PHP作为一种十分流行的编程语言,拥有大量的应用领域和开源程序库。其中,PHP框架可以有效提高对PHP语言的理解和运用水平。框架作为一种用于开发网络应用程序的基础架构,可以让开发者在不同项目的开发中提高效率。在PHP框架领域中,有许多众所周知、使用广泛的优秀框架,其中一些常见的PHP框架如下:1.Lara

2023-09-17 18:02:41
php多租户开源框架 开源框架是什么?
php多租户开源框架 开源框架是什么?

PHP有哪些流行的框架PHP有哪些流行的框架?PHP有哪些流行的框架?PHP作为一种十分流行的编程语言,拥有大量的应用领域和开源程序库。其中,PHP框架可以有效提高对PHP语言的理解和运用水平。框架作为一种用于开发网络应用程序的基础架构,可以让开发者在不同项目的开发中提高效率。在PHP框架领域中,有许多众所周知、使用广泛的优秀框架,其中一些常见的PHP框架如下:1.Lara

2023-09-18 14:41:36
多租户php框架 php有哪些框架?
多租户php框架 php有哪些框架?

PHP有哪些流行的框架PHP有哪些流行的框架?PHP有哪些流行的框架?PHP作为一种十分流行的编程语言,拥有大量的应用领域和开源程序库。其中,PHP框架可以有效提高对PHP语言的理解和运用水平。框架作为一种用于开发网络应用程序的基础架构,可以让开发者在不同项目的开发中提高效率。在PHP框架领域中,有许多众所周知、使用广泛的优秀框架,其中一些常见的PHP框架如下:1.Lara

2023-09-12 08:10:03
php多租户框架 php开发常用框架有哪几个
php多租户框架 php开发常用框架有哪几个

php开发常用框架有哪几个php开发常用框架介绍:(视频教程推荐:php视频教程)一、ThinkPHPThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。Think

2023-09-12 12:16:33
saas开源php框架 saas平台建站是什么意思?百度半天也看不懂。
saas开源php框架 saas平台建站是什么意思?百度半天也看不懂。

如何成为优秀的PHP全栈开发师?首先要给提问者泼一盆凉水,全栈有风险,选择需谨慎。全栈最怕的就是都会一点,再深入一下就啥也不会,不能把全干理解全栈然后自嗨!现代社会是一个越来越分工明确的社会,每个人的时间精力是有限的不是特别有天赋自信可以驾驭,选择一个点突破人生成就的上限可能会更高。下面是我个人主观总结的全栈成长轨迹??我提取提问里面的3个关键词优秀PHP全栈

2023-09-14 09:48:43
php开源saas框架 涂鸦saas系统是什么意思
php开源saas框架 涂鸦saas系统是什么意思

为什么主流的cms内容管理系统都是php、asp的,而基于java的却很少?对于CMS系统而言,基于PHP的是主流(ASP现在基本上很少用了),这个就拿PHP和JAVA各自的优缺点做对比,可以发现他们各有优势,使用的场景也有所不同,这里就说说PHP的优势:1.JavaEE是一个很重的平台,部署难度上和维护性上,都是略逊与PHP的。2.PHP语法简单,更容易上手一些,而java的

2023-09-10 23:59:14
php持久层框架 spring boot jeesite框架技术整理
php持久层框架 spring boot jeesite框架技术整理

java有什么常用开源的框架(java开发主流框架是什么)java常用开源框架如下:1.SpringFramework【Java开源JEE框架】Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的InversionofCo

2023-08-27 00:20:24
php框架saas 一图看懂Iaas,Paas,Saas
php框架saas 一图看懂Iaas,Paas,Saas

一图看懂Iaas,Paas,Saas概念的解释这里就不多赘述了,网上一搜一大把。小马这里主要是讲究如何浅显易懂。咱们看图说话:可以看出不同平台的最高可见性(所能管理的最大范围)。例如:Iaas可自己选择OS(如阿里云服务器),Paas可自己控制选择应用和可见数据(如Paas应用接口:创建应用实例,发货等),Saas都不可见(如淘宝网)。以下内容来自网络问:阿里云是ia

2023-09-05 10:12:29