From a08aabf69a08e70cdd241c178b5426621e1d60a7 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Fri, 14 May 2021 12:50:07 +0800 Subject: [PATCH] Support caching of dynamic property (#7760) --- .../org/apache/dubbo/common/config/ConfigurationUtils.java | 7 +++++++ .../org/apache/dubbo/config/context/ConfigManagerTest.java | 4 ++-- .../apache/dubbo/config/utils/ConfigValidationUtils.java | 5 ++--- .../apache/dubbo/config/AbstractInterfaceConfigTest.java | 2 +- .../bootstrap/builders/AbstractInterfaceBuilderTest.java | 2 +- .../migration/DefaultMigrationAddressComparator.java | 2 +- .../registry/client/migration/MigrationRuleHandler.java | 2 +- 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java index ed79f15d98..3a17e594d6 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java @@ -26,6 +26,7 @@ import java.io.StringReader; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT; import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY; @@ -36,6 +37,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SE */ public class ConfigurationUtils { private static final Logger logger = LoggerFactory.getLogger(ConfigurationUtils.class); + private static Map CACHED_DYNAMIC_PROPERTIES = new ConcurrentHashMap<>(); /** * Used to get properties from the jvm @@ -96,6 +98,11 @@ public class ConfigurationUtils { return timeout; } + public static String getCachedDynamicProperty(String key, String defaultValue) { + String value = CACHED_DYNAMIC_PROPERTIES.computeIfAbsent(key, _k -> ConfigurationUtils.getDynamicProperty(key, "")); + return StringUtils.isEmpty(value) ? defaultValue : value; + } + public static String getDynamicProperty(String property) { return getDynamicProperty(property, null); } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java index 24c4f0028c..a1ef93c146 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java @@ -95,7 +95,7 @@ public class ConfigManagerTest { // Test ApplicationConfig correlative methods @Test public void testApplicationConfig() { - ApplicationConfig config = new ApplicationConfig(); + ApplicationConfig config = new ApplicationConfig("ConfigManagerTest"); configManager.setApplication(config); assertTrue(configManager.getApplication().isPresent()); assertEquals(config, configManager.getApplication().get()); @@ -197,7 +197,7 @@ public class ConfigManagerTest { @Test public void testAddConfig() { - configManager.addConfig(new ApplicationConfig()); + configManager.addConfig(new ApplicationConfig("ConfigManagerTest")); configManager.addConfig(new ProviderConfig()); configManager.addConfig(new ProtocolConfig()); diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java index 2f68774ca2..b7706aedeb 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java @@ -173,7 +173,6 @@ public class ConfigValidationUtils { */ private static final Pattern PATTERN_KEY = Pattern.compile("[*,\\-._0-9a-zA-Z]+"); - public static List loadRegistries(AbstractInterfaceConfig interfaceConfig, boolean provider) { // check && override if necessary List registryList = new ArrayList(); @@ -220,7 +219,7 @@ public class ConfigValidationUtils { // for registries enabled service discovery, automatically register interface compatible addresses. String registerMode; if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())) { - registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getString(DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INSTANCE)); + registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getCachedDynamicProperty(DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INSTANCE)); if (!isValidRegisterMode(registerMode)) { registerMode = DEFAULT_REGISTER_MODE_INSTANCE; } @@ -234,7 +233,7 @@ public class ConfigValidationUtils { result.add(interfaceCompatibleRegistryURL); } } else { - registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getString(DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INTERFACE)); + registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getCachedDynamicProperty(DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INTERFACE)); if (!isValidRegisterMode(registerMode)) { registerMode = DEFAULT_REGISTER_MODE_INTERFACE; } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java index 3a4a83c462..214e665b2e 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java @@ -276,7 +276,7 @@ public class AbstractInterfaceConfigTest { @Test public void testApplication() { InterfaceConfig interfaceConfig = new InterfaceConfig(); - ApplicationConfig applicationConfig = new ApplicationConfig(); + ApplicationConfig applicationConfig = new ApplicationConfig("AbstractInterfaceConfigTest"); interfaceConfig.setApplication(applicationConfig); Assertions.assertSame(applicationConfig, interfaceConfig.getApplication()); } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java index 2e9857ab31..e0ab4c6dbb 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java @@ -143,7 +143,7 @@ class AbstractInterfaceBuilderTest { @Test void application() { - ApplicationConfig applicationConfig = new ApplicationConfig(); + ApplicationConfig applicationConfig = new ApplicationConfig("AbtractInterfaceBuilderTest"); InterfaceBuilder builder = new InterfaceBuilder(); builder.application(applicationConfig); diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java index 97002146d5..a37d55b165 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java @@ -72,7 +72,7 @@ public class DefaultMigrationAddressComparator implements MigrationAddressCompar if (configedThreshold != null && configedThreshold >= 0) { rawThreshold = String.valueOf(configedThreshold); } - rawThreshold = StringUtils.isNotEmpty(rawThreshold) ? rawThreshold : ConfigurationUtils.getDynamicProperty(MIGRATION_THRESHOLD, DEFAULT_THRESHOLD_STRING); + rawThreshold = StringUtils.isNotEmpty(rawThreshold) ? rawThreshold : ConfigurationUtils.getCachedDynamicProperty(MIGRATION_THRESHOLD, DEFAULT_THRESHOLD_STRING); float threshold; try { threshold = Float.parseFloat(rawThreshold); diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java index b9718f44b2..be2e29e26c 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java @@ -59,7 +59,7 @@ public class MigrationRuleHandler { MigrationStep step = MigrationStep.INTERFACE_FIRST; Float threshold = -1f; if (rule == MigrationRule.INIT) { - step = Enum.valueOf(MigrationStep.class, ConfigurationUtils.getDynamicProperty(DUBBO_SERVICEDISCOVERY_MIGRATION, step.name())); + step = Enum.valueOf(MigrationStep.class, ConfigurationUtils.getCachedDynamicProperty(DUBBO_SERVICEDISCOVERY_MIGRATION, step.name())); } else { try { String serviceKey = consumerURL.getDisplayServiceKey();