仅记录自己第一次做rpc(dubbo)如何实现多租户下的数据隔离效果的笔记
因为我开发的项目是一个微服务项目,所以就涉及一个业务操作需要调用多个服务才能实现功能,那么怎么才能实现在多租户的情况下rpc的数据隔离效果呢???
其实很简单,我实现了dubbo提供的一个过滤器接口:

![]()

![]()
并且写了两个过滤器,一个是消费者端,一个是生产者端,都实现了Filter接口,并重写了invoke方法,
rpc调用时会先进入消费者端TenantConsumerFilter
1. 调用发起: 消费者线程发起RPC调用
过滤器执行: TenantConsumerFilter 在消费者端执行
租户信息附加: 将租户信息附加到 RpcContext 中的invoke方法中
( RpcContext Dubbo框架自动将附件信息随请求传递到服务提供者)
例如:// 在消费者端将租户信息附加到RPC调用
RpcContext.getClientAttachment().setAttachment("TENANT_ID", tenantId.toString());
2. 网络传输
数据传递: 租户信息随RPC请求通过网络传输到服务提供者
3.生产者端执行
请求接收: 生产者端接收到RPC请求
过滤器执行: TenantProviderFilter 在提供者端执行
信息解析: 从 RpcContext.getServerAttachment() 获取租户信息
TenantProviderFilter 中的invoke方法实现了rpc调用时数据源的切换等操作,这个invoke方法中有几处关键的代码:
1.设置租户的bo,以便在整个线程执行的链路中都能拿到租户信息![]()
2.根据租户id去租户系统获取数据库的连接信息,然后放入FlexDataSource实例中存储,以及最后的使用使用数据源:
![]()
3.还有就是在进行rpc调用时肯定要明确调用到哪个服务: 可通过此注解获取当前是哪个服务
@Value("${spring.application.name}")
private String caller;
其实rpc的多数据源的切换的整个流程就是:
消费者线程: TenantConsumerFilter → 网络调用 → 生产者线程: TenantProviderFilter
不同线程: 消费者和生产者运行在不同的线程中
上下文传递: 通过Dubbo的 RpcContext 机制实现租户信息跨线程传递
更多推荐



所有评论(0)