You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by me...@apache.org on 2019/08/13 02:36:31 UTC

[dubbo] branch cloud-native updated: Refactor ConfigManager (#4804)

This is an automated email from the ASF dual-hosted git repository.

mercyblitz pushed a commit to branch cloud-native
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/cloud-native by this push:
     new ade0caf  Refactor ConfigManager (#4804)
ade0caf is described below

commit ade0caf3e2587141b842bcc278e928d8f25dc07d
Author: Mercy Ma <me...@gmail.com>
AuthorDate: Tue Aug 13 10:36:18 2019 +0800

    Refactor ConfigManager (#4804)
    
    * Polish apache/dubbo#4542 : [Enhancement] Adapt the Java standard Event/Listener mechanism
    
    * Polish apache/dubbo#4541 : [Feature] Add local File System DynamicConfigurationFactory‘s extension
    
    * Polish apache#4541 : Bugfix
    
    * Polish apache/dubbo#4541 : Optimization
    
    * Polish apache/dubbo#4541 : Add the compatibility for PollingWatchService on the some platforms
    
    * Polish apache/dubbo#4541 : Add delay publish without ThreadPoolExecutor
    
    * Polish apache/dubbo#4541 : Refactor the extension name
    
    * Polish apache/dubbo#4541 : Add remove ops
    
    * Polish apache/dubbo#4541 : Add testable constructor
    
    * Polish apache/dubbo#4541 : Add getConfigGroups method
    
    * Polish apache/dubbo#4610 : [Refactor] Refactor the bootstrap module
    
    * Polish apache/dubbo#4541 : Fix the nulling URL issue
    
    * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager
    
    * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager
    
    * Polish apache/dubbo#4622 : Support multiple configcenters
    
    * Polish apache/dubbo#4671 : ServiceNameMapping will not map the group, version and protocol
    
    * update referenceCount log (#4683)
    
    Add comments to support multiple shared connections
    
    * Polish /apache/dubbo#4687 : Remove the duplicated test code in dubbo-config-spring (#4688)
    
    * #4685  修改代码if判断false问题 if (hasException == false)修改成if (!hasException) (#4695)
    
    * Fixed Service annotation method parameters are not in effect (#4598)
    
    * keep demo simple, and switch to use zookeeper as registry center (#4705)
    
    * keep demo simple, and switch to use zookeeper as registry center
    
    * remove comment
    
    * @Reference auto-wires the instance of generic interface #4594 (#4677)
    
    * try to shorten maven output to make travis build pass (#4710)
    
    * use CountDownLatch to check zk registry if establish connection (#4589)
    
    * Minor change
    
    * Rename the extension name of WritableMetadataService
    
    * Polish apache/dubbo#4759 : [Refactor] Change the signature of methods of MetadataService #4759
    
    * Merge remote-tracking branch 'upstream/master' into dubbo-cloud-native
    
    # Conflicts:
    #	dubbo-all/pom.xml
    #	dubbo-bom/pom.xml
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
    #	dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java
    #	dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java
    #	dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
    #	dubbo-configcenter/dubbo-configcenter-etcd/src/test/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfigurationTest.java
    #	dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
    #	dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java
    #	dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
    #	dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
    #	dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java
    #	dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java
    #	dubbo-metadata/pom.xml
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
    #	dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java
    #	dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistryFactory.java
    #	dubbo-rpc/dubbo-rpc-xml/src/main/java/org/apache/dubbo/xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java
    
    * Polish apache/dubbo#3984 : Add the implementation of Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly)
    
    * Code merge
    
    * Fix the cases
    
    * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native
    
    # Conflicts:
    #	dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java
    #	dubbo-metadata/dubbo-metadata-definition-protobuf/pom.xml
    #	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
    #	dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java
    #	dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java
    
    * Refactor ConfigManager
    
    * Refactor ConfigManager
    
    * Resolve the issues on ConfigManager
    
    * Refactor and add test-cases for ConfigManager
---
 .../org/apache/dubbo/bootstrap/DubboBootstrap.java |  10 +-
 .../bootstrap/DubboServiceConsumerBootstrap.java   |   2 +-
 .../org/apache/dubbo/config/AbstractConfig.java    |   3 +-
 .../apache/dubbo/config/context/ConfigManager.java | 135 ++++++++-------
 .../dubbo/config/context/ConfigManagerTest.java    | 186 ++++++++++++++++++++-
 5 files changed, 263 insertions(+), 73 deletions(-)

diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
index 4f1daa1..9de48a6 100644
--- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
+++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
@@ -51,9 +51,7 @@ import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
 import org.apache.dubbo.config.utils.ReferenceConfigCache;
 import org.apache.dubbo.event.EventDispatcher;
 import org.apache.dubbo.event.EventListener;
-import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.metadata.report.MetadataReportInstance;
-import org.apache.dubbo.metadata.store.RemoteWritableMetadataService;
 import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
 import org.apache.dubbo.registry.client.ServiceDiscovery;
@@ -517,7 +515,7 @@ public class DubboBootstrap {
             exportServices();
 
             // Not only provider register and some services are exported
-            if (!onlyRegisterProvider && !configManager.getServiceConfigs().isEmpty()) {
+            if (!onlyRegisterProvider && !configManager.getServices().isEmpty()) {
                 /**
                  * export {@link MetadataService}
                  */
@@ -718,7 +716,7 @@ public class DubboBootstrap {
     }
 
     private void exportServices() {
-        configManager.getServiceConfigs().forEach(this::exportServiceConfig);
+        configManager.getServices().forEach(this::exportServiceConfig);
     }
 
     public void exportServiceConfig(ServiceConfig<?> serviceConfig) {
@@ -729,7 +727,7 @@ public class DubboBootstrap {
         if (cache == null) {
             cache = ReferenceConfigCache.getCache();
         }
-        configManager.getReferenceConfigs().forEach(cache::get);
+        configManager.getReferences().forEach(cache::get);
     }
 
     public boolean isOnlyRegisterProvider() {
@@ -816,7 +814,7 @@ public class DubboBootstrap {
     }
 
     private void destroyReferenceConfigs() {
-        configManager.getReferenceConfigs().forEach(ReferenceConfig::destroy);
+        configManager.getReferences().forEach(ReferenceConfig::destroy);
         if (logger.isDebugEnabled()) {
             logger.debug(NAME + "'s all ReferenceConfigs have been destroyed.");
         }
diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java
index 0f7a958..760fbdc 100644
--- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java
+++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java
@@ -41,7 +41,7 @@ public class DubboServiceConsumerBootstrap {
 
         ConfigManager configManager = ConfigManager.getInstance();
 
-        ReferenceConfig<EchoService> referenceConfig = configManager.getReferenceConfig("ref");
+        ReferenceConfig<EchoService> referenceConfig = configManager.getReference("ref");
 
         EchoService echoService = referenceConfig.get();
 
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index c1a7548..d729644 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -40,6 +40,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -638,7 +639,7 @@ public abstract class AbstractConfig implements Serializable {
                     Method method2 = obj.getClass().getMethod(method1.getName(), method1.getParameterTypes());
                     Object value1 = method1.invoke(this, new Object[]{});
                     Object value2 = method2.invoke(obj, new Object[]{});
-                    if ((value1 != null && value2 != null) && !value1.equals(value2)) {
+                    if (!Objects.equals(value1, value2)) {
                         return false;
                     }
                 } catch (Exception e) {
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
index 0e4d610..6996740 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
@@ -117,56 +117,6 @@ public class ConfigManager {
         return ofNullable(getConfig(ApplicationConfig.class));
     }
 
-    /**
-     * Add the dubbo {@link AbstractConfig config}
-     *
-     * @param config the dubbo {@link AbstractConfig config}
-     */
-    public void addConfig(AbstractConfig config) {
-        addConfig(config, false);
-    }
-
-    protected void addConfig(AbstractConfig config, boolean unique) {
-        if (config == null) {
-            return;
-        }
-        Class<? extends AbstractConfig> configType = config.getClass();
-        write(() -> {
-            Map<String, AbstractConfig> configsMap = configsCache.computeIfAbsent(configType, type -> newMap());
-            addIfAbsent(config, configsMap, unique);
-        });
-    }
-
-    protected <C extends AbstractConfig> Map<String, C> getConfigsMap(Class<? extends C> configType) {
-        return read(() -> (Map) configsCache.getOrDefault(configType, emptyMap()));
-    }
-
-    protected <C extends AbstractConfig> Collection<C> getConfigs(Class<C> configType) {
-        return read(() -> getConfigsMap(configType).values());
-    }
-
-    protected <C extends AbstractConfig> C getConfig(Class<C> configType, String id) {
-        return read(() -> {
-            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
-            return configsMap.get(id);
-        });
-    }
-
-    protected <C extends AbstractConfig> C getConfig(Class<C> configType) throws IllegalStateException {
-        return read(() -> {
-            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
-            int size = configsMap.size();
-            if (size < 1) {
-//                throw new IllegalStateException("No such " + configType.getName() + " is found");
-                return null;
-            } else if (size > 1) {
-                throw new IllegalStateException("The expected single matching " + configType.getName() + " but found " + size + " instances");
-            } else {
-                return configsMap.values().iterator().next();
-            }
-        });
-    }
-
     // MonitorConfig correlative methods
 
     public void setMonitor(MonitorConfig monitor) {
@@ -181,7 +131,6 @@ public class ConfigManager {
 
     public void setModule(ModuleConfig module) {
         addConfig(module, true);
-
     }
 
     public Optional<ModuleConfig> getModule() {
@@ -234,6 +183,10 @@ public class ConfigManager {
         addConfig(providerConfig);
     }
 
+    public void addProviders(Iterable<ProviderConfig> providerConfigs) {
+        providerConfigs.forEach(this::addProvider);
+    }
+
     public Optional<ProviderConfig> getProvider(String id) {
         return ofNullable(getConfig(ProviderConfig.class, id));
     }
@@ -252,6 +205,10 @@ public class ConfigManager {
         addConfig(consumerConfig);
     }
 
+    public void addConsumers(Iterable<ConsumerConfig> consumerConfigs) {
+        consumerConfigs.forEach(this::addConsumer);
+    }
+
     public Optional<ConsumerConfig> getConsumer(String id) {
         return ofNullable(getConfig(ConsumerConfig.class, id));
     }
@@ -341,11 +298,15 @@ public class ConfigManager {
         addConfig(serviceConfig);
     }
 
-    public Collection<ServiceConfig> getServiceConfigs() {
+    public void addServices(Iterable<ServiceConfig<?>> serviceConfigs) {
+        serviceConfigs.forEach(this::addService);
+    }
+
+    public Collection<ServiceConfig> getServices() {
         return getConfigs(ServiceConfig.class);
     }
 
-    public <T> ServiceConfig<T> getServiceConfig(String id) {
+    public <T> ServiceConfig<T> getService(String id) {
         return getConfig(ServiceConfig.class, id);
     }
 
@@ -355,11 +316,15 @@ public class ConfigManager {
         addConfig(referenceConfig);
     }
 
-    public Collection<ReferenceConfig> getReferenceConfigs() {
+    public void addReferences(Iterable<ReferenceConfig<?>> referenceConfigs) {
+        referenceConfigs.forEach(this::addReference);
+    }
+
+    public Collection<ReferenceConfig> getReferences() {
         return getConfigs(ReferenceConfig.class);
     }
 
-    public <T> ReferenceConfig<T> getReferenceConfig(String id) {
+    public <T> ReferenceConfig<T> getReference(String id) {
         return getConfig(ReferenceConfig.class, id);
     }
 
@@ -393,7 +358,57 @@ public class ConfigManager {
         });
     }
 
-    private <C extends AbstractConfig> Collection<String> getConfigIds(Class<C> configType) {
+    /**
+     * Add the dubbo {@link AbstractConfig config}
+     *
+     * @param config the dubbo {@link AbstractConfig config}
+     */
+    public void addConfig(AbstractConfig config) {
+        addConfig(config, false);
+    }
+
+    protected void addConfig(AbstractConfig config, boolean unique) {
+        if (config == null) {
+            return;
+        }
+        Class<? extends AbstractConfig> configType = config.getClass();
+        write(() -> {
+            Map<String, AbstractConfig> configsMap = configsCache.computeIfAbsent(configType, type -> newMap());
+            addIfAbsent(config, configsMap, unique);
+        });
+    }
+
+    protected <C extends AbstractConfig> Map<String, C> getConfigsMap(Class<? extends C> configType) {
+        return read(() -> (Map) configsCache.getOrDefault(configType, emptyMap()));
+    }
+
+    protected <C extends AbstractConfig> Collection<C> getConfigs(Class<C> configType) {
+        return read(() -> getConfigsMap(configType).values());
+    }
+
+    protected <C extends AbstractConfig> C getConfig(Class<C> configType, String id) {
+        return read(() -> {
+            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
+            return configsMap.get(id);
+        });
+    }
+
+    protected <C extends AbstractConfig> C getConfig(Class<C> configType) throws IllegalStateException {
+        return read(() -> {
+            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
+            int size = configsMap.size();
+            if (size < 1) {
+//                throw new IllegalStateException("No such " + configType.getName() + " is found");
+                return null;
+            } else if (size > 1) {
+                throw new IllegalStateException("The expected single matching " + configType.getName() + " but found " + size + " instances");
+            } else {
+                return configsMap.values().iterator().next();
+            }
+        });
+    }
+
+    protected <C extends AbstractConfig> Collection<String> getConfigIds(Class<C> configType) {
         return getConfigs(configType)
                 .stream()
                 .map(AbstractConfig::getId)
@@ -406,8 +421,10 @@ public class ConfigManager {
         try {
             writeLock.lock();
             value = callable.call();
+        } catch (RuntimeException e) {
+            throw e;
         } catch (Throwable e) {
-            throw new RuntimeException(e);
+            throw new RuntimeException(e.getCause());
         } finally {
             writeLock.unlock();
         }
@@ -421,12 +438,9 @@ public class ConfigManager {
         });
     }
 
-
     private <V> V read(Callable<V> callable) {
         Lock readLock = lock.readLock();
-
         V value = null;
-
         try {
             readLock.lock();
             value = callable.call();
@@ -435,7 +449,6 @@ public class ConfigManager {
         } finally {
             readLock.unlock();
         }
-
         return value;
     }
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
index 44e896d..41f5f3b 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
@@ -17,15 +17,28 @@
 package org.apache.dubbo.config.context;
 
 import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ConfigCenterConfig;
+import org.apache.dubbo.config.ConsumerConfig;
+import org.apache.dubbo.config.MetricsConfig;
 import org.apache.dubbo.config.ModuleConfig;
 import org.apache.dubbo.config.MonitorConfig;
+import org.apache.dubbo.config.ProtocolConfig;
+import org.apache.dubbo.config.ProviderConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.ServiceConfig;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.util.Collection;
+
+import static java.util.Arrays.asList;
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
 import static org.apache.dubbo.config.context.ConfigManager.getInstance;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
@@ -40,32 +53,197 @@ public class ConfigManagerTest {
     @BeforeEach
     public void init() {
         configManager.clear();
+    }
+
+    @Test
+    public void testDefaultValues() {
+        // assert single
         assertFalse(configManager.getApplication().isPresent());
         assertFalse(configManager.getMonitor().isPresent());
-        assertFalse(configManager.getMonitor().isPresent());
+        assertFalse(configManager.getModule().isPresent());
+        assertFalse(configManager.getMetrics().isPresent());
+
+        // providers and consumers
+        assertFalse(configManager.getDefaultProvider().isPresent());
+        assertFalse(configManager.getDefaultConsumer().isPresent());
+        assertTrue(configManager.getProviders().isEmpty());
+        assertTrue(configManager.getConsumers().isEmpty());
+
+        // protocols
+        assertTrue(configManager.getProtocols().isEmpty());
+        assertTrue(configManager.getDefaultProtocols().isEmpty());
+        assertTrue(configManager.getProtocolIds().isEmpty());
+
+        // registries
+        assertTrue(configManager.getRegistries().isEmpty());
+        assertTrue(configManager.getDefaultRegistries().isEmpty());
+        assertTrue(configManager.getRegistryIds().isEmpty());
+
+        // services and references
+        assertTrue(configManager.getServices().isEmpty());
+        assertTrue(configManager.getReferences().isEmpty());
+
+        // config centers
+        assertTrue(configManager.getConfigCenters().isEmpty());
+
+        // metadata
+        assertTrue(configManager.getMetadataConfigs().isEmpty());
     }
 
+    // Test ApplicationConfig correlative methods
     @Test
     public void testApplicationConfig() {
-        ApplicationConfig applicationConfig = new ApplicationConfig();
-        configManager.setApplication(applicationConfig);
+        ApplicationConfig config = new ApplicationConfig();
+        configManager.setApplication(config);
         assertTrue(configManager.getApplication().isPresent());
-        assertEquals(applicationConfig, configManager.getApplication().get());
+        assertEquals(config, configManager.getApplication().get());
+        assertThrows(IllegalStateException.class, () -> {
+            configManager.setApplication(new ApplicationConfig("test"));
+        });
     }
 
+    // Test MonitorConfig correlative methods
     @Test
     public void testMonitorConfig() {
         MonitorConfig monitorConfig = new MonitorConfig();
+        monitorConfig.setGroup("test");
         configManager.setMonitor(monitorConfig);
         assertTrue(configManager.getMonitor().isPresent());
         assertEquals(monitorConfig, configManager.getMonitor().get());
+        assertThrows(IllegalStateException.class, () -> {
+            configManager.setMonitor(new MonitorConfig());
+        });
     }
 
+    // Test MonitorConfig correlative methods
     @Test
     public void tesModuleConfig() {
         ModuleConfig config = new ModuleConfig();
         configManager.setModule(config);
         assertTrue(configManager.getModule().isPresent());
         assertEquals(config, configManager.getModule().get());
+        assertThrows(IllegalStateException.class, () -> {
+            configManager.setModule(new ModuleConfig("test"));
+        });
+    }
+
+    // Test MetricsConfig correlative methods
+    @Test
+    public void tesMetricsConfig() {
+        MetricsConfig config = new MetricsConfig();
+        configManager.setMetrics(config);
+        assertTrue(configManager.getMetrics().isPresent());
+        assertEquals(config, configManager.getMetrics().get());
+        assertThrows(IllegalStateException.class, () -> {
+            MetricsConfig metricsConfig = new MetricsConfig();
+            metricsConfig.setPort("101");
+            configManager.setMetrics(metricsConfig);
+        });
+    }
+
+    // Test ProviderConfig correlative methods
+    @Test
+    public void testProviderConfig() {
+        ProviderConfig config = new ProviderConfig();
+        configManager.addProviders(asList(config, null));
+        Collection<ProviderConfig> configs = configManager.getProviders();
+        assertEquals(1, configs.size());
+        assertEquals(config, configs.iterator().next());
+        assertFalse(configManager.getDefaultProvider().isPresent());
+
+        config.setId(DEFAULT_KEY);
+        configManager.addProvider(config);
+        assertTrue(configManager.getDefaultProvider().isPresent());
+        configs = configManager.getProviders();
+        assertEquals(2, configs.size());
+    }
+
+    // Test ConsumerConfig correlative methods
+    @Test
+    public void testConsumerConfig() {
+        ConsumerConfig config = new ConsumerConfig();
+        configManager.addConsumers(asList(config, null));
+        Collection<ConsumerConfig> configs = configManager.getConsumers();
+        assertEquals(1, configs.size());
+        assertEquals(config, configs.iterator().next());
+        assertFalse(configManager.getDefaultConsumer().isPresent());
+
+        config.setId(DEFAULT_KEY);
+        configManager.addConsumer(config);
+        assertTrue(configManager.getDefaultConsumer().isPresent());
+        configs = configManager.getConsumers();
+        assertEquals(2, configs.size());
+    }
+
+    // Test ProtocolConfig correlative methods
+    @Test
+    public void testProtocolConfig() {
+        ProtocolConfig config = new ProtocolConfig();
+        configManager.addProtocols(asList(config, null));
+        Collection<ProtocolConfig> configs = configManager.getProtocols();
+        assertEquals(1, configs.size());
+        assertEquals(config, configs.iterator().next());
+        assertFalse(configManager.getDefaultProtocols().isEmpty());
+    }
+
+    // Test RegistryConfig correlative methods
+    @Test
+    public void testRegistryConfig() {
+        RegistryConfig config = new RegistryConfig();
+        configManager.addRegistries(asList(config, null));
+        Collection<RegistryConfig> configs = configManager.getRegistries();
+        assertEquals(1, configs.size());
+        assertEquals(config, configs.iterator().next());
+        assertFalse(configManager.getDefaultRegistries().isEmpty());
+    }
+
+    // Test ServiceConfig correlative methods
+    @Test
+    public void testServiceConfig() {
+        ServiceConfig config = new ServiceConfig();
+        config.setId("test");
+        configManager.addServices(asList(config, null));
+        Collection<ServiceConfig> configs = configManager.getServices();
+        assertEquals(1, configs.size());
+        assertEquals(config, configs.iterator().next());
+        assertEquals(config, configManager.getService("test"));
+    }
+
+    // Test ReferenceConfig correlative methods
+    @Test
+    public void testReferenceConfig() {
+        ReferenceConfig config = new ReferenceConfig();
+        config.setId("test");
+        configManager.addReferences(asList(config, null));
+        Collection<ReferenceConfig> configs = configManager.getReferences();
+        assertEquals(1, configs.size());
+        assertEquals(config, configs.iterator().next());
+        assertEquals(config, configManager.getReference("test"));
+    }
+
+    // Test ConfigCenterConfig correlative methods
+    @Test
+    public void testConfigCenterConfig() {
+        ConfigCenterConfig config = new ConfigCenterConfig();
+        configManager.addConfigCenters(asList(config, null));
+        Collection<ConfigCenterConfig> configs = configManager.getConfigCenters();
+        assertEquals(1, configs.size());
+        assertEquals(config, configs.iterator().next());
+    }
+
+    @Test
+    public void testAddConfig() {
+        configManager.addConfig(new ApplicationConfig());
+        configManager.addConfig(new ProviderConfig());
+        configManager.addConfig(new ProtocolConfig());
+
+        assertTrue(configManager.getApplication().isPresent());
+        assertFalse(configManager.getProviders().isEmpty());
+        assertFalse(configManager.getProtocols().isEmpty());
+    }
+
+    @Test
+    public void testRefreshAll() {
+        configManager.refreshAll();
     }
 }