开发一个SAAS系统如何搭建技术架构?


Saas系统最近几年都很火 。很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统 。很多Saas创业公司也拿了大额风投 。毕竟Saas相对传统软件的优势非常明显 。
最近一年 。有幸架构一个Crm saas 系统 。上线了几个月来 。各方面都比满意 。整个系统创建过程 。踩了很多坑 。收获也比较多 。总结一下Saas系统架构一些特点:
【开发一个SAAS系统如何搭建技术架构?】1.分层设计
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. 容量估计
其他观点:
我们衡量一个SaaS系统的好坏通常通过SaaS成熟度模型来进行评价:
1、SaaS成熟度模型
? Level1:定制开发的SaaS应用
– 多次开发模式
? Level2:可配置的多租户SaaS应用
– 一次开发多次部署模式
? Level3:单实例支持多租户的SaaS应用架构
– 一次开发一次部署模式
? Level4:支持可伸缩性的多租户SaaS应用架构
开发一个SAAS系统如何搭建技术架构?

推荐阅读