18910140161

saas系统架构经验总结

顺晟科技

2021-06-16 10:51:37

610

2B Saas系统近年来非常流行。许多初创公司正试图创建企业级的cRM、HR、销售和桌面Saas系统。许多Saas初创公司也接受了大量风险资本。毕竟Saas相对于传统软件有明显的优势。

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

1.分层设计

Saas系统分层大致是:

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

业务代码写在应用层。

租户识别可以通过spring拦截器实现,然后通过ThreadLocal传递到后端

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

2.数据隔离应该透明

saas系统说起来很简单,任何系统看起来都变成了带有租户_id的Saas系统。例如,原始用户登录是:

从电子邮件='abc@qq.com '的用户中选择用户名和密码

换成

从email='abc@qq.com '和tenant_id=1的用户中选择用户名和密码;

对于业务复杂的saas系统,这种方法非常危险,开发效率非常低。如果你认为程序员在写sql的时候忘了加上“and tenant_id=1”,结果是不可想象的。

更好在数据库访问层重写SQL。

TenantContext.exec('从用户处选择用户名、密码,其中email=' ABC @ QQ.com ' ');

根据连接池中的TenatnContext重写Sql。

这样做的好处是,这样一来,最多能让程把系统搞垮,以免向对方泄露信息。其次,以后分表分数据库非常方便,不需要修改上层应用。

3.租户识别方案

更好通过网址来识别租户。该系统为租户生成一个随机的三级域名,如abc.crm.baidu.com。如果客户想使用自己的域名,可以在cname中获取我们生成的三级域名,绑定到管理系统中。

这样的租户可以有两个域名,access saas,一个随机生成的第三级域名,以及另一个租户自己的域名。在代码中,可以根据即将到来的域名来判断哪个租户,然后初始化TenantContext。

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

4.智能DNS

稍后添加。

5.租户管理系统(计费、订购、定制、充值、呼叫)

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

一般有两种计费方式,定期计费(类似于月租方案)和使用计费。定期计费相对简单。或者两者的结合。

6.定制开发

SAAS的优势是一个系统被很多人使用,这似乎和定制开发有冲突。比如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编写一些扩展模块。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航