diff --git a/cash-api/account-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory b/cash-api/account-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory new file mode 100644 index 000000000..ef8ba4d80 --- /dev/null +++ b/cash-api/account-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory @@ -0,0 +1 @@ +nacos=com.czg.config.FilteredNacosRegistryFactory \ No newline at end of file diff --git a/cash-api/market-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory b/cash-api/market-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory new file mode 100644 index 000000000..ef8ba4d80 --- /dev/null +++ b/cash-api/market-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory @@ -0,0 +1 @@ +nacos=com.czg.config.FilteredNacosRegistryFactory \ No newline at end of file diff --git a/cash-api/order-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory b/cash-api/order-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory new file mode 100644 index 000000000..ef8ba4d80 --- /dev/null +++ b/cash-api/order-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory @@ -0,0 +1 @@ +nacos=com.czg.config.FilteredNacosRegistryFactory \ No newline at end of file diff --git a/cash-api/product-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory b/cash-api/product-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory new file mode 100644 index 000000000..ef8ba4d80 --- /dev/null +++ b/cash-api/product-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory @@ -0,0 +1 @@ +nacos=com.czg.config.FilteredNacosRegistryFactory \ No newline at end of file diff --git a/cash-api/system-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory b/cash-api/system-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory new file mode 100644 index 000000000..ef8ba4d80 --- /dev/null +++ b/cash-api/system-server/src/main/resources/META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory @@ -0,0 +1 @@ +nacos=com.czg.config.FilteredNacosRegistryFactory \ No newline at end of file diff --git a/cash-common/cash-common-api-config/src/main/java/com/czg/config/FilteredNacosRegistry.java b/cash-common/cash-common-api-config/src/main/java/com/czg/config/FilteredNacosRegistry.java new file mode 100644 index 000000000..36bf22479 --- /dev/null +++ b/cash-common/cash-common-api-config/src/main/java/com/czg/config/FilteredNacosRegistry.java @@ -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 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 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); + } +} diff --git a/cash-common/cash-common-api-config/src/main/java/com/czg/config/FilteredNacosRegistryFactory.java b/cash-common/cash-common-api-config/src/main/java/com/czg/config/FilteredNacosRegistryFactory.java new file mode 100644 index 000000000..36ce31bdb --- /dev/null +++ b/cash-common/cash-common-api-config/src/main/java/com/czg/config/FilteredNacosRegistryFactory.java @@ -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); + } + } + } +} \ No newline at end of file