本文主要是介绍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 {
@Override
public 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", "");
@Override
public 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.ConsumerFilter
providerFilter=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.0
filter: providerFilter
consumer:
check: false
filter: consumerFilter
version: 1.0
启动程序
这是会自动装配两个对应Filter,在provider端可以从TenantContextHolder 中获取租户编号
这篇关于Dubbo 基于Filter实现多租户编号参数隐式传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!