深入讲解千万级常规saas系统架构(干货资料)

2024-01-15
来源:网络整理

什么是saas系统

Saas的概念来源于云计算领域,其本质是软件即服务。 要理解这个概念,我们需要从历史开始。 对于早期的软件行业来说,一般如果A公司需要一个进销存系统,软件公司就会根据A的需求开发一个进销存系统,B公司也需要一个。 然后软件公司根据B公司的需求,为B公司开发一套系统。以此类推,每家需要采购、销售、库存系统的公司都需要一家软件公司为其开发一套系统,并将其私有化并部署到自己的系统中。公司。

随着云计算时代的到来,云平台的概念逐渐深入人心。 是否可以将各种软件迁移到云端? 即建立一个由软件公司维护的中心化系统。 其他企业需要使用该系统,只需要您在系统中注册即可。 此时的系统就是我们所说的saas系统。

它是一个互联网平台,由开发它的公司维护,允许客户快速、低成本地访问它。

saas系统的优点和缺点

优势:

1、客户快速、低成本接入

不再需要像以前那样为每个客户独立开发,平台在互联网上,客户想要使用只需要注册一个账户。

2、客户无需关心系统的运维

系统由软件公司维护,即使没有IT人员,客户也可以照常使用系统。传统的私有化部署项目必须要求客户有自己的IT人员负责日常运维。

3、主动权掌握在软件公司手中

随着SaaS产品的流行,以前纯粹的一方软件公司的地位得到了提升。 由于公司的数据和系统都掌握在软件公司手中,因此软件公司在谈判时拥有更多的筹码。

缺点:

1、无法灵活定制需求

与传统方法相比,由于SaaS系统是一个共享系统,它只能向外界提供一组能力。 如果部分客户有定制化需求,是无法满足的,因为单个客户的需求并不代表所有客户都需要。 但对于toB软件来说,个性化需求是司空见惯的,所以SaaS系统设计的一大难点就是宣传性和个性化之间的权衡。 在个性化的过程中,不会影响到其他系统(对于SaaS系统来说,公共代码往往会因为用户的个性化需求而改变,导致个性化得到满足,但公共代码却出现了Bug)。

2、信息安全问题

由于个人客户数据存储在云端,客户有理由质疑其日常数据的安全性。 这也是很多客户,尤其是大中型客户不愿意把业务放在SaaS系统上的原因:本质上,云数据是否会泄露给社会是一大担忧; 另外,一旦公司运营中出现不合规问题(腐败、虚假会计等,这些在公司运营时不可避免地会发生,尤其是初创公司),问题的情况就会升级,因为云平台已经帮他们记录了问题,而这件事的主动权可能并不在他们公司内部。

3、市场大但缺乏成熟案例

Saas拥有千亿的市场,但目前toB Saas还没有成熟的案例。 虽然独角兽很多,但仍在探索之中。

saas系统要解决的问题

一、共性和特点问题

对于SaaS系统来说,每个企业的个性化需求都是共性的、合理的,但如何将个性化需求低成本、高敏捷地融入到SaaS系统中是一个棘手的问题,这就要求SaaS系统应该具备比较强的能力。 灵活性、可扩展性。系统架构设计必须是可配置的、高度可扩展的。 如何在不影响其他功能的情况下快速响应个性化需求,是架构师优先考虑的问题。

2、数据安全保护

如何让接入saas系统的客户相信saas系统是值得信赖的系统,是一个重要的问题。 这个问题需要从业务、技术、公司背景等多方面来解决。 技术上可以利用数据隔离、安全网关等技术增强数据安全性。

3.多租户

留在saas系统的客户是多种多样的。 与传统项目不同,crm系统的用户可能只是企业内部人员。 在SaaS中,我们通常将企业称为租户。 租户之间互不影响,客户A的问题也不会影响客户B。

针对上述问题,系统架构的模块化和隔离性就显得非常重要。 模块化就是功能的细分。 每个模块只做特定的事情。 如果模块划分合理,系统既能保留共性,又能快速响应个性特征。 隔离是指隔离多租户的数据、服务、前端和访问域名。 数据和服务是用户看不到的,但必须要做到。 前端和访问域名的隔离是用户可以实际发现的。 不同的租户使用不同的域名进入SaaS系统时看到不同的前端,这对用户来说是一个很大的心理安慰。 他们能真正感受到自己与其他租户“隔离”。

SAAS系统架构

我们从左到右谈谈

终端层

目前SaaS产品普遍为PC端,少量App端。 对于终端层来说,我们的用户都属于个人租户(租户类似于企业的概念)。 用户登录后,请求中会携带租户标识。 每个请求都会携带租户ID并首先进入路由层。

路由层

路由层根据租户标识分发请求,不同租户访问不同的服务。

这里比较成熟的做法是给每个租户分配不同的三级域名,这样从每个租户的角度来看,他们访问的是自己的网站,而不是大家访问同一个网站。 对于不懂技术的客户来说,这是一个很大的安慰。 他们认为这个系统是他们的,就像公司内部部署的系统一样。

*:一般每个公司都会有一个一级域名,然后公司会将这个一级域名下的二级域名分配给不同的业务单位或部门。 二级域名下的三级域名可由部门自行分配。 所以这里说SaaS产品的每个租户都可以分配一个三级域名。 实际情况下,您可以根据情况决定,只要每个租户的域名不同即可。

表示层

这是我们的前端项目层。 我们会针对不同的租户构建不同的前端代码仓库,依靠b8s进行快速部署。 对于每一个新的租户,我们都会为其搭建一个代码仓库,并部署到线上。 每个租户的用户都可以通过路由层准确访问为其构建的前端项目。 这样做的目的也是为了实现租户的物理隔离。 如果某个租户有个性化需求,我们只修改该租户对应的代码,而不会触及其他租户。

服务层

对于服务层项目,为了保证系统的灵活性,我们将公共服务进行拆分,形成能力中台。 针对不同的租户,我们会给每个租户一个业务前台,数据存储统称为后端。

统一API网关

每个租户的前端项目访问后端时,都会在请求中携带租户ID。 统一的api网关会根据不同的租户ID将数据传递到相应的中后端服务。 并在转发过程中实现认证、拦截、熔断、降级等安全保障。

中平台

中台的能力与业务无关,只对外提供标准接口。 例如,我们SaaS服务中的很多功能都使用支付接口,需要外部支付。 那么我们需要统一连接第三方支付的能力,形成一个结算中心。 它只是提供一个支付接口,打通各种支付渠道。 您无需关心支付订单是三步生成还是两步生成。 每个租户生成订单的步骤可能不一致,所以这个交给前台处理。

前台

前台是中端能力的组装者。 每个租户都会有相应的前台,针对不同的租户进行个性化的组装中台能力。 每个前端代码也是物理隔离的。 每次添加新租户时,都会添加一组新的前端代码。 这确保了每个租户的个性化需求不会相互冲突。

后台

后台是数据存储,数据存储必须根据数据的性质进行隔离。

以我们常用的数据库为例(其他的es等也类似),目前的做法是:

1、每个租户创建一个数据库,用于存储小前台产生的数据。

2、大中型平台产生的数据集中存储

这样对于数据管理和数据恢复来说更加合理。 在实际运维中,我们发现如果将不同租户的数据集中存储(依靠一个字段来区分不同租户的数据),这会给数据恢复带来很大的压力,因为实际运维是基于租户运维。 如果我们要恢复某个租户的数据,就必须恢复所有租户的数据,或者从大量的数据中提取出当前租户的数据。 如果各个租户的数据库是物理隔离的,我们只需要恢复当前租户对应的数据库即可。

一些想法

很多人认为这样的设计过于复杂。 每次添加新的租户,都需要复制代码、部署项目、修改各种路由。 为每个租户部署一套资源太浪费了。 这确实是事实。 为了保证系统的扩展性和灵活性,我们对模块进行了更仔细的拆分,但是这个问题在云时代会得到很好的解决。 这就是为什么saas系统直到云计算时代才出现。

传统上,我们每次添加新的租户,都需要申请服务器、部署项目、复制代码。 但在云计算时代,我们依靠容器化、CICD等技术来实现快速部署和弹性伸缩。 这也解决了传统方法的技术瓶颈。

例如,每次添加新租户时,我们需要做的是:

1.复制代码

借助各种代码托管平台,我们可以快速复制代码仓库

2. 数据库复制

借助各种数据库工具和自动化脚本,我们可以快速复制数据库

3、每个租户的系统独立部署

借助基础镜像,我们可以一键部署一整套服务,并且由于 的​​特性,我们可以为这一整套服务灵活分配CPU和内存

4. 路由切换

借助配置中心(等)我们可以随时动态修改网关的路由

以上四点都有相应的技术可以解决。 公司还可以根据上述四个步骤创建一个自动化流程,一键创建租户。 这个自动化过程并不是很复杂。

分享