private void watcherPlugin(final List<String> pluginNames, final String namespaceId) {
        if (ObjectUtils.isEmpty(pluginNames)) {
            return;
        }
        pluginNames.forEach(pluginName -> {
            final String pluginData = this.getConfigOnWatch(namespaceId + DefaultNodeConstants.JOIN_POINT
                    + changeData.getPluginDataId() + DefaultNodeConstants.JOIN_POINT + pluginName, this::cachePluginData, this::unCachePluginData);
            cachePluginData(pluginData);
            final String pluginPath = namespaceId + DefaultNodeConstants.JOIN_POINT + changeData.getSelectorDataId() + DefaultNodeConstants.JOIN_POINT + pluginName + DefaultNodeConstants.POINT_LIST;
            final List<String> selectorIds = getConfigListOnWatch(pluginPath, updateData -> {
                List<String> changedSelectorIds = GsonUtils.getInstance().fromList(updateData, String.class);
                watcherSelector(pluginName, changedSelectorIds, namespaceId);
            });

            watcherSelector(pluginName, selectorIds, namespaceId);

            watchCommonList(namespaceId + DefaultNodeConstants.JOIN_POINT + NacosPathConstants.PROXY_SELECTOR_DATA_ID + DefaultNodeConstants.JOIN_POINT + pluginName + DefaultNodeConstants.JOIN_POINT,
                    this::cacheProxySelectorData, this::unCacheProxySelectorData);
            watchCommonList(namespaceId + DefaultNodeConstants.JOIN_POINT + NacosPathConstants.DISCOVERY_DATA_ID + DefaultNodeConstants.JOIN_POINT + pluginName + DefaultNodeConstants.JOIN_POINT,
                    this::cacheDiscoveryUpstreamData, this::unCacheDiscoveryUpstreamData);
        });
    }
AbstractNodeDataSyncService.
Abstract method to monitor child node changes.
shenyu-sync-data-center/shenyu-sync-data-api/src/main/java/org/apache/shenyu/sync/data/core/AbstractNodeDataSyncService.java