You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2020/04/10 06:51:01 UTC

[servicecomb-java-chassis] 02/02: [SCB-1848] refactor: modify config-kie module to use the new mechanism to intialize client

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

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

commit e2d965b6e7f72e49eb753105aec08abe6767ab54
Author: liubao <bi...@qq.com>
AuthorDate: Thu Apr 9 17:35:12 2020 +0800

    [SCB-1848] refactor: modify config-kie module to use the new mechanism to intialize client
---
 .../config/client/ConfigCenterConfig.java          | 27 ++-----
 .../client/ConfigCenterHttpClientOptionsSPI.java   |  7 ++
 .../kie/client/ConfigKieHttpClientOptionsSPI.java} | 41 ++++++-----
 .../servicecomb/config/kie/client/KieClient.java   | 82 +++++++++-------------
 .../servicecomb/config/kie/client/KieConfig.java   | 47 +++++++++++++
 .../config/kie/client/TestKieClient.java           |  9 +--
 .../servicecomb/config/kie/client/TestKieUtil.java | 18 ++++-
 .../servicecomb/foundation/vertx/VertxConst.java   | 32 +++++++++
 .../vertx/client/http/HttpClientOptionsSPI.java    |  5 ++
 .../foundation/vertx/client/http/HttpClients.java  |  3 +-
 .../client/http/RegistryHttpClientOptionsSPI.java  |  6 ++
 .../config/ServiceRegistryConfig.java              | 12 ----
 .../config/ServiceRegistryConfigBuilder.java       | 11 +--
 .../client/HttpTransportHttpClientOptionsSPI.java  |  7 ++
 14 files changed, 194 insertions(+), 113 deletions(-)

diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterConfig.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterConfig.java
index e71e548..e0ff19a 100644
--- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterConfig.java
+++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterConfig.java
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.deployment.DeploymentProvider;
+import org.apache.servicecomb.foundation.vertx.VertxConst;
 
 import com.google.common.base.Joiner;
 import com.netflix.config.ConcurrentCompositeConfiguration;
@@ -59,18 +60,6 @@ public final class ConfigCenterConfig {
 
   private static final String INSTANCE_TAGS = "instance_description.properties.tags";
 
-  public static final String PROXY_PRE_NAME = "servicecomb.proxy.";
-
-  public static final String PROXY_ENABLE = PROXY_PRE_NAME + "enable";
-
-  public static final String PROXY_HOST = PROXY_PRE_NAME + "host";
-
-  public static final String PROXY_PORT = PROXY_PRE_NAME + "port";
-
-  public static final String PROXY_USERNAME = PROXY_PRE_NAME + "username";
-
-  public static final String PROXY_PASSWD = PROXY_PRE_NAME + "passwd";
-
   public static final String CONNECTION_TIME_OUT = "servicecomb.config.client.timeout.connection";
 
   public static final String EVENT_LOOP_SIZE = "servicecomb.config.client.eventLoopSize";
@@ -87,8 +76,6 @@ public final class ConfigCenterConfig {
 
   private static final int DEFAULT_FIRST_REFRESH_INTERVAL = 0;
 
-  private static final int DEFAULT_TIMEOUT_IN_MS = 30000;
-
   private ConfigCenterConfig() {
   }
 
@@ -96,7 +83,7 @@ public final class ConfigCenterConfig {
     finalConfig = config;
   }
 
-  public ConcurrentCompositeConfiguration getConcurrentCompositeConfiguration() {
+  public static ConcurrentCompositeConfiguration getConcurrentCompositeConfiguration() {
     return finalConfig;
   }
 
@@ -133,23 +120,23 @@ public final class ConfigCenterConfig {
   }
 
   public Boolean isProxyEnable() {
-    return finalConfig.getBoolean(PROXY_ENABLE, false);
+    return finalConfig.getBoolean(VertxConst.PROXY_ENABLE, false);
   }
 
   public String getProxyHost() {
-    return finalConfig.getString(PROXY_HOST, "127.0.0.1");
+    return finalConfig.getString(VertxConst.PROXY_HOST, "127.0.0.1");
   }
 
   public int getProxyPort() {
-    return finalConfig.getInt(PROXY_PORT, 8080);
+    return finalConfig.getInt(VertxConst.PROXY_PORT, 8080);
   }
 
   public String getProxyUsername() {
-    return finalConfig.getString(PROXY_USERNAME, null);
+    return finalConfig.getString(VertxConst.PROXY_USERNAME, null);
   }
 
   public String getProxyPasswd() {
-    return finalConfig.getString(PROXY_PASSWD, null);
+    return finalConfig.getString(VertxConst.PROXY_PASSWD, null);
   }
 
   @SuppressWarnings("unchecked")
diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterHttpClientOptionsSPI.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterHttpClientOptionsSPI.java
index 3b3c4d8..15a2400 100644
--- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterHttpClientOptionsSPI.java
+++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterHttpClientOptionsSPI.java
@@ -21,6 +21,8 @@ import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.deployment.DeploymentProvider;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClientOptionsSPI;
 
+import com.netflix.config.ConcurrentCompositeConfiguration;
+
 import io.vertx.core.VertxOptions;
 import io.vertx.core.http.HttpClientOptions;
 import io.vertx.core.http.HttpVersion;
@@ -49,6 +51,11 @@ public class ConfigCenterHttpClientOptionsSPI implements HttpClientOptionsSPI {
   }
 
   @Override
+  public ConcurrentCompositeConfiguration getConfigReader() {
+    return ConfigCenterConfig.getConcurrentCompositeConfiguration();
+  }
+
+  @Override
   public int getEventLoopPoolSize() {
     return ConfigCenterConfig.INSTANCE.getEventLoopSize();
   }
diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterHttpClientOptionsSPI.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/ConfigKieHttpClientOptionsSPI.java
similarity index 74%
copy from dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterHttpClientOptionsSPI.java
copy to dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/ConfigKieHttpClientOptionsSPI.java
index 3b3c4d8..6921a56 100644
--- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterHttpClientOptionsSPI.java
+++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/ConfigKieHttpClientOptionsSPI.java
@@ -15,18 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.config.client;
+package org.apache.servicecomb.config.kie.client;
 
-import org.apache.servicecomb.deployment.Deployment;
-import org.apache.servicecomb.deployment.DeploymentProvider;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClientOptionsSPI;
 
+import com.netflix.config.ConcurrentCompositeConfiguration;
+
 import io.vertx.core.VertxOptions;
 import io.vertx.core.http.HttpClientOptions;
 import io.vertx.core.http.HttpVersion;
 
-public class ConfigCenterHttpClientOptionsSPI implements HttpClientOptionsSPI {
-  public static final String CLIENT_NAME = "config-center";
+public class ConfigKieHttpClientOptionsSPI implements HttpClientOptionsSPI {
+  public static final String CLIENT_NAME = "config-kie";
 
   @Override
   public String clientName() {
@@ -35,22 +35,27 @@ public class ConfigCenterHttpClientOptionsSPI implements HttpClientOptionsSPI {
 
   @Override
   public int getOrder() {
-    return -100;
+    return -200;
   }
 
   @Override
   public boolean enabled() {
-    return Deployment.getSystemBootStrapInfo(DeploymentProvider.SYSTEM_KEY_CONFIG_CENTER) != null;
+    return KieConfig.INSTANCE.getServerUri() != null;
   }
 
   @Override
   public String getConfigTag() {
-    return "cc.consumer";
+    return "kie.consumer";
+  }
+
+  @Override
+  public ConcurrentCompositeConfiguration getConfigReader() {
+    return KieConfig.getFinalConfig();
   }
 
   @Override
   public int getEventLoopPoolSize() {
-    return ConfigCenterConfig.INSTANCE.getEventLoopSize();
+    return KieConfig.INSTANCE.getEventLoopSize();
   }
 
   @Override
@@ -60,7 +65,7 @@ public class ConfigCenterHttpClientOptionsSPI implements HttpClientOptionsSPI {
 
   @Override
   public int getInstanceCount() {
-    return ConfigCenterConfig.INSTANCE.getVerticalInstanceCount();
+    return KieConfig.INSTANCE.getVerticalInstanceCount();
   }
 
   @Override
@@ -85,12 +90,12 @@ public class ConfigCenterHttpClientOptionsSPI implements HttpClientOptionsSPI {
 
   @Override
   public int getConnectTimeoutInMillis() {
-    return ConfigCenterConfig.INSTANCE.getConnectionTimeout();
+    return KieConfig.INSTANCE.getConnectionTimeOut();
   }
 
   @Override
   public int getIdleTimeoutInSeconds() {
-    return ConfigCenterConfig.INSTANCE.getIdleTimeoutInSeconds();
+    return KieConfig.INSTANCE.getIdleTimeoutInSeconds();
   }
 
   @Override
@@ -140,31 +145,31 @@ public class ConfigCenterHttpClientOptionsSPI implements HttpClientOptionsSPI {
 
   @Override
   public boolean isProxyEnable() {
-    return ConfigCenterConfig.INSTANCE.isProxyEnable();
+    return KieConfig.INSTANCE.isProxyEnable();
   }
 
   @Override
   public String getProxyHost() {
-    return ConfigCenterConfig.INSTANCE.getProxyHost();
+    return KieConfig.INSTANCE.getProxyHost();
   }
 
   @Override
   public int getProxyPort() {
-    return ConfigCenterConfig.INSTANCE.getProxyPort();
+    return KieConfig.INSTANCE.getProxyPort();
   }
 
   @Override
   public String getProxyUsername() {
-    return ConfigCenterConfig.INSTANCE.getProxyUsername();
+    return KieConfig.INSTANCE.getProxyUsername();
   }
 
   @Override
   public String getProxyPassword() {
-    return ConfigCenterConfig.INSTANCE.getProxyPasswd();
+    return KieConfig.INSTANCE.getProxyPasswd();
   }
 
   @Override
   public boolean isSsl() {
-    return ConfigCenterConfig.INSTANCE.getServerUri().get(0).startsWith("https");
+    return KieConfig.INSTANCE.getServerUri() != null && KieConfig.INSTANCE.getServerUri().startsWith("https");
   }
 }
diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
index adcff94..362a90d 100644
--- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
+++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
@@ -17,18 +17,14 @@
 
 package org.apache.servicecomb.config.kie.client;
 
-import io.netty.handler.codec.http.HttpResponseStatus;
-import io.vertx.core.DeploymentOptions;
-import io.vertx.core.Vertx;
-import io.vertx.core.VertxOptions;
-import io.vertx.core.http.HttpClientOptions;
-import io.vertx.core.http.HttpClientRequest;
 import java.io.IOException;
 import java.util.Map;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+
 import org.apache.http.HttpStatus;
 import org.apache.servicecomb.config.kie.archaius.sources.KieConfigurationSourceImpl.UpdateHandler;
 import org.apache.servicecomb.config.kie.model.KVResponse;
@@ -36,15 +32,12 @@ import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
-import org.apache.servicecomb.foundation.vertx.AddressResolverConfig;
-import org.apache.servicecomb.foundation.vertx.VertxUtils;
-import org.apache.servicecomb.foundation.vertx.client.ClientPoolManager;
-import org.apache.servicecomb.foundation.vertx.client.ClientVerticle;
-import org.apache.servicecomb.foundation.vertx.client.http.HttpClientPoolFactory;
-import org.apache.servicecomb.foundation.vertx.client.http.HttpClientWithContext;
+import org.apache.servicecomb.foundation.vertx.client.http.HttpClients;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import io.vertx.core.http.HttpClientRequest;
+
 public class KieClient {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(KieClient.class);
@@ -56,13 +49,13 @@ public class KieClient {
     return thread;
   });
 
-  private static final long TIME_OUT = 10000;
+  private static final long PULL_REQUEST_TIME_OUT_IN_MILLIS = 10000;
 
-  private static AtomicBoolean IS_FIRST_PULL = new AtomicBoolean(true);
+  private static final long LONG_POLLING_REQUEST_TIME_OUT_IN_MILLIS = 60000;
 
-  private static final int LONG_POLLING_WAIT_TIME = 30;
+  private static AtomicBoolean IS_FIRST_PULL = new AtomicBoolean(true);
 
-  private static final int SOCKET_TIMOUT = 50;
+  private static final int LONG_POLLING_WAIT_TIME_IN_SECONDS = 30;
 
   private static final KieConfig KIE_CONFIG = KieConfig.INSTANCE;
 
@@ -74,18 +67,12 @@ public class KieClient {
 
   private final String serviceUri = KIE_CONFIG.getServerUri();
 
-  private ClientPoolManager<HttpClientWithContext> clientMgr;
-
   public KieClient(UpdateHandler updateHandler) {
+    HttpClients.addNewClientPoolManager(new ConfigKieHttpClientOptionsSPI());
     KieWatcher.INSTANCE.setUpdateHandler(updateHandler);
   }
 
   public void refreshKieConfig() {
-    try {
-      deployConfigClient();
-    } catch (InterruptedException e) {
-      throw new IllegalStateException(e);
-    }
     if (enableLongPolling) {
       EXECUTOR.execute(new ConfigRefresh(serviceUri));
     } else {
@@ -94,21 +81,6 @@ public class KieClient {
     }
   }
 
-  private void deployConfigClient() throws InterruptedException {
-    VertxOptions vertxOptions = new VertxOptions();
-    vertxOptions.setAddressResolverOptions(AddressResolverConfig.getAddressResover("kie.consumer",
-        KieConfig.getFinalConfig()));
-    Vertx vertx = VertxUtils.getOrCreateVertxByName("kie", vertxOptions);
-
-    HttpClientOptions httpClientOptions = new HttpClientOptions();
-    httpClientOptions.setKeepAlive(true);
-    httpClientOptions.setIdleTimeout(SOCKET_TIMOUT);
-    clientMgr = new ClientPoolManager<>(vertx, new HttpClientPoolFactory(httpClientOptions));
-
-    DeploymentOptions deployOptions = VertxUtils.createClientDeployOptions(clientMgr, 1);
-    VertxUtils.blockDeploy(vertx, ClientVerticle.class, deployOptions);
-  }
-
   public void destroy() {
     if (EXECUTOR != null) {
       EXECUTOR.shutdown();
@@ -127,29 +99,38 @@ public class KieClient {
     @Override
     public void run() {
       try {
-        refreshConfig();
+        CountDownLatch latch = new CountDownLatch(1);
+        refreshConfig(latch);
+        latch.await();
       } catch (Throwable e) {
         LOGGER.error("client refresh thread exception ", e);
       }
+      if (enableLongPolling) {
+        EXECUTOR.execute(this);
+      }
     }
 
     @SuppressWarnings("deprecation")
-    void refreshConfig() {
+    void refreshConfig(CountDownLatch latch) {
       String path = "/v1/"
           + KieConfig.INSTANCE.getDomainName()
           + "/kie/kv?label=app:"
           + KieConfig.INSTANCE.getAppName();
+
+      long timeout;
       if (enableLongPolling && !IS_FIRST_PULL.get()) {
-        path += "&wait=" + LONG_POLLING_WAIT_TIME + "s";
+        path += "&wait=" + LONG_POLLING_WAIT_TIME_IN_SECONDS + "s";
+        timeout = LONG_POLLING_REQUEST_TIME_OUT_IN_MILLIS;
       } else {
         IS_FIRST_PULL.compareAndSet(true, false);
+        timeout = PULL_REQUEST_TIME_OUT_IN_MILLIS;
       }
       String finalPath = path;
-      clientMgr.findThreadBindClientPool().runOnContext(client -> {
+      HttpClients.getClient(ConfigKieHttpClientOptionsSPI.CLIENT_NAME).runOnContext(client -> {
         IpPort ipPort = NetUtils.parseIpPortFromURI(serviceUri);
         HttpClientRequest request = client
             .get(ipPort.getPort(), ipPort.getHostOrIp(), finalPath, rsp -> {
-              if (rsp.statusCode() == HttpResponseStatus.OK.code()) {
+              if (rsp.statusCode() == HttpStatus.SC_OK) {
                 rsp.bodyHandler(buf -> {
                   try {
                     Map<String, Object> resMap = KieUtil.getConfigByLabel(JsonUtils.OBJ_MAPPER
@@ -163,24 +144,27 @@ public class KieClient {
                         serviceUri,
                         e.getMessage());
                   }
+                  latch.countDown();
                 });
-              } else if (rsp.statusCode() == HttpStatus.SC_NOT_FOUND) {
+              } else if (rsp.statusCode() == HttpStatus.SC_NOT_MODIFIED) {
                 EventManager.post(new ConnSuccEvent());
+                latch.countDown();
               } else {
                 EventManager.post(new ConnFailEvent("fetch config fail"));
-                LOGGER.error("Config update from {} failed. Error message is [{}].",
+                LOGGER.error("Config update from {} failed. Error code is {}, error message is [{}].",
                     serviceUri,
+                    rsp.statusCode(),
                     rsp.statusMessage());
+                latch.countDown();
               }
-              if (enableLongPolling) {
-                EXECUTOR.execute(this);
-              }
-            }).setTimeout(TIME_OUT);
+            }).setTimeout(timeout);
+
         request.exceptionHandler(e -> {
           EventManager.post(new ConnFailEvent("fetch config fail"));
           LOGGER.error("Config update from {} failed. Error message is [{}].",
               serviceUri,
               e.getMessage());
+          latch.countDown();
         });
         request.end();
       });
diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieConfig.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieConfig.java
index e95475f..bc80598 100644
--- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieConfig.java
+++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/client/KieConfig.java
@@ -20,6 +20,8 @@ package org.apache.servicecomb.config.kie.client;
 import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.DEFAULT_SERVICECOMB_ENV;
 import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.SERVICECOMB_ENV;
 
+import org.apache.servicecomb.foundation.vertx.VertxConst;
+
 import com.netflix.config.ConcurrentCompositeConfiguration;
 
 public class KieConfig {
@@ -46,6 +48,14 @@ public class KieConfig {
 
   private static final String INSTANCE_TAGS = "instance_description.properties.tags";
 
+  public static final String CONNECTION_TIME_OUT = "servicecomb.kie.client.timeout.connection";
+
+  public static final String EVENT_LOOP_SIZE = "servicecomb.kie.client.eventLoopSize";
+
+  public static final String VERTICAL_INSTANCE_COUNT = "servicecomb.kie.client.verticalInstanceCount";
+
+  public static final String IDLE_TIMEOUT_IN_SECONDES = "servicecomb.kie.client.idleTimeoutInSeconds";
+
   private static final int DEFAULT_REFRESH_INTERVAL = 3000;
 
   private static final int DEFAULT_FIRST_REFRESH_INTERVAL = 0;
@@ -63,6 +73,22 @@ public class KieConfig {
     KieConfig.finalConfig = finalConfig;
   }
 
+  public int getConnectionTimeOut() {
+    return finalConfig.getInt(CONNECTION_TIME_OUT, 1000);
+  }
+
+  public int getEventLoopSize() {
+    return finalConfig.getInt(EVENT_LOOP_SIZE, 2);
+  }
+
+  public int getVerticalInstanceCount() {
+    return finalConfig.getInt(VERTICAL_INSTANCE_COUNT, 1);
+  }
+
+  public int getIdleTimeoutInSeconds() {
+    return finalConfig.getInt(IDLE_TIMEOUT_IN_SECONDES, 60);
+  }
+
   public String getVersion() {
     return finalConfig.getString(SERVICE_VERSION);
   }
@@ -102,4 +128,25 @@ public class KieConfig {
   public boolean enableLongPolling() {
     return finalConfig.getBoolean(ENABLE_LONG_POLLING, DEFAULT_ENABLE_LONG_POLLING);
   }
+
+  public Boolean isProxyEnable() {
+    return finalConfig.getBoolean(VertxConst.PROXY_ENABLE, false);
+  }
+
+  public String getProxyHost() {
+    return finalConfig.getString(VertxConst.PROXY_HOST, "127.0.0.1");
+  }
+
+  public int getProxyPort() {
+    return finalConfig.getInt(VertxConst.PROXY_PORT, 8080);
+  }
+
+  public String getProxyUsername() {
+    return finalConfig.getString(VertxConst.PROXY_USERNAME, null);
+  }
+
+  public String getProxyPasswd() {
+    return finalConfig.getString(VertxConst.PROXY_PASSWD, null);
+  }
+
 }
diff --git a/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieClient.java b/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieClient.java
index 9a5d81f..0a61f75 100644
--- a/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieClient.java
+++ b/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieClient.java
@@ -178,14 +178,9 @@ public class TestKieClient {
         handler.run(httpClient);
       }
     };
-    new Expectations() {
-      {
-        clientMgr.findThreadBindClientPool();
-        result = httpClientWithContext;
-      }
-    };
+
     KieClient kie = new KieClient(updateHandler);
-    Deencapsulation.setField(kie, "clientMgr", clientMgr);
+
     ConfigRefresh refresh = kie.new ConfigRefresh("http://configcentertest:30103");
     refresh.run();
     Assert.assertEquals("Fail event trigger", map.get("result"));
diff --git a/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieUtil.java b/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieUtil.java
index f5acc1b..a27cf31 100644
--- a/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieUtil.java
+++ b/dynamic-config/config-kie/src/test/java/org/apache/servicecomb/config/kie/client/TestKieUtil.java
@@ -1,9 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.apache.servicecomb.config.kie.client;
 
 import java.util.Map;
 
 import org.apache.servicecomb.config.kie.model.KVDoc;
-import org.apache.servicecomb.config.kie.model.ValueType;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxConst.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxConst.java
new file mode 100644
index 0000000..1ee2afa
--- /dev/null
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxConst.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.foundation.vertx;
+
+public final class VertxConst {
+  public static final String PROXY_PRE_NAME = "servicecomb.proxy.";
+
+  public static final String PROXY_ENABLE = PROXY_PRE_NAME + "enable";
+
+  public static final String PROXY_HOST = PROXY_PRE_NAME + "host";
+
+  public static final String PROXY_PORT = PROXY_PRE_NAME + "port";
+
+  public static final String PROXY_USERNAME = PROXY_PRE_NAME + "username";
+
+  public static final String PROXY_PASSWD = PROXY_PRE_NAME + "passwd";
+}
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientOptionsSPI.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientOptionsSPI.java
index dc942ae..164e4f4 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientOptionsSPI.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientOptionsSPI.java
@@ -20,6 +20,8 @@ package org.apache.servicecomb.foundation.vertx.client.http;
 import org.apache.servicecomb.foundation.common.encrypt.Encryptions;
 import org.apache.servicecomb.foundation.vertx.VertxTLSBuilder;
 
+import com.netflix.config.ConcurrentCompositeConfiguration;
+
 import io.vertx.core.http.HttpClientOptions;
 import io.vertx.core.http.HttpVersion;
 import io.vertx.core.net.ProxyOptions;
@@ -41,6 +43,9 @@ public interface HttpClientOptionsSPI {
   *  other clients configuration or read the common configuration. */
   String getConfigTag();
 
+  /* for config modules, the configuration is not ready, need set up config reader */
+  ConcurrentCompositeConfiguration getConfigReader();
+
   /*****************  vert.x common settings ***************************/
   int getEventLoopPoolSize();
 
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClients.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClients.java
index 3db635d..74c3593 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClients.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClients.java
@@ -86,7 +86,8 @@ public class HttpClients {
       vertx = SharedVertxFactory.getSharedVertx();
     } else {
       VertxOptions vertxOptions = new VertxOptions()
-          .setAddressResolverOptions(AddressResolverConfig.getAddressResover(option.getConfigTag()))
+          .setAddressResolverOptions(AddressResolverConfig
+              .getAddressResover(option.getConfigTag(), option.getConfigReader()))
           .setEventLoopPoolSize(option.getEventLoopPoolSize());
 
       // Maybe we can deploy only one vert.x for the application. However this has did it like this.
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RegistryHttpClientOptionsSPI.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RegistryHttpClientOptionsSPI.java
index b8869e0..b465252 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RegistryHttpClientOptionsSPI.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RegistryHttpClientOptionsSPI.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.serviceregistry.client.http;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClientOptionsSPI;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
 
+import com.netflix.config.ConcurrentCompositeConfiguration;
 import com.netflix.config.DynamicPropertyFactory;
 
 import io.vertx.core.VertxOptions;
@@ -52,6 +53,11 @@ public class RegistryHttpClientOptionsSPI implements HttpClientOptionsSPI {
   }
 
   @Override
+  public ConcurrentCompositeConfiguration getConfigReader() {
+    return null;
+  }
+
+  @Override
   public int getEventLoopPoolSize() {
     return DynamicPropertyFactory.getInstance()
         .getIntProperty(ServiceRegistryConfig.EVENT_LOOP_POOL_SIZE, 4).get();
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
index af1e5d7..a926b27 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
@@ -60,18 +60,6 @@ public final class ServiceRegistryConfig {
 
   public static final String NO_DOMAIN = "default";
 
-  public static final String PROXY_PRE_NAME = "servicecomb.proxy.";
-
-  public static final String PROXY_ENABLE = PROXY_PRE_NAME + "enable";
-
-  public static final String PROXY_HOST = PROXY_PRE_NAME + "host";
-
-  public static final String PROXY_PORT = PROXY_PRE_NAME + "port";
-
-  public static final String PROXY_USERNAME = PROXY_PRE_NAME + "username";
-
-  public static final String PROXY_PASSWD = PROXY_PRE_NAME + "passwd";
-
   public static final String SSL_KEY = "sc.consumer";
 
   public static final String PROXY_KEY = "sc.consumer";
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
index edb615f..e8c31cc 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
@@ -28,6 +28,7 @@ import org.apache.servicecomb.foundation.auth.AuthHeaderProvider;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.foundation.vertx.VertxConst;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -268,25 +269,25 @@ class ServiceRegistryConfigBuilder {
   }
 
   public Boolean isProxyEnable() {
-    String enable = getProperty("false", ServiceRegistryConfig.PROXY_ENABLE);
+    String enable = getProperty("false", VertxConst.PROXY_ENABLE);
     return Boolean.parseBoolean(enable);
   }
 
   public String getProxyHost() {
-    return getProperty("127.0.0.1", ServiceRegistryConfig.PROXY_HOST);
+    return getProperty("127.0.0.1", VertxConst.PROXY_HOST);
   }
 
   public int getProxyPort() {
-    String port = getProperty("8080", ServiceRegistryConfig.PROXY_PORT);
+    String port = getProperty("8080", VertxConst.PROXY_PORT);
     return Integer.parseInt(port);
   }
 
   public String getProxyUsername() {
-    return getProperty(null, ServiceRegistryConfig.PROXY_USERNAME);
+    return getProperty(null, VertxConst.PROXY_USERNAME);
   }
 
   public String getProxyPasswd() {
-    return getProperty(null, ServiceRegistryConfig.PROXY_PASSWD);
+    return getProperty(null, VertxConst.PROXY_PASSWD);
   }
 
   public List<AuthHeaderProvider> getAuthHeaderProviders() {
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/HttpTransportHttpClientOptionsSPI.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/HttpTransportHttpClientOptionsSPI.java
index 619bb03..3bee8df 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/HttpTransportHttpClientOptionsSPI.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/HttpTransportHttpClientOptionsSPI.java
@@ -19,6 +19,8 @@ package org.apache.servicecomb.transport.rest.client;
 
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClientOptionsSPI;
 
+import com.netflix.config.ConcurrentCompositeConfiguration;
+
 import io.vertx.core.VertxOptions;
 import io.vertx.core.http.HttpClientOptions;
 import io.vertx.core.http.HttpVersion;
@@ -49,6 +51,11 @@ public class HttpTransportHttpClientOptionsSPI implements HttpClientOptionsSPI {
   }
 
   @Override
+  public ConcurrentCompositeConfiguration getConfigReader() {
+    return null;
+  }
+
+  @Override
   public int getEventLoopPoolSize() {
     // not reading this, using shared transport vert.x
     return -1;