目录

需求点

多租户架构示意图

技术栈

技术点

GetWay

服务

线程级缓存

第三方接口

MQ消息

文件系统

DAO层

总结


多租户架构,是基于一套代码运行多个公司的业务的架构。现在基于如下结构:

需求点

1. 不同公司域名,或者用户名@公司简写2. 网关解析域名和租户映射,并存储3. 服务之间传递租户信息4. 业务系统接到请求( HTTP请求,RPC请求,MQ消息 )就先获取传递的租户信息5. 服务里线程级别存储租户信息,部分框架会复用线程,所以处理一个请求后需要清空租户6. 存储数据,文件 都需要根据租户各自7. 跟第三方通信(RPC请求,MQ消息)也需要 添加租户信息

多租户架构示意图

技术栈

网关:getway

服务:springmvc,springboot,struct2

线程级缓存:ThreadLocal

PRC:Dubbo

HTTP:Feign

MQ:RocketMQ

File:SSO,S3,FastDFS,FTP

持久化:Mybatis(数据源,Sql解析)

DB:Mysql

技术点

GetWay

解析租户

添加租户到HTTP Header中,位置:Feign Interceptor

服务

Springmvc,SpringBoot,Struct2

每个组件都有Filter或者Interceptor,解析后放在缓存中

线程级缓存

使用ThreadLocal,一个线程内可以用。

父子线程就穿不过去了,需要用InheriableThreadLocal。

详细代码分析见

第三方接口

PRC:Dubbo 拦截器

HTTP:Feign 拦截器

MQ消息

MQ:RocketMQ

文件系统

File:SSO,S3,FastDFS,FTP

按照租户ID区分不同的路径

DAO层

持久化:Mybatis(数据源,Sql解析)

如果分表,单表添加了TenantID作数据的分离,需要Sql中表名或者where中添加条件(详细参考:Saas.数据权限控制(Sql解析)_凯瑞.路的博客-CSDN博客)

如果分库,动态数据源AbstratRoutingDataSource,Mycat中间件

总结

这是一个框架类的文章,目的就是知道哪个位置需要干什么事,具体技术细节参考其他Saas系列文章。