去除 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