本文主要是介绍Dubbo 基于Filter实现多租户编号参数隐式传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
隐式参数通常指的是那些不直接作为 RPC 方法参数传递,但需要在 RPC 调用过程中共享或传递的信息。这些信息可能包括用户身份、请求标识、认证令牌等。
定义一个ThreadLocal
public class TenantContextHolder {/*** 当前租户编号*/private static final ThreadLocal<Long> TENANT_ID =new TransmittableThreadLocal<>();/*** 获得租户编号** @return 租户编号*/public static Long getTenantId() {return TENANT_ID.get();}public static void setTenantId(Long tenantId) {TENANT_ID.set(tenantId);}public static void clear() {TENANT_ID.remove();}}
定义一个ConsumerFilter 实现org.apache.dubbo.rpc.Filter
@Activate(group = CommonConstants.CONSUMER)public class ConsumerFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {RpcContext.getClientAttachment().setObjectAttachment("tenantId", TenantContextHolder.getTenantId());return invoker.invoke(invocation);}}
定义一个ProviderFilter实现org.apache.dubbo.rpc.Filter
@Activate(group = CommonConstants.PROVIDER)public class ProviderFilter implements Filter {/*** 过滤dubbo内部的方法*/private static final List<String> SYSTEM_METHODS = Arrays.asList("getMetadataInfo", "");@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String methodName = invocation.getMethodName();if (!SYSTEM_METHODS.contains(methodName)) {Object tenantId = RpcContext.getServerAttachment().getObjectAttachment("tenantId");TenantContextHolder.setTenantId(Long.valueOf(tenantId.toString()));}return invoker.invoke(invocation);}}
在resources\META-INF\dubbo\目录下创建org.apache.dubbo.rpc.Filter
consumerFilter=com.wdd.framework.dubbo.filter.ConsumerFilterproviderFilter=com.wdd.framework.dubbo.filter.ProviderFilter
在pom文件中增加
<build><sourceDirectory>src/main/java</sourceDirectory><outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory><resources><resource><directory>src/main/resources/base</directory></resource><!-- 关键配置 --><resource><directory>src/main/resources/META-INF</directory><targetPath>META-INF</targetPath></resource></resources></build>
在配置文件中指定对应的filter
dubbo:provider:version: 1.0filter: providerFilterconsumer:check: falsefilter: consumerFilterversion: 1.0
启动程序
这是会自动装配两个对应Filter,在provider端可以从TenantContextHolder 中获取租户编号
这篇关于Dubbo 基于Filter实现多租户编号参数隐式传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!