去除 dubbo 不必要的注入
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
nacos=com.czg.config.FilteredNacosRegistryFactory
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
nacos=com.czg.config.FilteredNacosRegistryFactory
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
nacos=com.czg.config.FilteredNacosRegistryFactory
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
nacos=com.czg.config.FilteredNacosRegistryFactory
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
nacos=com.czg.config.FilteredNacosRegistryFactory
|
||||||
@@ -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 NacosNamingServiceWrapper(Dubbo 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user