diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigServiceLocator.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigServiceLocator.java index 5356ebc1196714891390e7d880c3abb2183a3453..a980400b12f7921ae46ba18bf59fd18c310d5c96 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigServiceLocator.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigServiceLocator.java @@ -1,6 +1,7 @@ package com.ctrip.framework.apollo.internals; import com.google.common.base.Joiner; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.escape.Escaper; @@ -23,7 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Named; -import org.unidal.net.Networks; import java.lang.reflect.Type; import java.util.List; @@ -138,18 +138,21 @@ public class ConfigServiceLocator implements Initializable { } } - throw new RuntimeException("Get config services failed", exception); + throw new RuntimeException( + String.format("Get config services failed from %s", url), exception); } private String assembleMetaServiceUrl() { String domainName = m_configUtil.getMetaServerDomainName(); String appId = m_configUtil.getAppId(); - String localIp = Networks.forIp().getLocalHostAddress(); + String localIp = m_configUtil.getLocalIp(); Escaper escaper = UrlEscapers.urlPathSegmentEscaper(); Map queryParams = Maps.newHashMap(); queryParams.put("appId", escaper.escape(appId)); - queryParams.put("ip", escaper.escape(localIp)); + if (!Strings.isNullOrEmpty(localIp)) { + queryParams.put("ip", escaper.escape(localIp)); + } return domainName + "/services/config?" + MAP_JOINER.join(queryParams); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java index 0d128bb31dbb65fb20406da2fd99787dbdc20088..ec52c33feb7853eac332a713f4122670a19e8592 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java @@ -181,7 +181,8 @@ public class RemoteConfigRepository extends AbstractConfigRepository { ApolloConfig result = response.getBody(); - Cat.logEvent("Apollo.Client.ConfigLoaded." + result.getNamespaceName(), result.getReleaseKey()); + Cat.logEvent("Apollo.Client.ConfigLoaded." + result.getNamespaceName(), + result.getReleaseKey()); logger.debug("Loaded config for {}: {}", m_namespace, result); return result; @@ -227,6 +228,11 @@ public class RemoteConfigRepository extends AbstractConfigRepository { queryParams.put("dataCenter", escaper.escape(dataCenter)); } + String localIp = m_configUtil.getLocalIp(); + if (!Strings.isNullOrEmpty(localIp)) { + queryParams.put("ip", escaper.escape(localIp)); + } + String pathExpanded = String.format(path, pathParams.toArray()); if (!queryParams.isEmpty()) { @@ -329,6 +335,10 @@ public class RemoteConfigRepository extends AbstractConfigRepository { if (!Strings.isNullOrEmpty(dataCenter)) { queryParams.put("dataCenter", escaper.escape(dataCenter)); } + String localIp = m_configUtil.getLocalIp(); + if (!Strings.isNullOrEmpty(localIp)) { + queryParams.put("ip", escaper.escape(localIp)); + } String params = MAP_JOINER.join(queryParams); if (!uri.endsWith("/")) { diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java index c19ee58f3c3eb7c0ecc7a6e9b31b803674ef71e7..6c0e9ebba50fca48258473ad08ce17bb9cea50ed 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java @@ -9,6 +9,7 @@ import com.ctrip.framework.apollo.core.enums.EnvUtils; import com.ctrip.framework.foundation.Foundation; import org.unidal.lookup.annotation.Named; +import org.unidal.net.Networks; import java.util.concurrent.TimeUnit; @@ -79,6 +80,10 @@ public class ConfigUtil { return env; } + public String getLocalIp() { + return Networks.forIp().getLocalHostAddress(); + } + public String getMetaServerDomainName() { return MetaDomainConsts.getDomain(getApolloEnv()); } diff --git a/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/ConfigController.java b/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/ConfigController.java index d682876181d5b6b393707718bf9cedf539bacc60..b1f8a91841e5102510b85db861e2755b94e21b7a 100644 --- a/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/ConfigController.java +++ b/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/ConfigController.java @@ -48,20 +48,12 @@ public class ConfigController { }.getType(); private static final Joiner STRING_JOINER = Joiner.on(ConfigConsts.CLUSTER_NAMESPACE_SEPARATOR); - @RequestMapping(value = "/{appId}/{clusterName}", method = RequestMethod.GET) - public ApolloConfig queryConfig(@PathVariable String appId, @PathVariable String clusterName, - @RequestParam(value = "dataCenter", required = false) String dataCenter, - @RequestParam(value = "releaseKey", defaultValue = "-1") String clientSideReleaseKey, - HttpServletResponse response) throws IOException { - return this.queryConfig(appId, clusterName, ConfigConsts.NAMESPACE_DEFAULT, dataCenter, - clientSideReleaseKey, response); - } - @RequestMapping(value = "/{appId}/{clusterName}/{namespace}", method = RequestMethod.GET) public ApolloConfig queryConfig(@PathVariable String appId, @PathVariable String clusterName, @PathVariable String namespace, @RequestParam(value = "dataCenter", required = false) String dataCenter, @RequestParam(value = "releaseKey", defaultValue = "-1") String clientSideReleaseKey, + @RequestParam(value = "ip", required = false) String clientIp, HttpServletResponse response) throws IOException { List releases = Lists.newLinkedList(); @@ -140,7 +132,7 @@ public class ConfigController { } //try to load via data center - if (!Objects.isNull(dataCenter) && !Objects.equals(dataCenter, clusterName)) { + if (!Strings.isNullOrEmpty(dataCenter) && !Objects.equals(dataCenter, clusterName)) { Release dataCenterRelease = configService.findRelease(appId, dataCenter, namespace); if (!Objects.isNull(dataCenterRelease)) { diff --git a/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/NotificationController.java b/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/NotificationController.java index 5514aead9af93a97af14bfa23df2b56b4439b371..2b7341960b266854370ac06e6935ce210870660b 100644 --- a/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/NotificationController.java +++ b/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/NotificationController.java @@ -60,7 +60,8 @@ public class NotificationController implements MessageListener { @RequestParam(value = "appId") String appId, @RequestParam(value = "cluster") String cluster, @RequestParam(value = "namespace", defaultValue = ConfigConsts.NAMESPACE_DEFAULT) String namespace, - @RequestParam(value = "dataCenter", required = false) String dataCenter) { + @RequestParam(value = "dataCenter", required = false) String dataCenter, + @RequestParam(value = "ip", required = false) String clientIp) { Set watchedKeys = assembleWatchKeys(appId, cluster, namespace, dataCenter); //Listen on more namespaces, since it's not the default namespace @@ -128,7 +129,7 @@ public class NotificationController implements MessageListener { } //watch data center config change - if (!Objects.isNull(dataCenter) && !Objects.equals(dataCenter, clusterName)) { + if (!Strings.isNullOrEmpty(dataCenter) && !Objects.equals(dataCenter, clusterName)) { watchedKeys.add(assembleKey(appId, dataCenter, namespace)); } diff --git a/apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/controller/ServiceController.java b/apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/controller/ServiceController.java index d5a762d8a0f1713c7191fc2fc7178ce37a316ab2..83d4bfbbed83d31d0798da8c5b50702ca9009119 100644 --- a/apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/controller/ServiceController.java +++ b/apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/controller/ServiceController.java @@ -42,7 +42,7 @@ public class ServiceController { @RequestMapping("/config") public List getConfigService( @RequestParam(value = "appId", defaultValue = "") String appId, - @RequestParam(value = "ip", defaultValue = "") String clientIp) { + @RequestParam(value = "ip", required = false) String clientIp) { List instances = discoveryService.getConfigServiceInstances(); List result = instances.stream().map(new Function() { diff --git a/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/ConfigControllerTest.java b/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/ConfigControllerTest.java index cc919dc643652edded10f499cf9622db6d322c70..281b3032ada92bf2d0c34171d721ce62d57bb187 100644 --- a/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/ConfigControllerTest.java +++ b/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/ConfigControllerTest.java @@ -49,6 +49,7 @@ public class ConfigControllerTest { private String defaultNamespaceName; private String somePublicNamespaceName; private String someDataCenter; + private String someClientIp; @Mock private Release someRelease; @Mock @@ -66,6 +67,7 @@ public class ConfigControllerTest { defaultNamespaceName = ConfigConsts.NAMESPACE_DEFAULT; somePublicNamespaceName = "somePublicNamespace"; someDataCenter = "someDC"; + someClientIp = "someClientIp"; String someValidConfiguration = "{\"apollo.bar\": \"foo\"}"; String somePublicConfiguration = "{\"apollo.public.bar\": \"foo\"}"; @@ -85,8 +87,8 @@ public class ConfigControllerTest { when(someRelease.getReleaseKey()).thenReturn(someServerSideNewReleaseKey); ApolloConfig result = configController.queryConfig(someAppId, someClusterName, - defaultNamespaceName, someDataCenter, someClientSideReleaseKey, - someResponse); + defaultNamespaceName, someDataCenter, someClientSideReleaseKey, + someClientIp, someResponse); verify(configService, times(1)).findRelease(someAppId, someClusterName, defaultNamespaceName); assertEquals(someAppId, result.getAppId()); @@ -106,7 +108,7 @@ public class ConfigControllerTest { ApolloConfig result = configController.queryConfig(someAppId, someClusterName, defaultNamespaceName, someDataCenter, someClientSideReleaseKey, - someResponse); + someClientIp, someResponse); assertNull(result); verify(someResponse, times(1)).sendError(eq(HttpServletResponse.SC_NOT_FOUND), anyString()); @@ -125,7 +127,7 @@ public class ConfigControllerTest { ApolloConfig result = configController.queryConfig(someAppId, someClusterName, defaultNamespaceName, - someDataCenter, String.valueOf(someClientSideReleaseKey), someResponse); + someDataCenter, String.valueOf(someClientSideReleaseKey), someClientIp, someResponse); assertNull(result); verify(someResponse, times(1)).setStatus(HttpServletResponse.SC_NOT_MODIFIED); @@ -144,7 +146,7 @@ public class ConfigControllerTest { ApolloConfig result = configController.queryConfig(someAppId, defaultClusterName, defaultNamespaceName, someDataCenter, someClientSideReleaseKey, - someResponse); + someClientIp, someResponse); verify(configService, times(1)).findRelease(someAppId, someDataCenter, defaultNamespaceName); assertEquals(someAppId, result.getAppId()); @@ -168,10 +170,11 @@ public class ConfigControllerTest { ApolloConfig result = configController.queryConfig(someAppId, defaultClusterName, defaultNamespaceName, someDataCenter, someClientSideReleaseKey, - someResponse); + someClientIp, someResponse); verify(configService, times(1)).findRelease(someAppId, someDataCenter, defaultNamespaceName); - verify(configService, times(1)).findRelease(someAppId, defaultClusterName, defaultNamespaceName); + verify(configService, times(1)) + .findRelease(someAppId, defaultClusterName, defaultNamespaceName); assertEquals(someAppId, result.getAppId()); assertEquals(defaultClusterName, result.getCluster()); assertEquals(defaultNamespaceName, result.getNamespaceName()); @@ -198,7 +201,7 @@ public class ConfigControllerTest { ApolloConfig result = configController .queryConfig(someAppId, someClusterName, someAppOwnNamespaceName, someDataCenter, - someClientSideReleaseKey, someResponse); + someClientSideReleaseKey, someClientIp, someResponse); assertEquals(someServerSideReleaseKey, result.getReleaseKey()); assertEquals(someAppId, result.getAppId()); @@ -227,7 +230,7 @@ public class ConfigControllerTest { ApolloConfig result = configController .queryConfig(someAppId, someClusterName, somePublicNamespaceName, someDataCenter, - someClientSideReleaseKey, someResponse); + someClientSideReleaseKey, someClientIp, someResponse); assertEquals(someServerSideReleaseKey, result.getReleaseKey()); assertEquals(someAppId, result.getAppId()); @@ -259,7 +262,7 @@ public class ConfigControllerTest { ApolloConfig result = configController .queryConfig(someAppId, someClusterName, somePublicNamespaceName, someDataCenter, - someClientSideReleaseKey, someResponse); + someClientSideReleaseKey, someClientIp, someResponse); assertEquals(someServerSideReleaseKey, result.getReleaseKey()); assertEquals(someAppId, result.getAppId()); @@ -294,7 +297,7 @@ public class ConfigControllerTest { ApolloConfig result = configController .queryConfig(someAppId, someClusterName, somePublicNamespaceName, someDataCenter, - someAppSideReleaseKey, someResponse); + someAppSideReleaseKey, someClientIp, someResponse); assertEquals(Joiner.on(ConfigConsts.CLUSTER_NAMESPACE_SEPARATOR) .join(someAppSideReleaseKey, somePublicAppSideReleaseKey), diff --git a/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/NotificationControllerTest.java b/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/NotificationControllerTest.java index 3f1792da850355a7bba89cd958f1d8b07e15635d..4437c379ca2390520aea06f30a81586d598c8cc4 100644 --- a/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/NotificationControllerTest.java +++ b/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/NotificationControllerTest.java @@ -39,6 +39,7 @@ public class NotificationControllerTest { private String defaultNamespace; private String somePublicNamespace; private String someDataCenter; + private String someClientIp; @Mock private AppNamespaceService appNamespaceService; @Mock @@ -58,6 +59,7 @@ public class NotificationControllerTest { defaultNamespace = ConfigConsts.NAMESPACE_DEFAULT; somePublicNamespace = "somePublicNamespace"; someDataCenter = "someDC"; + someClientIp = "someClientIp"; deferredResults = (Multimap>>) ReflectionTestUtils @@ -68,7 +70,7 @@ public class NotificationControllerTest { public void testPollNotificationWithDefaultNamespace() throws Exception { DeferredResult> deferredResult = controller - .pollNotification(someAppId, someCluster, defaultNamespace, someDataCenter); + .pollNotification(someAppId, someCluster, defaultNamespace, someDataCenter, someClientIp); List clusters = Lists.newArrayList(someCluster, someDataCenter, ConfigConsts.CLUSTER_NAME_DEFAULT); @@ -88,7 +90,7 @@ public class NotificationControllerTest { throws Exception { DeferredResult> deferredResult = controller - .pollNotification(someAppId, defaultCluster, defaultNamespace, someDataCenter); + .pollNotification(someAppId, defaultCluster, defaultNamespace, someDataCenter, someClientIp); List clusters = Lists.newArrayList(someDataCenter, defaultCluster); @@ -108,7 +110,7 @@ public class NotificationControllerTest { throws Exception { DeferredResult> deferredResult = controller - .pollNotification(someAppId, defaultCluster, defaultNamespace, null); + .pollNotification(someAppId, defaultCluster, defaultNamespace, null, someClientIp); List clusters = Lists.newArrayList(defaultCluster); @@ -135,7 +137,7 @@ public class NotificationControllerTest { DeferredResult> deferredResult = controller - .pollNotification(someAppId, someCluster, somePublicNamespace, someDataCenter); + .pollNotification(someAppId, someCluster, somePublicNamespace, someDataCenter, someClientIp); List clusters = Lists.newArrayList(someCluster, someDataCenter, ConfigConsts.CLUSTER_NAME_DEFAULT); @@ -161,7 +163,7 @@ public class NotificationControllerTest { public void testPollNotificationWithDefaultNamespaceAndHandleMessage() throws Exception { DeferredResult> deferredResult = controller - .pollNotification(someAppId, someCluster, defaultNamespace, someDataCenter); + .pollNotification(someAppId, someCluster, defaultNamespace, someDataCenter, someClientIp); String key = Joiner.on(ConfigConsts.CLUSTER_NAMESPACE_SEPARATOR) @@ -188,7 +190,7 @@ public class NotificationControllerTest { DeferredResult> deferredResult = controller - .pollNotification(someAppId, someCluster, somePublicNamespace, someDataCenter); + .pollNotification(someAppId, someCluster, somePublicNamespace, someDataCenter, someClientIp); String key = Joiner.on(ConfigConsts.CLUSTER_NAMESPACE_SEPARATOR) diff --git a/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/integration/ConfigControllerIntegrationTest.java b/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/integration/ConfigControllerIntegrationTest.java index b59cc0fd516c4bacdf8e230d3d270747a735cbb7..369974ff2739fa6d61256b54b1fa0a1662355859 100644 --- a/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/integration/ConfigControllerIntegrationTest.java +++ b/apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/integration/ConfigControllerIntegrationTest.java @@ -38,8 +38,8 @@ public class ConfigControllerIntegrationTest extends AbstractBaseIntegrationTest @Sql(scripts = "/integration-test/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testQueryConfigWithDefaultClusterAndDefaultNamespaceOK() throws Exception { ResponseEntity response = restTemplate - .getForEntity("{baseurl}/configs/{appId}/{clusterName}", ApolloConfig.class, - getHostUrl(), someAppId, ConfigConsts.CLUSTER_NAME_DEFAULT); + .getForEntity("{baseurl}/configs/{appId}/{clusterName}/{namespace}", ApolloConfig.class, + getHostUrl(), someAppId, ConfigConsts.CLUSTER_NAME_DEFAULT, ConfigConsts.NAMESPACE_DEFAULT); ApolloConfig result = response.getBody(); assertEquals(HttpStatus.OK, response.getStatusCode());