因为我开发的项目是一个微服务项目,所以就涉及一个业务操作需要调用多个服务才能实现功能,那么怎么才能实现在多租户的情况下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 机制实现租户信息跨线程传递

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐