目录
需求点
多租户架构示意图
技术栈
技术点
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系列文章。