You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/02/03 05:56:50 UTC

[incubator-servicecomb-java-chassis] 01/03: SCB-315 Config Center module can't get config by DynamicPropertyFactory.getInstance().getStringProperty, so has to use ConcurrentCompositeConfiguration

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

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 65216b0e2d47322f1797e5cf3b371266cf71e75b
Author: jeho0815 <je...@email.com>
AuthorDate: Fri Feb 2 18:31:00 2018 +0800

    SCB-315 Config Center module can't get config by DynamicPropertyFactory.getInstance().getStringProperty, so has to use ConcurrentCompositeConfiguration
---
 .../config/client/ConfigCenterClient.java          | 19 +++--
 .../foundation/vertx/AddressResolverConfig.java    | 92 +++++++++++++++++-----
 .../vertx/TestAddressResolverConfig.java           | 37 ++++++++-
 3 files changed, 123 insertions(+), 25 deletions(-)

diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java
index 306cf7f..0ca5668 100644
--- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java
+++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java
@@ -147,7 +147,9 @@ public class ConfigCenterClient {
           }
         });
         SignRequest signReq = createSignRequest(request.method().toString(),
-            configCenter + URIConst.MEMBERS, new HashMap<>(), null);
+            configCenter + URIConst.MEMBERS,
+            new HashMap<>(),
+            null);
         if (ConfigCenterConfig.INSTANCE.getToken() != null) {
           request.headers().add("X-Auth-Token", ConfigCenterConfig.INSTANCE.getToken());
         }
@@ -159,7 +161,8 @@ public class ConfigCenterClient {
 
   private void deployConfigClient() throws InterruptedException {
     VertxOptions vertxOptions = new VertxOptions();
-    vertxOptions.setAddressResolverOptions(AddressResolverConfig.getAddressResover(SSL_KEY));
+    vertxOptions.setAddressResolverOptions(AddressResolverConfig.getAddressResover(SSL_KEY,
+        ConfigCenterConfig.INSTANCE.getConcurrentCompositeConfiguration()));
     Vertx vertx = VertxUtils.getOrCreateVertxByName("config-center", vertxOptions);
 
     HttpClientOptions httpClientOptions = createHttpClientOptions();
@@ -245,7 +248,9 @@ public class ConfigCenterClient {
         authHeaderProviders.forEach(provider -> authHeaders.putAll(provider.getSignAuthHeaders(
             createSignRequest(null, configCenter + url, headers, null))));
 
-        client.websocket(refreshPort, ipPort.getHostOrIp(), url,
+        client.websocket(refreshPort,
+            ipPort.getHostOrIp(),
+            url,
             new CaseInsensitiveHeaders().addAll(headers)
                 .addAll(authHeaders),
             ws -> {
@@ -284,7 +289,9 @@ public class ConfigCenterClient {
 
     private void startHeartBeatThread(WebSocket ws) {
       heartbeatTask = Executors.newScheduledThreadPool(1);
-      heartbeatTask.scheduleWithFixedDelay(() -> sendHeartbeat(ws), HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL,
+      heartbeatTask.scheduleWithFixedDelay(() -> sendHeartbeat(ws),
+          HEARTBEAT_INTERVAL,
+          HEARTBEAT_INTERVAL,
           TimeUnit.MILLISECONDS);
     }
 
@@ -338,7 +345,9 @@ public class ConfigCenterClient {
         request.headers().addAll(headers);
         authHeaderProviders.forEach(provider -> request.headers()
             .addAll(provider.getSignAuthHeaders(createSignRequest(request.method().toString(),
-                configcenter + path, headers, null))));
+                configcenter + path,
+                headers,
+                null))));
         request.exceptionHandler(e -> {
           LOGGER.error("config refresh fail {}", e.getMessage());
         });
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/AddressResolverConfig.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/AddressResolverConfig.java
index 698178d..08412f1 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/AddressResolverConfig.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/AddressResolverConfig.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.foundation.vertx;
 import java.util.Arrays;
 import java.util.List;
 
+import com.netflix.config.ConcurrentCompositeConfiguration;
 import com.netflix.config.DynamicPropertyFactory;
 
 import io.vertx.core.dns.AddressResolverOptions;
@@ -32,58 +33,89 @@ public class AddressResolverConfig {
    * @return AddressResolverOptions
    */
   public static AddressResolverOptions getAddressResover(String tag) {
+    return getAddressResover(tag, null);
+  }
+
+  /**
+   * get the target endpoints with custom address resolve config
+   * @param tag config tag, such as sc.consumer or cc.consumer
+   * @param configSource get config from special config source
+   * @return AddressResolverOptions
+   */
+  public static AddressResolverOptions getAddressResover(String tag, ConcurrentCompositeConfiguration configSource) {
     AddressResolverOptions addressResolverOptions = new AddressResolverOptions();
     addressResolverOptions
-        .setServers(getStringListProperty(AddressResolverOptions.DEFAULT_SEACH_DOMAINS,
+        .setServers(getStringListProperty(configSource,
+            AddressResolverOptions.DEFAULT_SEACH_DOMAINS,
             "addressResolver." + tag + ".servers",
             "addressResolver.servers"));
     addressResolverOptions
-        .setOptResourceEnabled(getBooleanProperty(AddressResolverOptions.DEFAULT_OPT_RESOURCE_ENABLED,
+        .setOptResourceEnabled(getBooleanProperty(configSource,
+            AddressResolverOptions.DEFAULT_OPT_RESOURCE_ENABLED,
             "addressResolver." + tag + ".optResourceEnabled",
             "addressResolver.optResourceEnabled"));
     addressResolverOptions
-        .setCacheMinTimeToLive(getIntProperty(AddressResolverOptions.DEFAULT_CACHE_MIN_TIME_TO_LIVE,
+        .setCacheMinTimeToLive(getIntProperty(configSource,
+            AddressResolverOptions.DEFAULT_CACHE_MIN_TIME_TO_LIVE,
             "addressResolver." + tag + ".cacheMinTimeToLive",
             "addressResolver.cacheMinTimeToLive"));
     addressResolverOptions
-        .setCacheMaxTimeToLive(getIntProperty(AddressResolverOptions.DEFAULT_CACHE_MAX_TIME_TO_LIVE,
+        .setCacheMaxTimeToLive(getIntProperty(configSource,
+            AddressResolverOptions.DEFAULT_CACHE_MAX_TIME_TO_LIVE,
             "addressResolver." + tag + ".cacheMaxTimeToLive",
             "addressResolver.cacheMaxTimeToLive"));
     addressResolverOptions
-        .setCacheNegativeTimeToLive(getIntProperty(AddressResolverOptions.DEFAULT_CACHE_NEGATIVE_TIME_TO_LIVE,
+        .setCacheNegativeTimeToLive(getIntProperty(configSource,
+            AddressResolverOptions.DEFAULT_CACHE_NEGATIVE_TIME_TO_LIVE,
             "addressResolver." + tag + ".cacheNegativeTimeToLive",
             "addressResolver.cacheNegativeTimeToLive"));
     addressResolverOptions
-        .setQueryTimeout(getIntProperty(AddressResolverOptions.DEFAULT_QUERY_TIMEOUT,
+        .setQueryTimeout(getIntProperty(configSource,
+            AddressResolverOptions.DEFAULT_QUERY_TIMEOUT,
             "addressResolver." + tag + ".queryTimeout",
             "addressResolver.queryTimeout"));
     addressResolverOptions
-        .setMaxQueries(getIntProperty(AddressResolverOptions.DEFAULT_MAX_QUERIES,
+        .setMaxQueries(getIntProperty(configSource,
+            AddressResolverOptions.DEFAULT_MAX_QUERIES,
             "addressResolver." + tag + ".maxQueries",
             "addressResolver.maxQueries"));
     addressResolverOptions
-        .setRdFlag(getBooleanProperty(AddressResolverOptions.DEFAULT_RD_FLAG,
+        .setRdFlag(getBooleanProperty(configSource,
+            AddressResolverOptions.DEFAULT_RD_FLAG,
             "addressResolver." + tag + ".rdFlag",
             "addressResolver.rdFlag"));
     addressResolverOptions
-        .setSearchDomains(getStringListProperty(AddressResolverOptions.DEFAULT_SEACH_DOMAINS,
+        .setSearchDomains(getStringListProperty(configSource,
+            AddressResolverOptions.DEFAULT_SEACH_DOMAINS,
             "addressResolver." + tag + ".searchDomains",
             "addressResolver.searchDomains"));
     addressResolverOptions
-        .setNdots(getIntProperty(AddressResolverOptions.DEFAULT_CACHE_MIN_TIME_TO_LIVE,
+        .setNdots(getIntProperty(configSource,
+            AddressResolverOptions.DEFAULT_CACHE_MIN_TIME_TO_LIVE,
             "addressResolver." + tag + ".ndots",
             "addressResolver.ndots"));
     addressResolverOptions
-        .setRotateServers(getBooleanProperty(AddressResolverOptions.DEFAULT_ROTATE_SERVERS,
+        .setRotateServers(getBooleanProperty(configSource,
+            AddressResolverOptions.DEFAULT_ROTATE_SERVERS,
             "addressResolver." + tag + ".rotateServers",
             "addressResolver.rotateServers"));
     return addressResolverOptions;
   }
 
-  private static List<String> getStringListProperty(List<String> defaultValue, String... keys) {
+  private static List<String> getStringListProperty(ConcurrentCompositeConfiguration configSource,
+      List<String> defaultValue, String... keys) {
     String property = null;
     for (String key : keys) {
-      property = DynamicPropertyFactory.getInstance().getStringProperty(key, null).get();
+      if (configSource != null) {
+        Object v = configSource.getProperty(key);
+        if (List.class.isInstance(v)) {
+          property = listToString(((List<?>) v).toArray());
+        } else {
+          property = (String) configSource.getProperty(key);
+        }
+      } else {
+        property = DynamicPropertyFactory.getInstance().getStringProperty(key, null).get();
+      }
       if (property != null) {
         break;
       }
@@ -95,14 +127,18 @@ public class AddressResolverConfig {
     }
   }
 
-  private static int getIntProperty(int defaultValue, String... keys) {
+  private static int getIntProperty(ConcurrentCompositeConfiguration configSource, int defaultValue, String... keys) {
     int property = -1;
     for (String key : keys) {
-      property = DynamicPropertyFactory.getInstance().getIntProperty(key, -1).get();
-      if (property > 0) {
-        break;
+      if (configSource != null) {
+        if (configSource.getProperty(key) != null) {
+          return configSource.getInt(key);
+        }
+      } else {
+        property = DynamicPropertyFactory.getInstance().getIntProperty(key, -1).get();
       }
     }
+
     if (property > 0) {
       return property;
     } else {
@@ -110,18 +146,36 @@ public class AddressResolverConfig {
     }
   }
 
-  private static boolean getBooleanProperty(boolean defaultValue, String... keys) {
+  private static boolean getBooleanProperty(ConcurrentCompositeConfiguration configSource, boolean defaultValue,
+      String... keys) {
     String property = null;
     for (String key : keys) {
-      property = DynamicPropertyFactory.getInstance().getStringProperty(key, null).get();
+      if (configSource != null) {
+        if (configSource.getProperty(key) != null) {
+          return configSource.getBoolean(key);
+        }
+      } else {
+        property = DynamicPropertyFactory.getInstance().getStringProperty(key, null).get();
+      }
       if (property != null) {
         break;
       }
     }
+
     if (property != null) {
       return Boolean.parseBoolean(property);
     } else {
       return defaultValue;
     }
   }
+
+  private static String listToString(Object[] lists) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(lists[0]);
+    for (int i = 1; i < lists.length; i++) {
+      sb.append(",");
+      sb.append(lists[i]);
+    }
+    return sb.toString();
+  }
 }
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestAddressResolverConfig.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestAddressResolverConfig.java
index 0163f60..91a680b 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestAddressResolverConfig.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestAddressResolverConfig.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.foundation.vertx;
 
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.is;
 
 import java.util.Arrays;
 
@@ -27,7 +27,11 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import com.netflix.config.ConcurrentCompositeConfiguration;
+
 import io.vertx.core.dns.AddressResolverOptions;
+import mockit.Expectations;
+import mockit.Mocked;
 
 public class TestAddressResolverConfig {
 
@@ -41,6 +45,37 @@ public class TestAddressResolverConfig {
     ArchaiusUtils.resetConfig();
   }
 
+  @Test
+  public void testGetResoverFromResource(@Mocked ConcurrentCompositeConfiguration finalConfig) {
+    ArchaiusUtils.resetConfig();
+    ArchaiusUtils.setProperty("addressResolver.servers", "8.8.8.8,8.8.4.4");
+    ArchaiusUtils.setProperty("addressResolver.optResourceEnabled", true);
+    ArchaiusUtils.setProperty("addressResolver.cacheMinTimeToLive", 0);
+    ArchaiusUtils.setProperty("addressResolver.cacheMaxTimeToLive", 10000);
+    ArchaiusUtils.setProperty("addressResolver.cacheNegativeTimeToLive", 0);
+    ArchaiusUtils.setProperty("addressResolver.queryTimeout", 1000);
+    ArchaiusUtils.setProperty("addressResolver.maxQueries", 3);
+    ArchaiusUtils.setProperty("addressResolver.test.maxQueries", 3);
+    ArchaiusUtils.setProperty("addressResolver.rdFlag", true);
+    ArchaiusUtils.setProperty("addressResolver.searchDomains",
+        "default.svc.local.cluster,svc.local.cluster,local.cluster");
+    ArchaiusUtils.setProperty("addressResolver.test.searchDomains",
+        "test.svc.local.cluster,svc.local.cluster,local.cluster");
+    ArchaiusUtils.setProperty("addressResolver.ndots", 3);
+    ArchaiusUtils.setProperty("addressResolver.rotateServers", true);
+    new Expectations() {
+      {
+        finalConfig.getProperty("addressResolver.servers");
+        result = "6.6.6.6,6.6.4.4";
+        finalConfig.getProperty("addressResolver.searchDomains");
+        result = "default.svc.local.cluster";
+      }
+    };
+    AddressResolverOptions aroc = AddressResolverConfig.getAddressResover("test", finalConfig);
+    Assert.assertThat(aroc.getServers(), is(Arrays.asList("6.6.6.6", "6.6.4.4")));
+    Assert.assertThat(aroc.getSearchDomains(),
+        is(Arrays.asList("default.svc.local.cluster")));
+  }
 
   @Test
   public void testGetResover() {

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.