SpringBoot实现SAAS平台的基本思路程序喵~

SaaS是Software-as-a-service(软件即服务)它是一种通过Internet提供软件的模式,厂商将应用软件统一部署在自己的服务器

并通过互联网获得厂商提供的服务。用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需

对软件进行维护,服务提供商会全权管理和维护软件。

二、SAAS模式有哪些角色

①服务商:服务商主要是管理租户信息,按照不同的平台需求可能还需要统合整个平台的数据,作为大数据的基础。服务商在SAAS

模式中是提供服务的厂商。

②租户:租户就是购买/租用服务商提供服务的用户,租户购买服务后可以享受相应的产品服务。现在很多SAAS化的产品都会划分

系统版本,不同的版本开放不同的功能,还有基于功能收费之类的,不同的租户购买不同版本的系统后享受的服务也不一样。

三、SAAS模式有哪些特点

①独立性:每个租户的系统相互独立。

②平台性:所有租户归平台统一管理。

③隔离性:每个租户的数据相互隔离。

在以上三个特性里面,SAAS系统中最重要的一个标志就是数据隔离性,租户间的数据完全独立隔离。

四、数据隔离有哪些方案

①独立数据库

即一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本较高。

优点:

为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求,如果出现故障,恢复数据比较简单。

缺点:

增多了数据库的安装数量,随之带来维护成本和购置成本的增加。如果定价较低,产品走低价路线,这种方案一般对运营商来说是无法承受的。

②共享数据库,隔离数据架构

即多个或所有租户共享数据库,但是每个租户一个Schema。

为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离,每个数据库可支持更多的租户数量。

如果出现故障,数据恢复比较困难,因为恢复数据库将牵涉到其他租户的数据如果需要跨租户统计数据,存在一定困难。

③共享数据库,共享数据架构

即租户共享同一个数据库、同一个Schema,但在表中增加TenantID多租户的数据字段。这是共享程度最高、隔离级别最低的模式。

三种方案比较,第三种方案的维护和购置成本最低,允许每个数据库支持的租户数量最多。

隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量,数据备份和恢复最困难,需要逐表逐条备份和还原。

如果希望以最少的服务器为最多的租户提供服务,并且租户接受牺牲隔离级别换取降低成本,这种方案最适合。

五、基于springboot、spring-data-jpa实现共享数据库,隔离数据架构的SAAS系统。

在实现系统之前我们需要明白这套实现是共享数据库,隔离数据架构的,在上面三个方案里面的第二种,为什么选择第二种。

第一种基本上只有对数据的隔离性要求非常高,并且有烧钱买服务器的觉悟才能搞。第三种对数据的隔离性太差,只要在程序实现

上出现些问题就可能导致数据混乱的问题,并且数据备份还原的代价非常高。所以折中我们选择第二种。

首先在SAAS系统中,一般都是一套系统多个租户,也就是说所有的租户共享同一套系统,但是每个租户看的数据又要不一样。

确定了数据隔离级别之后,我们就需要明确SAAS系统在实现上的难点:①动态创建数据库;②动态切换数据库;我们都知道传统的

系统中数据源的信息一般都是写死在系统配置文件的,在启动系统的时候加载配置信息创建数据源,这样的系统是单数据源的。这明显不适用

SAAS系统,SAAS系统是有多少个租户就需要多少个数据源的,并且会根据租户的信息动态的切换数据源。

技术准备:springboot,spring-data-jpa,redis,消息队列,mysql,maven等。

工具准备:IDEA,PostMan

项目结构:这里准备了两套系统,平台管理端和租户端,这两套系统是独立存在的可以单独运行。

在demo里面,管理端(saas-admin)创建的是一个独立的springboot项目,这里只是实现了租户的注册,及通过消息队列通知租户端创建数据库。

首先在saas-admin系统的POM.xml里面添加依赖

管理端就这样了,在实际的系统的中租户一般也是注册信息到管理端,并且注册信息的时候可以选择使用版本,并且如果系统需要收费的话,也是在支付费用之后才会发送创建

数据库的消息。

下面主要看下租户端,动态创建数据库和切换数据库都是发生在租户端的。

租户端也是一个独立的springboot项目,可以独立运行部署,使用的技术完全和管理端一样,POM配置完全相同。

①spring.jpa.properties.hibernate.multiTenancy=SCHEMA;

这个是hibernate的多租户模式的支持,我们这里配置SCHEMA,表示独立数据库;

②spring.jpa.properties.hibernate.tenant_identifier_resolver;

租户ID解析器,简单来说就是这个设置指定的类负责每次执行sql语句的时候获取租户ID;

③spring.jpa.properties.hibernate.multi_tenant_connection_provider;

这个设置指定的类负责按照租户ID来提供相应的数据源;

其中②和③是需要自己实现的;

租户ID解析器:

publicclassMultiTenantConnectionProviderImplextendsAbstractDataSourceBasedMultiTenantConnectionProviderImpl{//在没有提供tenantId的情况下返回默认数据源@OverrideprotectedDataSourceselectAnyDataSource(){returnTenantDataSourceProvider.getTenantDataSource("Default");}//提供了tenantId的话就根据ID来返回数据源@OverrideprotectedDataSourceselectDataSource(StringtenantIdentifier){returnTenantDataSourceProvider.getTenantDataSource(tenantIdentifier);}}切换数据源的操作是通过spring的aop机制实现的,可以看到切换数据源的操作发生在业务层。通过租户的ID获取存储在本地线程中相应数据源完成业务操作。

@Aspect@Order(-1)@ComponentpublicclassTenantAspect{@Pointcut("execution(public*com.michael.saas.tenant.service..*.*(..))")publicvoidswitchTenant(){}@Before("switchTenant()")publicvoiddoBefore(JoinPointjoinPoint)throwsThrowable{System.out.println(SpObserver.getTenantId());TenantDataSourceProvider.getTenantDataSource(SpObserver.getTenantId());}@AfterReturning(returning="object",pointcut="switchTenant()")publicvoiddoAfterReturning(Objectobject)throwsThrowable{}}过滤器获取存放session中的租户ID存放本地线程

publicclassBaseFilterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequestreq=(HttpServletRequest)servletRequest;Objectobj=req.getSession().getAttribute("TENANTID");if(null!=obj){SpObserver.putTenantId(obj.toString());}filterChain.doFilter(servletRequest,servletResponse);}@Overridepublicvoiddestroy(){}}值得一提,租户ID是登陆时存放到session中的,也代表着切换数据源的前提是先登陆。

@PostMapping(value="/login")publicbooleanlogin(@RequestParam("username")Stringusername,@RequestParam("password")Stringpassword,HttpServletRequestrequest){try{Tenanttenant=tenantService.findByAccountAndToken(username,password);if(null!=tenant){request.getSession().setAttribute("TENANTID",tenant.getId());}else{returnfalse;}}catch(Exceptione){e.printStackTrace();returnfalse;}returntrue;}既然是独立数据库,就避免不了生成独立数据库的问题,我这边是通过jdbc创建新的数据库,不一定是好的实现,但能完成基本要求,创建新数据库的操作在租户注册账号时完成,这里使用了redis消息队列去异步生成数据库。

THE END
1.在吗app下载在吗交友app全部平台 历史版本 标签:共享 介绍 在吗app,一般又称在吗系统交友app,在吗交友。 兴趣特长共享平台立目标,大家一起监督,一起见证奇迹的发生!是不是想找专业的人来咨询焦虑,失眠,自卑,社恐,情绪疏导等,来在吗! 开发者:广州北极兔网络有限公司 备案号:粤ICP备2022096970号-3A 在吗app下载安装失败或使用异常,https://m.liqucn.com/rj/9179966158727.wml
2.想吃邻居炒的家常菜吗?共享家厨平台即将进驻长沙共享家厨平台即将进驻长沙 长沙晚报掌上长沙3月26日讯(记者 小李卓)一个人在长沙打拼,下班后不想做饭,吃够了外卖,拿起手机下单,可以去附近邻居家吃一顿本地家常菜;另一边,退休在家的父母做得一手好菜,平时菜做多了,可以把剩余的厨房产能销售出去,既展示厨艺还能赚点外快,这样的场景马上就能在长沙体验到。https://www.icswb.com/h/151/20170326/469745_m.html
3.资源共享财税与海关专业委员会专业委员会对于在地方政府推迟复工期间,因疫情防控需要提供劳动的员工,或企业根据人社部发〔2020〕8号的规定实施灵活用工措施,安排职工通过电话、网络等灵活的工作方式在家上班完成工作任务,属于正常出勤,企业无须支付加班工资,但建议考虑给与一定的补贴。 三、被采取隔离措施的员工工资如何支付 https://www.lawyers.org.cn/info/c80b3871a04d40e19189780f14743c75/
4.2024年《档案法》知识竞赛100题及答案.pdf10.国家推进档案信息资源共享服务平台建设,推动档案数字资源 )、()共享利用。 A.跨区域 B.跨部门 C.跨国家 D.跨社区 11.有下列哪种行为之一的,由县级以上档案主管部门、有关机关对 直接负责的主管人员和其他直接责任人员依法给予处分?() A.丢失属于国家所有的档案的; B.擅自提供、抄录、复制、公布属于国家所有https://m.renrendoc.com/paper/321662622.html
5.省级以上人民政府应当组织有关部门统筹建设家庭教育信息化共享省级以上人民政府应当组织有关部门统筹建设家庭教育信息化共享服务平台,做好以下几点()。 A. 开设公益性网上家长学校和网络课程 B. 开通服务热线 C. 提供线上家庭教育指导服务 D. 加强基础设施建设 题目标签:信息化部门平台如何将EXCEL生成题库手机刷题 https://www.shuashuati.com/ti/48502913962e43cab1281aa2a6abaab3.html?fm=bd003b86d47ee4ca5adea035944a027851
6.淘宝分享赚佣金的平台有哪些?淘宝分享赚佣金分平台哪个最好用淘宝分享赚佣金的平台有哪些?淘宝分享赚佣金分平台哪个最好用? 在淘宝购物中,我们经常需要将商品链接转换为二维码或短链接,以便在社交媒体上分享或通过其他渠道推广。然而,传统的转链方式不仅繁琐,而且佣金较低。因此,一款好用的淘宝转链工具app显得尤为重要。高省APP就是这样一个实用且高佣金的转链工具。https://www.jianshu.com/p/f596302b7ff3
7.十大共享充电宝品牌共享充电宝都有哪些品牌共享充电宝哪家好,共享充电宝品牌排行,共享充电-充电宝共享平台有哪些 共享充电宝哪个好?经专业评测的2024年共享充电宝名单发布啦!居前五的有:街电JIEDIAN、怪兽充电、小电、美团充电、搜电充电SOUDIAN等,上榜共享充电宝五大榜单和著名共享充电宝名单的是口碑好或知名度高、有实力的,排名不分先后,仅供借鉴参考,想知https://www.maigoo.com/maigoo/6853gxcdb_index.html
8.每个省每个地市分别整合形成统一的政务数据共享交换平台(6)共享:依据共享数据清单,实现清单内的数据资源都能通过统一的数据共享交换平台实施共享。 (7)协同:按照协同治理和服务需求,列出跨部门协同应用的信息需求,并以此推动跨部门的业务协同办理。 二、地方责任(8项) 参照部门的 7 项责任。同时,各省(区、市)要加大整合力度,明确本级数据共享交换平台管理单位,原则上每https://www.dzwww.com/shandong/sdnews/201708/t20170829_16353673.htm
9.城市运管服平台地方经验▎太原市:加快建设平台让信息化为城市管理赋业务指导系统已上传 57 条地方性政策法规内容至国家平台,原有数字城管系统已升级为指挥协调系统,行业应用系统已涵盖智慧环卫系统、市政公用行业数据共享平台、太原市排水管网管理系统、道桥设施管理系统和智慧照明运维管控系统等,公众服务系统已实现多渠道统一整合,数据中心已建成一体化数据交换及汇聚系统。并研发城市运行https://www.thepaper.cn/newsDetail_forward_17766762
10.市域产教联合体的内涵要义功能框架和运行机制摘要:市域产教联合体是以产业资源和教育资源都非常丰富的产业园区为依托,由地方政府、产业园区、企业、学校和科研机构等利益相关者通过产教融合等实践活动,形成的培养人才、创新创业、促进产业经济高质量发展的命运共同体。在市域产教联合体中,各利益相关方居于不同的位置,资源禀赋各异,它们具有资源互补、价值共享的天https://kjc.zbvc.edu.cn/info/1019/2781.htm
11.西安市优质教育资源共享平台西安市大学区优质教育资源共享平台http://www.xaeduyun.cn/s40ir/ablog/cblog/mblogBrowse.do?blogid=2c90815f799dc3430179c06616fc0bef
12.教育资源共建共享建设的几点思考如何推动教育资源共建共享,作者认为:教育资源共建共享首先应确立好教育资源共建共享机制;其次,资源共建共享平台必须有强大的云技术支撑服务体系,优质资源必须放置在强大的云技术支撑服务平台上;第三,资源共建共享平台建设应当建立起相应的国家或地方标准;第四,国家或地方应当为资源共建共享平台建设给予一定的经费补贴。https://www.age06.com/Age06Web3/Home/MobileImgFontDetail?Id=91350357-032c-4db3-b9ed-a2984ed893c7