SaaS架构经验总结

2B Saas系统最近几年都很火。不少创业公司都在尝试建立企业级别的应用 cRM, HR,销售, Desk Saas系统。不少Saas创业公司也拿了大额风投。毕竟Saas相对传统软件的优点很是明显。   前端

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

 

1.分层设计

saas系统分层大概是:程序员

 

租户识别>应用层>数据访问层>缓存层>数据库spring

 

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

租户识别能够用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. 容量估计

 

暂时先写这么多了。有时间再补充。

相关文章
相关标签/搜索