ToB Saas系统最近几年都很火。很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统。很多Saas创业公司也拿了大额风投。毕竟Saas相对传统软件的优势非常明显。

最近一年,有幸架构一个Crm saas 系统,上线了几个月来,各方面都比满意。整个系统创建过程,踩了很多坑,收获也比较多。总结一下Saas系统架构一些特点:

Saas系统分级:

SaaS系统架构成熟度模型的5个级别——从“混乱”到“乌托邦“

第0级(混乱):每次新增一个客户,都会新增软件的一个实例。
第1级(受控的混乱):所有客户都运行在软件的同一个版本上,而且任何的定制化都通过修改配置来实现。
第2级(多租户[multi-tenant]、高层建筑[Highrise]):所有的客户都已经可以在软件的同一个版本上运行了,而且他们都在同一个“实例”上运行。
第3级(多租户, 扩建[Build-Out]):此时你已经拥有了多租户、单一版本的软件模型。不过你还是可以通过硬件扩展(scale-out)的方式来进行扩充。
第4级(乌托邦):如同第3级,除非你可以找出有效的方式,以在不同的“实例”上运行不同版本的软件

应用程序必须支持多租户:

  多租户可以分为几个不同的类别(如列表下方的图所示):
    1.1,云中的简单虚拟化,其中只对硬件进行共享。
    1.2,共享应用程序,对每个租户使用不同的数据库。
    1.3,共享应用程序和数据库(效率最高,真正的多租户)。

1.分层设计

Saas系统分层大概是:

Saas系统分层

Saas系统分层:租户识别>应用层>数据访问层>缓存层>数据库

业务代码都是写在应用层。

租户识别可以用spring拦截器实现,然后使用ThreadLocal传递给后端

数据库和缓存层对应用层应该是透明的。程序员在写代码的时候,只关心业务逻辑,不应该担心多租户的问题。

2.数据隔离要透明

saas系统说起来很简单,任何系统似乎加个tenant_id(租户id)就变成saas系统了。比如原来的用户登录是:

select username,password from users where email='abc@qq.com'

改成

select username,password from users where email='abc@qq.com' and tenant_id =1;

对于复杂业务的saas系统,这样做法非常危险,而且开发效率很低。你想想如果那个程序员写sql时候忘了加 “ and tenant_id =1” . 结果不堪设想。

比较好做法是在数据库访问层对SQL进行改写。

TenantContext.exec("select username,password from users where email='abc@qq.com' ");

在连接池根据TenatnContext改写Sql.

这样做好处是,一来程序猿最多把系统搞down了,也不至于信息串了互相泄露。二来将来做分表分库也很方便,上层应用不用修改。

3. 租户识别方案

比较好做法是通过url识别租户。系统是给租户生成一个随机的三级域名,比如 abc.crm.baidu.com.   如果客户想使用自己的域名,可以在cname到我们生成的三级域名,并在管理系统里面做绑定。

这样一个租户可以有两个域名,访问saas,一个随机生成的三级域名,另外一个租户自己的域名.代码里面可以根据过来的域名,判断是那个租户然后初始化TenantContext.

如果不想通过域名来做,也可以通过登录名来判断。这种方式要涉及到租户切换问题。

4. 智能DNS

以后补充。

5. 租户管理系统(计费,订购,定制,充值,催缴)

Saas系统是必须考虑计费系统和租户控制系统。这个系统需要都是独立设计。比如那个租户购买了那些模块,一个月多少钱。租户可以创建最多的用户数。计费到期邮件提醒等功能。

计费方式一般有两种,周期性计费,类似月租方案,和使用量计费,用多少付多少。 周期性计费比较简单。也可以两者结合起来。

6. 定制化开发

SAAS的优势在于一套系统多人使用,似乎和定制化开发有冲突。比如A客户想要A功能,B客户不想要。但定制化开发是无法避免的,比如CRM系统这样复杂的系统,不可能一套系统满足所有公司的要求。定制化开发尽可能分系统,分模块去做。然后通过控制台中配置不同租户订购不同模块,那些模块可以在前端页面上显示。不同的子系统需要分开部署。前端可通过nginx根据url分发,比如 abc.crm.baidu.com/bi/xxx/xx这个地址,就分发到BI子系统。不要尝试OSGI去搞模块化,这个是个大坑。

还有开发和产品,现有需求一定要分析清楚,不要一上线发现后患无穷。新功能尽量做的独立可以配置。

7. 灰度升级

SAAS付费企业客户对系统问题都特别敏感。 为了减少升级可能出现问题的影响范围,一般都采用灰度升级策略。如果使用了url来区分不同租户,灰度升级配置就会很方便。可以配置nginx 来根据域名做分发,比如租户A(aaa.com)到实例1(版本1.0),租户B(bbb.com)到实例2(版本). 当需要域名配置非常多的时候,nginx配置文档会乱。这块时候可以考虑使用nignx_lua来写一些扩展模块。

8. 容量估计

9. Saas平台架构分层分析

Saas平台架构需要完成从用户申请链接saas到用户对自己购买的功能模块的应用整个过程,用户用起saas看似简单快捷,但这个过程却需要saas平台架构默默完成的非常复杂的处理过程。通过对saas平台架构的了解,可以清晰的分化数据的处理过程,让用户也可以明白saas平台架构处理数据的优势。下面介绍:saas平台架构分为哪几部分。

saas平台架构之呈现层:

saas平台架构的呈现层可以使用的客户端可能都浏览器或本地客户端。如果是浏览器则需要Web界面技术、交互技术等技术(如:HTMl5技术、CSS3技术、Ajax技术等)的支持,如果是软件客户端则需要远程桌面技术、软件交互技术等技术支持。

saas平台架构之调度层:

saas平台架构的调度层体现分布式系统的特性之一。调度层首先负责识别并通过AAA认证每个用户请求,然后根据业务处理器的负载、业务特征进行合理的调度。通过应用这样的架构SaaS平台可以横向扩展。此外在存储、缓存等方面为了满足平台的横向扩展需求,调度层也必须具有良好的可扩展性。

saas平台架构之业务层:

saas平台架构的业务层负责接收调度层转发过来的请求,而且还要通过对接受到的请求执行真正的业务逻辑。一般来说业务逻辑的执行使用一台服务器就够了。因此业务层实际是由一排对等的服务器组成的,每台服务器都执行相同的业务逻辑。

saas平台架构之数据层:

saas平台架构的数据库集群用于处理存储关系性很强并且对事务性要求很高的业务数据,这类数据目前还要用传统的数据库集群技术来解决,saas平台架构的数据库集群主要是根据业务特征制定数据拆分方案。同时分布式数据库用于存放海量但关系性不强的数据(如:用户的操作日志等)。

以上是对“Saas系统架构的思考,多租户Saas架构设计分析”的介绍,从saas平台架构处理数据可以看出saas平台的应用有很强的优势,如用户使用saas非常方便简单只要浏览器或本地客户端接口,saas平台处理数据要经过层层认证saas产品安全可靠,saas平台优化处理数据提高saas性能。

多租户Saas系统架构还应该满足以下需求:

编号 需求 描述
1 软件授权 云平台付费授权机制,可按时间、功能、数量等进行付费授权
2 组织入驻 允许组织主动申请加入平台
3 实名认证 个人实名认证、组织实名认证
4 资质审核 个人和组织的资质审核,如对获得的证书或荣誉进行审核
5 组织绑定 个人账户绑定组织,与组织建立关联关系
6 组织解绑 个人账户与组织进行解绑
7 账户注销 个人账户注销,并销毁所有个人资料和档案
8 统一登录 即 SSO
9 统一注册 提供统一的用户注册页面

部分资料整理自:

http://www.ruanally.com
​​​​​​​http://qk.gam7.com
​​​​​​​​​​​​​​http://www.ruanbe.com

Saas系统架构的思考,多租户Saas架构设计分析的更多相关文章

  1. 【WebMisCentral WMC】基于Extjs 4.2x的企业级用户授权认证中心系统(SSO+AM+SM),多租户SAAS应用

    http://saas.chinacloudtech.com 题记 三年磨一剑,在企业信息化的道路上已经走了3年之久了,3年多时间里做了很多,突破了很多:有无奈和辛酸,也有收货与喜悦:自我价值也在不断 ...

  2. saas系统架构经验总结

    2B Saas系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显. ...

  3. SaaS 系统架构设计经验总结

    2B SaaS系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk SaaS系统.很多SaaS创业公司也拿了大额风投.毕竟SaaS相对传统软件的优势非常明显. ...

  4. saas系统多租户数据隔离的实现(一)数据隔离方案

    0. 前言 前几天跟朋友聚会的时候,朋友说他们公司准备自己搞一套saas系统,以实现多个第三方平台的业务接入需求.聊完以后,实在手痒难耐,于是花了两天时间自己实现了两个saas系统多租户数据隔离实现方 ...

  5. SaaS 系统架构,Spring Boot 动态数据源实现!

    这段时候在准备从零开始做一套SaaS系统,之前的经验都是开发单数据库系统并没有接触过SaaS系统,所以接到这个任务的时候也有也些头疼,不过办法部比困难多,难得的机会. 在网上找了很多关于SaaS的资料 ...

  6. SaaS系列介绍之十三: SaaS系统体系架构

    1 系统体系架构设计 软件开发中系统体系架构决定了一个系统稳定性.健壮性.可扩展性.兼容性和可用性,它是系统的灵魂.体系架构是架构师所关注的核心.良好的体系架构是系统成功的开端,否则,再好的代码与设计 ...

  7. 转 多租户SaaS架构

    当使用Techcello框架开发云端多租户SaaS应用程序时,它继承了经过验证和测试的架构蓝图和工程结构.但开发人员仍然会保留灵活性,自由和控制权,以修改和扩展能力以适应其应用要求.此外,SaaS平台 ...

  8. saas 系统租户个性化域名&&租户绑定自己域名的解决方案

       实际的需求就类似github 的自定义page 1. 个性化域名    github 实现原理就是用户个性化域名使用泛域名解析,这个比较简单,大部分域名提供商都可以解决    具体操作不用赘述 ...

  9. efcore在Saas系统下多租户零脚本分表分库读写分离解决方案

    efcore在Saas系统下多租户零脚本分表分库读写分离解决方案 ## 介绍 本文ShardinfCore版本x.6.0.20+ 本期主角: - [`ShardingCore`](https://gi ...

随机推荐

  1. 云南农职《JavaScript交互式网页设计》 综合机试试卷⑤——简单分类菜单

    一.语言和环境 实现语言:HTML,CSS,JavaScript,JQuery. 开发环境:HBuilder. 二.题目(100分): 1.使用Jquery和JavaScript实现二级分类菜单管理 ...

  2. .net core中Grpc使用报错:The response ended prematurely.

    当我们调用Grpc是出现下面的一堆异常时,一般是由于LTS导致的: Call failed with gRPC error status. Status code: 'Unavailable', Me ...

  3. Python 安装第三方模块时 报Retrying(Retry(total=4, connect=None, read=None, redirect=None, status=None))...[WinError 10061]由于目标计算机积极拒绝,无法连接 错误

    今日在安装ddt模块时(Windows系统),cmd报了一个以前从未见过的错误,如下图所示: 经百度,知是镜像源的问题,将安装命令改成如下命令: pip install ddt -i https:// ...

  4. redis持久层设置

    1.默认为RDB存储方式,每次修改数据库,需要输入指令save才会存入磁盘的dump.rdb文件里,相当于备份快照,下次开启服务后会自动缓存于内存里.当然,满足下面几个条件也会自动保存到磁盘:save ...

  5. JQuery实现奇偶行不同背景颜色

    假设table的id为:t1 $(document).ready(function(){ $('#t1 > tbody tr:even').css('background','white'); ...

  6. MySQL索引失效之隐式转换

    常见索引失效: 1. 条件索引字段"不干净":函数操作.运算操作 2. 隐式类型转换:字符串转数值:其他类型转换 3. 隐式字符编码转换:按字符编码数据长度大的方向转换,避免数据截 ...

  7. 乒乓球队比赛,甲队有abc三人,乙队有xyz三人。 抽签得出比赛名单:a不和x比,c不和x,z比, 利用集合求出比赛名单

    import java.util.HashMap; import java.util.Map; /** * 乒乓球队比赛,甲队有abc三人,乙队有xyz三人. * 抽签得出比赛名单:a不和x比,c不和 ...

  8. 关于less使用初学者常犯错误

    1.多层嵌套 2.定义变量复用性不高 3.方法定义多余参数.

  9. Springboot集成邮箱服务发送邮件

    一.前言 Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能. Spring 自带了一 ...

  10. 【SpringCloud-Alibaba】环境搭建以及注意事项

    一.开发环境 JDK 1.8 SpringBoot 2.1.7.RELEASE SpringCloud-Alibaba 2.1.2.RELEASE 数据库MySQL 5.8 如果需要修改版本请参照:S ...