去除 dubbo 不必要的注入

This commit is contained in:
gong
2025-12-19 18:08:51 +08:00
parent 7dc620a3d9
commit 735c7b3bbe
7 changed files with 131 additions and 0 deletions

View File

@@ -0,0 +1 @@
nacos=com.czg.config.FilteredNacosRegistryFactory

View File

@@ -0,0 +1 @@
nacos=com.czg.config.FilteredNacosRegistryFactory

View File

@@ -0,0 +1 @@
nacos=com.czg.config.FilteredNacosRegistryFactory

View File

@@ -0,0 +1 @@
nacos=com.czg.config.FilteredNacosRegistryFactory

View File

@@ -0,0 +1 @@
nacos=com.czg.config.FilteredNacosRegistryFactory

View File

@@ -0,0 +1,81 @@
package com.czg.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.registry.nacos.NacosNamingServiceWrapper;
import org.apache.dubbo.registry.nacos.NacosRegistry;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author yjjie
* @date 2025/12/19 16:44
*/
@Slf4j
public class FilteredNacosRegistry extends NacosRegistry {
// 定义需要过滤的方法名黑名单(可根据业务调整)
private static final List<String> FILTER_METHODS = Arrays.asList(
"updateBatch",
"saveOrUpdateBatch",
"getOneByEntityId",
"getByEntityIdOpt",
"saveBatch",
"removeByMap",
"getByIdOpt",
"getOneOpt",
"getObjOpt",
"getObjAs",
"getObjAsOpt",
"objList",
"objListAs",
"listByMap",
"queryChain",
"updateChain",
"getObj"
);
/**
* 适配 Dubbo 3.3 版本的构造函数
*
* @param url Dubbo 注册中心URL
* @param namingService NacosNamingServiceWrapperDubbo 3.3 特有包装类)
*/
public FilteredNacosRegistry(URL url, NacosNamingServiceWrapper namingService) {
// 调用父类2参数构造URL + NacosNamingServiceWrapper
super(url, namingService);
}
@Override
public void register(URL url) {
// 1. 获取原始注册的方法列表
String originalMethods = url.getParameter("methods");
log.info("【过滤提示】服务 {} 注册方法:{}", url.getServiceInterface(), originalMethods);
if (originalMethods != null && !originalMethods.isEmpty()) {
// 2. 过滤黑名单中的方法名
List<String> filteredMethods = Arrays.stream(originalMethods.split(","))
// 去除首尾空格
.map(String::trim)
// 过滤指定方法
.filter(method -> !FILTER_METHODS.contains(method))
.collect(Collectors.toList());
// 3. 处理过滤后的结果
if (filteredMethods.isEmpty()) {
// 若所有方法都被过滤,直接终止注册(可选:根据业务决定是否保留服务注册)
log.info("【过滤提示】服务 {} 所有方法均被过滤,终止注册", url.getServiceInterface());
return;
} else {
// 替换 URL 中的 methods 参数为过滤后的列表
url = url.addParameter("methods", String.join(",", filteredMethods));
log.info("【过滤提示】服务 {} 注册方法:{}", url.getServiceInterface(), filteredMethods);
}
}
// 执行父类的注册逻辑将过滤后的URL注册到Nacos
super.register(url);
}
}

View File

@@ -0,0 +1,45 @@
package com.czg.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.registry.Registry;
import org.apache.dubbo.registry.nacos.NacosNamingServiceWrapper;
import org.apache.dubbo.registry.nacos.NacosRegistry;
import org.apache.dubbo.registry.nacos.NacosRegistryFactory;
import java.lang.reflect.Field;
/**
* @author yjjie
* @date 2025/12/19 17:31
*/
public class FilteredNacosRegistryFactory extends NacosRegistryFactory {
@Override
public Registry createRegistry(URL url) {
// 1. 先创建 Dubbo 原生的 NacosRegistry 实例
NacosRegistry originalNacosRegistry = (NacosRegistry) super.createRegistry(url);
try {
// 2. 反射提取 NacosRegistry 中的 NacosNamingServiceWrapper 实例Dubbo 3.3 私有字段名namingService
Field namingServiceField = NacosRegistry.class.getDeclaredField("namingService");
// 突破私有访问限制
namingServiceField.setAccessible(true);
NacosNamingServiceWrapper namingServiceWrapper = (NacosNamingServiceWrapper) namingServiceField.get(originalNacosRegistry);
// 3. 创建自定义的 FilteredNacosRegistry传入URL + 提取的 namingServiceWrapper
return new FilteredNacosRegistry(url, namingServiceWrapper);
} catch (NoSuchFieldException | IllegalAccessException e) {
// 兼容字段名差异(若字段名不是 namingService尝试其他可能nacosNamingService
try {
Field fallbackField = NacosRegistry.class.getDeclaredField("nacosNamingService");
fallbackField.setAccessible(true);
NacosNamingServiceWrapper namingServiceWrapper = (NacosNamingServiceWrapper) fallbackField.get(originalNacosRegistry);
return new FilteredNacosRegistry(url, namingServiceWrapper);
} catch (Exception ex) {
throw new RuntimeException("获取 NacosNamingServiceWrapper 失败", ex);
}
}
}
}