什么是SAAS
SAAS Software-as-a-Service的缩写名称,意思为软件即效劳,即通过网络提供软件效劳。
SaaS 代表软件即效劳:一种软件容许形式,其中软件集中托管并通过订阅停止访问。
以上描绘比较笼统模糊,用一幅图来说明。
上图第一列是传统的系统,第二列是Iaas, 第三列是Paas, 第四列就是我们说的SaaS。
关于云架构太大,本篇不做深化讨论。仅说明一点,从上图可以看出SaaS的定位,关注于应用效劳和业务数据的处置。
技术栈
什么是技术栈
技术堆栈是用于开发 Web 或挪动应用程序的编程语言、开发工具、库、框架和软件的组合。 它是开发过程的根本要素,也是创建应用程序的第一步。
技术堆栈分为两个不同的方面,即前端和后端。
为什么技术栈很重要
技术堆栈将决定应用程序的可扩展性、功能性和可行性。 因而,根据公司需求做出关于最佳技术堆栈的决策。
SaaS 技术栈选择原则
公司或者团队当前技术才干和熟悉的技术生态。
- 选择的开发语言和开源社区尽量有一定规模和广泛使用水平。
- 学习曲线要低。
Python 比其他编程语言更容易学习,从语法简单、用处广泛、阅读 Python 代码非常直观。
Java技术应用系统比较成熟,历史上开源社区广泛采用java。
假设没有历史负担,个人推荐使用python。python除了学习本钱低,在AI和根底研究领域被广泛采用,将来相当长的时间内会越来越重要并成为主流语言。
- 市场上可以相对容易的找到技术栈的人才。假设选了一个小众的技术栈,无论技术多牛,但人员离任更替是必需考虑的因素,职位挂进来两个月,能找来面试的都没几个。尽量不要去选。
- 技术栈的长期价值。要对采用技术栈的生命周期有个判断。尽量选取大厂,大基金的热度较高的,近几年开源且有一定成熟度的技术栈。防止选用过气的开源框架,无论曾经多么辉煌。
- 此外,SaaS 技术堆栈要可以适用敏捷化、简化开发、简化维护等可以节约本钱的要求。
SaaS 技术栈才干等级
定制开发 --> 可配置 --> 多租户 --> 高性能 --> 可伸缩
LEVEL1 定制开发
软硬件都由SAAS效劳商提供,软件的使用者只需要按时间、用户数、空间等逐步支付租赁使用费用即可。LEVEL2 可配置
通过不同的配置满足不同用户的需求,而不需要为每个用户停止特定定制,以降低定制开发的本钱。LEVEL3 高性能的多租户架构
多租户:通过一定的战略来保证不同租户间的数据隔离,确保不同租户即能共享同一个应用的运行实例,又能为用户提供独立的应用体验和数据空间。实现方案有独立数据库、共享数据库独立数据架构、共享数据库共享数据架构。
高性能:满足多租户并发访问的性能挑战。LEVEL4 可伸缩性的多租户架构
处置租户数量增加因集中式数据库带来的性能瓶颈。
SAAS实现阶段性成熟度推进
SaaS多租户架构综述
如图,单租户形式和多租户形式
多租户要处置的问题
利用多租户架构战略降低效劳器根底设备本钱。单一的信任来源。降低开发本钱和缩短产品交付时间。
直接的说单租户是资源独享,优势是资源隔离,安全性高;
多租户是资源共享,优势是快速交付,硬件本钱低;
开发语言
前面的原则已经提到,这里不做过多的赘述。建议选择主流语言,如
python;
Java;
Node.js;
Rect;
Go;
等等
云效劳商
选择一个云效劳商。不做广告,不种草。
但是有一点要注意,每个云厂商都有自己的技术生态圈。除了性价比,稳定性,可用性等因素,还要考虑自己的团队或者自己的产品方向,是否和该云效劳厂商的技术生态切合,也是一个重要考虑的因素。
微效劳
这是一个比较大的话题,本篇不过多论述,后面有时间会有专门的文章讨论。这里只做简单说明,后面多租户的会举例说明一下。
架构经历了从经典的分层架构,面向效劳的架构,到微效劳架构,无效劳架构也正在来得路上。
这里推荐比较成熟的微效劳架构。从理论到理论已经被证明了。
容器&编排
管理、编排和创建微效劳集群环境。
没有什么纠结和犹豫的,Docker + Kubernetes 组合。假设相应的原厂商有提供产品化的替代品,建议可以考虑,一般在稳定性至少是可用性上都有提升。
Docker
Kubernetes
数据库
为了支持多租户,有开源技术栈有两个选择。
假设租户量大,流量比较高,团队技术才干足够的话,MongoDB是首选。MongoDB是一种安全可靠、可弹性伸缩的云数据库效劳。
否则 Mysql + PostgreSQL 来实现多租户数据也是一个可以接受的选项。
IaC
字面意思是根底架构即代码(Infrastructure as Code),可以用代码来管理维护资源。允许保管根底设备状态,从而可以跟踪对系统(根底设备即代码)中不同组件所做的更改,并与其他人共享这些配置。
基于传统的DevOps概念,增加了自动配置化。
主要作用有两点:
自动配置开发测试环境。
自动化配置 SaaS 应用程序停止代码部署,动态触发和构建新租户。
开源工具有很多,这里主要推荐Terraform :
安全高效地预览、配置和管理云根底架构和资源;
应用非常广泛,将根底构造部署到多个云;
自动化管理根底构造
Terraform可以创建配置文件的模板,以可反复、可预测的方式定义和预配ECS资源,减少人为因素导致的部署和管理错误。可以屡次部署同一模板,创建相同的开发、测试和消费环境。
Terraform 数据流图
编译部署工具推荐git系 + jenkins。
Jenkins自动化部署可以处置集成、测试、部署等反复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变卦的信息。
Jenkins持续集成缩短了从开发、集成、测试、部署各个环节的时间,从而也就缩短了中间呈现的等待时间;持续集成也意味着开发、集成、测试、部署得以持续。
消息队列 (MQS)
常见的 MQS 是 RabbitMQ,RocketMQ, Celery等异步通信。
从延迟或调度任务,到通过关键 Web 事务进步可靠性和耐久性,解耦微效劳应用程序。
这里推荐老东家的RocketMQ,支持国产的中间件产品。
历年双 11 购物狂欢节零点千万级 TPS、万亿级数据洪峰,发明了全球最大的业务消息并发以及流转纪录。
缓存
说到缓存,主要还是redis 和 memcached。redis与memcached相比,比仅支持简单的key-value数据类型,同时还提供list,set,zset,hash等数据构造的存储;redis支持数据的备份,即master-slave形式的数据备份;redis支持数据的耐久化,可以将内存中的数据坚持在磁盘中,重启的时候可以再次加载停止使用等等,这似乎看起来redis比memcached更加牛X一些,那么事实上不一定。
需要在网络IO模型,内存管理机制,数据一致性问题,集群管理方式等多个维度停止衡量。
这里推荐redis,支持主从、集群和读写分别架构,具备低延迟、大吞吐、弹性扩缩容的特点。
云存储
选定了云厂商,都会有相应的云存储。一般都提供管理运维平台和API使用接口。如阿里oss, AWS 的 S3等等。
汇总到这里
上面主要围绕开发,部署,发布的流程用到的技术栈做了综述。
还没完,下面讲一下技术栈需要处置的重点问题。
多租户架构选型
多租户架构设计主要处置的问题是,可为租户提供托管效劳,即软件即效劳应用程序在多个客户之间共享。
多租户技术架构主要通过应用层的多租户和数据层的多租户来实现这个目的。
微效劳 + 容器 + ECS
微效劳已经不是陌生的架构,因为它们最大利用可用云资源、安全性和性能之间提供了平衡。
它还引入了更精细效劳(微效劳)的分解系统概念。鉴于篇幅不过多论述微效劳优劣及过多的概念。
这里仅用一个简化的技术架构图来说明。
上面的综述章节,主要是基于微效劳的架构来说明的。
Kubernetes多租户架构
Kubernetes 命名空间隔离的特性就可以实现多租户。不能不说Google的技术才干底蕴还是很强的。
无效劳架构
FaaS(函数即效劳,Function as a Service):将函数代码托管给云产商,以效劳形式运行,支持事件触发。代表产品有腾讯云SCF、AWS Lambda等。
BaaS(后端即效劳,Backend as a Service):指云平台提供的后端组件整合,开发者无需开发和维护后端效劳,通过API/SDK的调用便可获得例如数据存储(对象存储、云数据库、云中间件等)、消息推送、账号管理、地图定位、AI、IoT等才干。
多租户数据库
遗憾的是以目前的数据的技术才干和设计理念,还不能完全适配多租户架构的需求。最直接粗暴的方式是数据库隔离,在安全性和性能上满足了多租户的要求。
目前广泛采用的是基于租户ID做隔离。使用这个方法的原因不是因为这种设计好,而是方法实现起来比较廉价,同时也带来了安全和资源抢占的问题。
共享表形式
所有租户共享数据库同个schema下的表数据。是使用比较普遍的的一种方式。
详细实现细节上各个公司团队不一,根本原理是根据租户ID做逻辑隔离。
这种没有安全性可言,一个bug就可以导致数据安全泄露事故。风闻,曾经发生过的某租户可以看到别的租户的数据的这种安全泄露的严重事件。资源隔离也无从谈起。当然,通过设计和权限限制可以做到一定的预防才干。
使用它的原因,主要是这种实现比较直接,尤其是对老系统的改造量不是特别大。
A schema per tenant
每个租户一个Schema,也称为bridge模型,是一种改进的多租户数据库方法,它比共享表形式更安全。
需要注意的是,假设租户数量比较庞大,这种形式会引起数据库对schema的管理复杂性。导致性能下降明显。PostgreSQL支持sckema分区的才干比较强,所以比较适宜这种设计形式下使用。
但是PostgreSQL仍然难以做到多租户的资源隔离。比如,一个租户高频的恳求了大量数据库读写恳求,会导致数据计算和存储资源的互相抢占等问题。
Database Per Tenant
有挖苦意味的是,每个租户一个独立的数据库,是目前技术上能做到最好的方案。但是,根底设备本钱比较高,往往会形成数据库性能的闲置浪费。
多租户数据库技术选型
PostgreSQL+Mysql.MongoDBGraphQL等等
多租户应用效劳
多租户应用可以基于前面的架构选型做相应的设计和代码开发。假设是改造传统的设计架构,原则也是一样的。
Web 效劳多租户
在web效劳中设计租户空间和租户管理等。为每个租户分配子域,用于识别租户或组织。设计DNS/Nginx/Apache,并添加相应逻辑对租户停止映射。用户角色管理。
这里需要说明使用通配符处置DNS子域问题。
子域过多,例如,‘org1.saas.com’、‘org2.saas.com’…等等,根据这种URL 构造,对 DNS 更改来停止每个租户的识别、身份验证和受权。
假设子域过多,例如,‘org1.saas.com’、‘org2.saas.com’…等等无限下去,会相当难以维护。
一种处置方法就是使用通配符记录放在DNS 管理记录中。
通配符子域将所有路由重定向到多租户架构(到负载平衡器、应用程序效劳器或集群端点)。
CNAME ()记录指向“app.saas.com”或“saas.com/login”。 ()表示子域的通配符。
最后,(A) 记录指向 ECS 集群、ALB 或 IP。
NGINX 多租户配置
Nginx需要配置 Nginx.conf 和效劳器块(virtual hosts)。 为Nginx Web 效劳器设置通配符virtual hosts。为所有租户设置一个通配符 VirtualHost。 通配符形式将匹配子域并相应地路由到SaaS 应用程序root。
为了满足数据传输的安全性要求,需要配置租户子域下的证书。 将它们添加到 CDN、负载平衡器或 Web 效劳器中。并在nginx中增加相应的配置项。
案例
让我们来使用一张架构图来回忆和整合一下前面所讲的所有内容。
以上有些开源项目没有做介绍,比如监控,效劳注册发现,搜索等等。
这些主要是根据使用场景和详细要求而定,等后面有时机再详述。
感激耐心看完,希望能带来一些协助。您的点赞,转发是我对我最大的鼓励:) |