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 <jeho0...@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 ningji...@apache.org.