顺晟科技
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编写一些扩展模块。
04
2022-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2019-08